blob: 3d0d0c25723c53a98afe681ee96f836ad9eff8de [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
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +0000259// OpenGL ES 2.0 functions
260
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000261void __stdcall glActiveTexture(GLenum texture)
262{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000263 EVENT("(GLenum texture = 0x%X)", texture);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000264
265 try
266 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000267 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000268
269 if (context)
270 {
daniel@transgaming.com3f74c7a2011-05-11 15:36:51 +0000271 if (texture < GL_TEXTURE0 || texture > GL_TEXTURE0 + context->getMaximumCombinedTextureImageUnits() - 1)
272 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000273 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com3f74c7a2011-05-11 15:36:51 +0000274 }
275
daniel@transgaming.com428d1582010-05-04 03:35:25 +0000276 context->setActiveSampler(texture - GL_TEXTURE0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000277 }
278 }
279 catch(std::bad_alloc&)
280 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000281 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000282 }
283}
284
285void __stdcall glAttachShader(GLuint program, GLuint shader)
286{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000287 EVENT("(GLuint program = %d, GLuint shader = %d)", program, shader);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000288
289 try
290 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000291 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000292
293 if (context)
294 {
295 gl::Program *programObject = context->getProgram(program);
296 gl::Shader *shaderObject = context->getShader(shader);
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +0000297
daniel@transgaming.come9d6ed02010-04-13 03:26:23 +0000298 if (!programObject)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000299 {
daniel@transgaming.come9d6ed02010-04-13 03:26:23 +0000300 if (context->getShader(program))
301 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000302 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.come9d6ed02010-04-13 03:26:23 +0000303 }
304 else
305 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000306 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.come9d6ed02010-04-13 03:26:23 +0000307 }
308 }
309
310 if (!shaderObject)
311 {
312 if (context->getProgram(shader))
313 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000314 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.come9d6ed02010-04-13 03:26:23 +0000315 }
316 else
317 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000318 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.come9d6ed02010-04-13 03:26:23 +0000319 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000320 }
321
322 if (!programObject->attachShader(shaderObject))
323 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000324 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000325 }
326 }
327 }
328 catch(std::bad_alloc&)
329 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000330 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000331 }
332}
333
daniel@transgaming.com86bdb822012-01-20 18:24:39 +0000334void __stdcall glBeginQueryEXT(GLenum target, GLuint id)
335{
336 EVENT("(GLenum target = 0x%X, GLuint %d)", target, id);
337
338 try
339 {
340 switch (target)
341 {
342 case GL_ANY_SAMPLES_PASSED_EXT:
343 case GL_ANY_SAMPLES_PASSED_CONSERVATIVE_EXT:
344 break;
345 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000346 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +0000347 }
348
349 if (id == 0)
350 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000351 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +0000352 }
353
354 gl::Context *context = gl::getNonLostContext();
355
356 if (context)
357 {
358 context->beginQuery(target, id);
359 }
360 }
361 catch(std::bad_alloc&)
362 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000363 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +0000364 }
365}
366
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +0000367void __stdcall glBindAttribLocation(GLuint program, GLuint index, const GLchar* name)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000368{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000369 EVENT("(GLuint program = %d, GLuint index = %d, const GLchar* name = 0x%0.8p)", program, index, name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000370
371 try
372 {
373 if (index >= gl::MAX_VERTEX_ATTRIBS)
374 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000375 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000376 }
377
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000378 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000379
380 if (context)
381 {
382 gl::Program *programObject = context->getProgram(program);
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +0000383
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000384 if (!programObject)
385 {
daniel@transgaming.com98079832010-04-13 03:26:29 +0000386 if (context->getShader(program))
387 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000388 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com98079832010-04-13 03:26:29 +0000389 }
390 else
391 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000392 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com98079832010-04-13 03:26:29 +0000393 }
394 }
395
396 if (strncmp(name, "gl_", 3) == 0)
397 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000398 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000399 }
400
401 programObject->bindAttributeLocation(index, name);
402 }
403 }
404 catch(std::bad_alloc&)
405 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000406 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000407 }
408}
409
410void __stdcall glBindBuffer(GLenum target, GLuint buffer)
411{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000412 EVENT("(GLenum target = 0x%X, GLuint buffer = %d)", target, buffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000413
414 try
415 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000416 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000417
418 if (context)
419 {
420 switch (target)
421 {
422 case GL_ARRAY_BUFFER:
423 context->bindArrayBuffer(buffer);
424 return;
425 case GL_ELEMENT_ARRAY_BUFFER:
426 context->bindElementArrayBuffer(buffer);
427 return;
428 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000429 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000430 }
431 }
432 }
433 catch(std::bad_alloc&)
434 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000435 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000436 }
437}
438
439void __stdcall glBindFramebuffer(GLenum target, GLuint framebuffer)
440{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000441 EVENT("(GLenum target = 0x%X, GLuint framebuffer = %d)", target, framebuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000442
443 try
444 {
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +0000445 if (target != GL_FRAMEBUFFER && target != GL_DRAW_FRAMEBUFFER_ANGLE && target != GL_READ_FRAMEBUFFER_ANGLE)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000446 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000447 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000448 }
449
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000450 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000451
452 if (context)
453 {
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +0000454 if (target == GL_READ_FRAMEBUFFER_ANGLE || target == GL_FRAMEBUFFER)
455 {
456 context->bindReadFramebuffer(framebuffer);
457 }
458
459 if (target == GL_DRAW_FRAMEBUFFER_ANGLE || target == GL_FRAMEBUFFER)
460 {
461 context->bindDrawFramebuffer(framebuffer);
462 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000463 }
464 }
465 catch(std::bad_alloc&)
466 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000467 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000468 }
469}
470
471void __stdcall glBindRenderbuffer(GLenum target, GLuint renderbuffer)
472{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000473 EVENT("(GLenum target = 0x%X, GLuint renderbuffer = %d)", target, renderbuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000474
475 try
476 {
477 if (target != GL_RENDERBUFFER)
478 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000479 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000480 }
481
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000482 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000483
484 if (context)
485 {
486 context->bindRenderbuffer(renderbuffer);
487 }
488 }
489 catch(std::bad_alloc&)
490 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000491 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000492 }
493}
494
495void __stdcall glBindTexture(GLenum target, GLuint texture)
496{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000497 EVENT("(GLenum target = 0x%X, GLuint texture = %d)", target, texture);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000498
499 try
500 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000501 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000502
503 if (context)
504 {
505 gl::Texture *textureObject = context->getTexture(texture);
506
507 if (textureObject && textureObject->getTarget() != target && texture != 0)
508 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000509 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000510 }
511
512 switch (target)
513 {
514 case GL_TEXTURE_2D:
515 context->bindTexture2D(texture);
516 return;
517 case GL_TEXTURE_CUBE_MAP:
518 context->bindTextureCubeMap(texture);
519 return;
520 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000521 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000522 }
523 }
524 }
525 catch(std::bad_alloc&)
526 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000527 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000528 }
529}
530
531void __stdcall glBlendColor(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha)
532{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000533 EVENT("(GLclampf red = %f, GLclampf green = %f, GLclampf blue = %f, GLclampf alpha = %f)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +0000534 red, green, blue, alpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000535
536 try
537 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000538 gl::Context* context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000539
540 if (context)
541 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +0000542 context->setBlendColor(gl::clamp01(red), gl::clamp01(green), gl::clamp01(blue), gl::clamp01(alpha));
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000543 }
544 }
545 catch(std::bad_alloc&)
546 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000547 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000548 }
549}
550
551void __stdcall glBlendEquation(GLenum mode)
552{
553 glBlendEquationSeparate(mode, mode);
554}
555
556void __stdcall glBlendEquationSeparate(GLenum modeRGB, GLenum modeAlpha)
557{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000558 EVENT("(GLenum modeRGB = 0x%X, GLenum modeAlpha = 0x%X)", modeRGB, modeAlpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000559
560 try
561 {
shannon.woods%transgaming.com@gtempaccount.com00b6a0e2013-04-13 03:38:00 +0000562 gl::Context *context = gl::getNonLostContext();
563
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000564 switch (modeRGB)
565 {
566 case GL_FUNC_ADD:
567 case GL_FUNC_SUBTRACT:
568 case GL_FUNC_REVERSE_SUBTRACT:
569 break;
shannon.woods%transgaming.com@gtempaccount.com00b6a0e2013-04-13 03:38:00 +0000570
571 case GL_MIN:
572 case GL_MAX:
573 if (context && context->getClientVersion() < 3)
574 {
575 return gl::error(GL_INVALID_ENUM);
576 }
577 break;
578
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000579 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000580 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000581 }
582
583 switch (modeAlpha)
584 {
585 case GL_FUNC_ADD:
586 case GL_FUNC_SUBTRACT:
587 case GL_FUNC_REVERSE_SUBTRACT:
588 break;
shannon.woods%transgaming.com@gtempaccount.com00b6a0e2013-04-13 03:38:00 +0000589
590 case GL_MIN:
591 case GL_MAX:
592 if (context && context->getClientVersion() < 3)
593 {
594 return gl::error(GL_INVALID_ENUM);
595 }
596 break;
597
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000598 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000599 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000600 }
601
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000602 if (context)
603 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +0000604 context->setBlendEquation(modeRGB, modeAlpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000605 }
606 }
607 catch(std::bad_alloc&)
608 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000609 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000610 }
611}
612
613void __stdcall glBlendFunc(GLenum sfactor, GLenum dfactor)
614{
615 glBlendFuncSeparate(sfactor, dfactor, sfactor, dfactor);
616}
617
618void __stdcall glBlendFuncSeparate(GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha)
619{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000620 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 +0000621 srcRGB, dstRGB, srcAlpha, dstAlpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000622
623 try
624 {
625 switch (srcRGB)
626 {
627 case GL_ZERO:
628 case GL_ONE:
629 case GL_SRC_COLOR:
630 case GL_ONE_MINUS_SRC_COLOR:
631 case GL_DST_COLOR:
632 case GL_ONE_MINUS_DST_COLOR:
633 case GL_SRC_ALPHA:
634 case GL_ONE_MINUS_SRC_ALPHA:
635 case GL_DST_ALPHA:
636 case GL_ONE_MINUS_DST_ALPHA:
637 case GL_CONSTANT_COLOR:
638 case GL_ONE_MINUS_CONSTANT_COLOR:
639 case GL_CONSTANT_ALPHA:
640 case GL_ONE_MINUS_CONSTANT_ALPHA:
641 case GL_SRC_ALPHA_SATURATE:
642 break;
643 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000644 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000645 }
646
647 switch (dstRGB)
648 {
649 case GL_ZERO:
650 case GL_ONE:
651 case GL_SRC_COLOR:
652 case GL_ONE_MINUS_SRC_COLOR:
653 case GL_DST_COLOR:
654 case GL_ONE_MINUS_DST_COLOR:
655 case GL_SRC_ALPHA:
656 case GL_ONE_MINUS_SRC_ALPHA:
657 case GL_DST_ALPHA:
658 case GL_ONE_MINUS_DST_ALPHA:
659 case GL_CONSTANT_COLOR:
660 case GL_ONE_MINUS_CONSTANT_COLOR:
661 case GL_CONSTANT_ALPHA:
662 case GL_ONE_MINUS_CONSTANT_ALPHA:
663 break;
664 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000665 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000666 }
667
668 switch (srcAlpha)
669 {
670 case GL_ZERO:
671 case GL_ONE:
672 case GL_SRC_COLOR:
673 case GL_ONE_MINUS_SRC_COLOR:
674 case GL_DST_COLOR:
675 case GL_ONE_MINUS_DST_COLOR:
676 case GL_SRC_ALPHA:
677 case GL_ONE_MINUS_SRC_ALPHA:
678 case GL_DST_ALPHA:
679 case GL_ONE_MINUS_DST_ALPHA:
680 case GL_CONSTANT_COLOR:
681 case GL_ONE_MINUS_CONSTANT_COLOR:
682 case GL_CONSTANT_ALPHA:
683 case GL_ONE_MINUS_CONSTANT_ALPHA:
684 case GL_SRC_ALPHA_SATURATE:
685 break;
686 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000687 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000688 }
689
690 switch (dstAlpha)
691 {
692 case GL_ZERO:
693 case GL_ONE:
694 case GL_SRC_COLOR:
695 case GL_ONE_MINUS_SRC_COLOR:
696 case GL_DST_COLOR:
697 case GL_ONE_MINUS_DST_COLOR:
698 case GL_SRC_ALPHA:
699 case GL_ONE_MINUS_SRC_ALPHA:
700 case GL_DST_ALPHA:
701 case GL_ONE_MINUS_DST_ALPHA:
702 case GL_CONSTANT_COLOR:
703 case GL_ONE_MINUS_CONSTANT_COLOR:
704 case GL_CONSTANT_ALPHA:
705 case GL_ONE_MINUS_CONSTANT_ALPHA:
706 break;
707 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000708 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000709 }
710
daniel@transgaming.comfe453652010-03-16 06:23:28 +0000711 bool constantColorUsed = (srcRGB == GL_CONSTANT_COLOR || srcRGB == GL_ONE_MINUS_CONSTANT_COLOR ||
712 dstRGB == GL_CONSTANT_COLOR || dstRGB == GL_ONE_MINUS_CONSTANT_COLOR);
713
714 bool constantAlphaUsed = (srcRGB == GL_CONSTANT_ALPHA || srcRGB == GL_ONE_MINUS_CONSTANT_ALPHA ||
715 dstRGB == GL_CONSTANT_ALPHA || dstRGB == GL_ONE_MINUS_CONSTANT_ALPHA);
716
717 if (constantColorUsed && constantAlphaUsed)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000718 {
daniel@transgaming.comfe453652010-03-16 06:23:28 +0000719 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 +0000720 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000721 }
722
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000723 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000724
725 if (context)
726 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +0000727 context->setBlendFactors(srcRGB, dstRGB, srcAlpha, dstAlpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000728 }
729 }
730 catch(std::bad_alloc&)
731 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000732 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000733 }
734}
735
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +0000736void __stdcall glBufferData(GLenum target, GLsizeiptr size, const GLvoid* data, GLenum usage)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000737{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000738 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 +0000739 target, size, data, usage);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000740
741 try
742 {
743 if (size < 0)
744 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000745 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000746 }
747
shannon.woods%transgaming.com@gtempaccount.comf2db40b2013-04-13 03:37:09 +0000748 gl::Context *context = gl::getNonLostContext();
749
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000750 switch (usage)
751 {
752 case GL_STREAM_DRAW:
753 case GL_STATIC_DRAW:
754 case GL_DYNAMIC_DRAW:
755 break;
shannon.woods%transgaming.com@gtempaccount.comf2db40b2013-04-13 03:37:09 +0000756
757 case GL_STREAM_READ:
758 case GL_STREAM_COPY:
759 case GL_STATIC_READ:
760 case GL_STATIC_COPY:
761 case GL_DYNAMIC_READ:
762 case GL_DYNAMIC_COPY:
763 if (context && context->getClientVersion() < 3)
764 {
765 return gl::error(GL_INVALID_ENUM);
766 }
767 break;
768
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000769 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000770 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000771 }
772
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000773 if (context)
774 {
775 gl::Buffer *buffer;
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +0000776
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000777 switch (target)
778 {
779 case GL_ARRAY_BUFFER:
780 buffer = context->getArrayBuffer();
781 break;
782 case GL_ELEMENT_ARRAY_BUFFER:
783 buffer = context->getElementArrayBuffer();
784 break;
785 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000786 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000787 }
788
789 if (!buffer)
790 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000791 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000792 }
793
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +0000794 buffer->bufferData(data, size, usage);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000795 }
796 }
797 catch(std::bad_alloc&)
798 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000799 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000800 }
801}
802
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +0000803void __stdcall glBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid* data)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000804{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000805 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 +0000806 target, offset, size, data);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000807
808 try
809 {
daniel@transgaming.comdefa1c32010-05-18 18:51:45 +0000810 if (size < 0 || offset < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000811 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000812 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000813 }
814
daniel@transgaming.comd4620a32010-03-21 04:31:28 +0000815 if (data == NULL)
816 {
817 return;
818 }
819
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000820 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +0000821
822 if (context)
823 {
824 gl::Buffer *buffer;
825
826 switch (target)
827 {
828 case GL_ARRAY_BUFFER:
829 buffer = context->getArrayBuffer();
830 break;
831 case GL_ELEMENT_ARRAY_BUFFER:
832 buffer = context->getElementArrayBuffer();
833 break;
834 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000835 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +0000836 }
837
838 if (!buffer)
839 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000840 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +0000841 }
842
daniel@transgaming.comdefa1c32010-05-18 18:51:45 +0000843 if ((size_t)size + offset > buffer->size())
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +0000844 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000845 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +0000846 }
daniel@transgaming.comdefa1c32010-05-18 18:51:45 +0000847
848 buffer->bufferSubData(data, size, offset);
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +0000849 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000850 }
851 catch(std::bad_alloc&)
852 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000853 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000854 }
855}
856
857GLenum __stdcall glCheckFramebufferStatus(GLenum target)
858{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000859 EVENT("(GLenum target = 0x%X)", target);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000860
861 try
862 {
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +0000863 if (target != GL_FRAMEBUFFER && target != GL_DRAW_FRAMEBUFFER_ANGLE && target != GL_READ_FRAMEBUFFER_ANGLE)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000864 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000865 return gl::error(GL_INVALID_ENUM, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000866 }
867
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000868 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000869
870 if (context)
871 {
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +0000872 gl::Framebuffer *framebuffer = NULL;
873 if (target == GL_READ_FRAMEBUFFER_ANGLE)
874 {
875 framebuffer = context->getReadFramebuffer();
876 }
877 else
878 {
879 framebuffer = context->getDrawFramebuffer();
880 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000881
882 return framebuffer->completeness();
883 }
884 }
885 catch(std::bad_alloc&)
886 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000887 return gl::error(GL_OUT_OF_MEMORY, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000888 }
889
890 return 0;
891}
892
893void __stdcall glClear(GLbitfield mask)
894{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +0000895 EVENT("(GLbitfield mask = 0x%X)", mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000896
897 try
898 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000899 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000900
901 if (context)
902 {
903 context->clear(mask);
904 }
905 }
906 catch(std::bad_alloc&)
907 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000908 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000909 }
910}
911
912void __stdcall glClearColor(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha)
913{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000914 EVENT("(GLclampf red = %f, GLclampf green = %f, GLclampf blue = %f, GLclampf alpha = %f)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +0000915 red, green, blue, alpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000916
917 try
918 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000919 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000920
921 if (context)
922 {
923 context->setClearColor(red, green, blue, alpha);
924 }
925 }
926 catch(std::bad_alloc&)
927 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000928 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000929 }
930}
931
932void __stdcall glClearDepthf(GLclampf depth)
933{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000934 EVENT("(GLclampf depth = %f)", depth);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000935
936 try
937 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000938 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000939
940 if (context)
941 {
942 context->setClearDepth(depth);
943 }
944 }
945 catch(std::bad_alloc&)
946 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000947 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000948 }
949}
950
951void __stdcall glClearStencil(GLint s)
952{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000953 EVENT("(GLint s = %d)", s);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000954
955 try
956 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000957 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000958
959 if (context)
960 {
961 context->setClearStencil(s);
962 }
963 }
964 catch(std::bad_alloc&)
965 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000966 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000967 }
968}
969
970void __stdcall glColorMask(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha)
971{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +0000972 EVENT("(GLboolean red = %d, GLboolean green = %u, GLboolean blue = %u, GLboolean alpha = %u)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +0000973 red, green, blue, alpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000974
975 try
976 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000977 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000978
979 if (context)
980 {
daniel@transgaming.coma36f98e2010-05-18 18:51:09 +0000981 context->setColorMask(red == GL_TRUE, green == GL_TRUE, blue == GL_TRUE, alpha == GL_TRUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000982 }
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
990void __stdcall glCompileShader(GLuint shader)
991{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000992 EVENT("(GLuint shader = %d)", shader);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000993
994 try
995 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000996 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000997
998 if (context)
999 {
1000 gl::Shader *shaderObject = context->getShader(shader);
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00001001
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001002 if (!shaderObject)
1003 {
daniel@transgaming.com0cefaf42010-04-13 03:26:36 +00001004 if (context->getProgram(shader))
1005 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001006 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com0cefaf42010-04-13 03:26:36 +00001007 }
1008 else
1009 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001010 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com0cefaf42010-04-13 03:26:36 +00001011 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001012 }
1013
1014 shaderObject->compile();
1015 }
1016 }
1017 catch(std::bad_alloc&)
1018 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001019 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001020 }
1021}
1022
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00001023void __stdcall glCompressedTexImage2D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height,
1024 GLint border, GLsizei imageSize, const GLvoid* data)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001025{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001026 EVENT("(GLenum target = 0x%X, GLint level = %d, GLenum internalformat = 0x%X, GLsizei width = %d, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00001027 "GLsizei height = %d, GLint border = %d, GLsizei imageSize = %d, const GLvoid* data = 0x%0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001028 target, level, internalformat, width, height, border, imageSize, data);
1029
1030 try
1031 {
daniel@transgaming.com4f9ef0d2011-05-30 23:51:19 +00001032 if (!validImageSize(level, width, height) || border != 0 || imageSize < 0)
daniel@transgaming.com41430492010-03-11 20:36:18 +00001033 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001034 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com41430492010-03-11 20:36:18 +00001035 }
1036
daniel@transgaming.com01868132010-08-24 19:21:17 +00001037 switch (internalformat)
1038 {
1039 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
1040 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
gman@chromium.org50c526d2011-08-10 05:19:44 +00001041 case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
1042 case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
daniel@transgaming.com01868132010-08-24 19:21:17 +00001043 break;
1044 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001045 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com01868132010-08-24 19:21:17 +00001046 }
1047
1048 if (border != 0)
1049 {
shannon.woods@transgaming.com0efef902013-02-28 23:21:09 +00001050 return gl::error(GL_INVALID_OPERATION);
1051 }
1052
1053 if (width != 1 && width != 2 && width % 4 != 0)
1054 {
1055 return gl::error(GL_INVALID_OPERATION);
1056 }
1057
1058 if (height != 1 && height != 2 && height % 4 != 0)
1059 {
1060 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com01868132010-08-24 19:21:17 +00001061 }
1062
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001063 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com01868132010-08-24 19:21:17 +00001064
1065 if (context)
1066 {
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001067 if (level > context->getMaximumTextureLevel())
1068 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001069 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001070 }
1071
1072 switch (target)
1073 {
1074 case GL_TEXTURE_2D:
1075 if (width > (context->getMaximumTextureDimension() >> level) ||
1076 height > (context->getMaximumTextureDimension() >> level))
1077 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001078 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001079 }
1080 break;
1081 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
1082 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
1083 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
1084 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
1085 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
1086 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
1087 if (width != height)
1088 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001089 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001090 }
1091
1092 if (width > (context->getMaximumCubeTextureDimension() >> level) ||
1093 height > (context->getMaximumCubeTextureDimension() >> level))
1094 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001095 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001096 }
1097 break;
1098 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001099 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001100 }
1101
gman@chromium.org50c526d2011-08-10 05:19:44 +00001102 switch (internalformat) {
1103 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
1104 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
1105 if (!context->supportsDXT1Textures())
1106 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001107 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 +00001108 }
1109 break;
1110 case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
1111 if (!context->supportsDXT3Textures())
1112 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001113 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 +00001114 }
1115 break;
1116 case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
1117 if (!context->supportsDXT5Textures())
1118 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001119 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 +00001120 }
1121 break;
1122 default: UNREACHABLE();
daniel@transgaming.com01868132010-08-24 19:21:17 +00001123 }
1124
1125 if (imageSize != gl::ComputeCompressedSize(width, height, internalformat))
1126 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001127 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com01868132010-08-24 19:21:17 +00001128 }
1129
1130 if (target == GL_TEXTURE_2D)
1131 {
1132 gl::Texture2D *texture = context->getTexture2D();
1133
1134 if (!texture)
1135 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001136 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com01868132010-08-24 19:21:17 +00001137 }
1138
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00001139 if (texture->isImmutable())
1140 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001141 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00001142 }
1143
daniel@transgaming.com01868132010-08-24 19:21:17 +00001144 texture->setCompressedImage(level, internalformat, width, height, imageSize, data);
1145 }
1146 else
1147 {
1148 gl::TextureCubeMap *texture = context->getTextureCubeMap();
1149
1150 if (!texture)
1151 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001152 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com01868132010-08-24 19:21:17 +00001153 }
1154
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00001155 if (texture->isImmutable())
1156 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001157 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00001158 }
1159
daniel@transgaming.com01868132010-08-24 19:21:17 +00001160 switch (target)
1161 {
1162 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
1163 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
1164 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
1165 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
1166 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
1167 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
1168 texture->setCompressedImage(target, level, internalformat, width, height, imageSize, data);
1169 break;
1170 default: UNREACHABLE();
1171 }
1172 }
1173 }
1174
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001175 }
1176 catch(std::bad_alloc&)
1177 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001178 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001179 }
1180}
1181
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00001182void __stdcall glCompressedTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height,
1183 GLenum format, GLsizei imageSize, const GLvoid* data)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001184{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001185 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001186 "GLsizei width = %d, GLsizei height = %d, GLenum format = 0x%X, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00001187 "GLsizei imageSize = %d, const GLvoid* data = 0x%0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001188 target, level, xoffset, yoffset, width, height, format, imageSize, data);
1189
1190 try
1191 {
apatrick@chromium.org551022e2012-01-23 19:56:54 +00001192 if (!gl::IsInternalTextureTarget(target))
daniel@transgaming.com41430492010-03-11 20:36:18 +00001193 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001194 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com41430492010-03-11 20:36:18 +00001195 }
1196
daniel@transgaming.com4f9ef0d2011-05-30 23:51:19 +00001197 if (xoffset < 0 || yoffset < 0 || !validImageSize(level, width, height) || imageSize < 0)
daniel@transgaming.com41430492010-03-11 20:36:18 +00001198 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001199 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com41430492010-03-11 20:36:18 +00001200 }
1201
daniel@transgaming.com01868132010-08-24 19:21:17 +00001202 switch (format)
daniel@transgaming.com41430492010-03-11 20:36:18 +00001203 {
daniel@transgaming.com01868132010-08-24 19:21:17 +00001204 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
1205 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
gman@chromium.org50c526d2011-08-10 05:19:44 +00001206 case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
1207 case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
daniel@transgaming.com01868132010-08-24 19:21:17 +00001208 break;
1209 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001210 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com41430492010-03-11 20:36:18 +00001211 }
1212
daniel@transgaming.com01868132010-08-24 19:21:17 +00001213 if (width == 0 || height == 0 || data == NULL)
1214 {
1215 return;
1216 }
1217
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001218 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com01868132010-08-24 19:21:17 +00001219
1220 if (context)
1221 {
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001222 if (level > context->getMaximumTextureLevel())
1223 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001224 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001225 }
1226
gman@chromium.org50c526d2011-08-10 05:19:44 +00001227 switch (format) {
1228 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
1229 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
1230 if (!context->supportsDXT1Textures())
1231 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001232 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 +00001233 }
1234 break;
1235 case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
1236 if (!context->supportsDXT3Textures())
1237 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001238 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 +00001239 }
1240 break;
1241 case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
1242 if (!context->supportsDXT5Textures())
1243 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001244 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 +00001245 }
1246 break;
1247 default: UNREACHABLE();
daniel@transgaming.com01868132010-08-24 19:21:17 +00001248 }
1249
1250 if (imageSize != gl::ComputeCompressedSize(width, height, format))
1251 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001252 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com01868132010-08-24 19:21:17 +00001253 }
1254
1255 if (xoffset % 4 != 0 || yoffset % 4 != 0)
1256 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001257 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 +00001258 // does not exist unless DXT textures are supported.
daniel@transgaming.com01868132010-08-24 19:21:17 +00001259 }
1260
1261 if (target == GL_TEXTURE_2D)
1262 {
1263 gl::Texture2D *texture = context->getTexture2D();
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00001264 if (validateSubImageParams2D(true, width, height, xoffset, yoffset, level, format, GL_NONE, texture))
daniel@transgaming.com01868132010-08-24 19:21:17 +00001265 {
daniel@transgaming.com343373a2011-11-29 19:42:32 +00001266 texture->subImageCompressed(level, xoffset, yoffset, width, height, format, imageSize, data);
daniel@transgaming.com01868132010-08-24 19:21:17 +00001267 }
daniel@transgaming.com01868132010-08-24 19:21:17 +00001268 }
1269 else if (gl::IsCubemapTextureTarget(target))
1270 {
1271 gl::TextureCubeMap *texture = context->getTextureCubeMap();
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00001272 if (validateSubImageParamsCube(true, width, height, xoffset, yoffset, target, level, format, GL_NONE, texture))
daniel@transgaming.com01868132010-08-24 19:21:17 +00001273 {
daniel@transgaming.com343373a2011-11-29 19:42:32 +00001274 texture->subImageCompressed(target, level, xoffset, yoffset, width, height, format, imageSize, data);
daniel@transgaming.com01868132010-08-24 19:21:17 +00001275 }
daniel@transgaming.com01868132010-08-24 19:21:17 +00001276 }
1277 else
1278 {
1279 UNREACHABLE();
1280 }
1281 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001282 }
1283 catch(std::bad_alloc&)
1284 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001285 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001286 }
1287}
1288
1289void __stdcall glCopyTexImage2D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border)
1290{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001291 EVENT("(GLenum target = 0x%X, GLint level = %d, GLenum internalformat = 0x%X, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001292 "GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d, GLint border = %d)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001293 target, level, internalformat, x, y, width, height, border);
1294
1295 try
1296 {
daniel@transgaming.com4f9ef0d2011-05-30 23:51:19 +00001297 if (!validImageSize(level, width, height))
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001298 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001299 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001300 }
1301
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001302 if (border != 0)
1303 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001304 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001305 }
1306
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001307 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001308
1309 if (context)
1310 {
daniel@transgaming.com32b11442011-11-19 02:42:48 +00001311 if (level > context->getMaximumTextureLevel())
1312 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001313 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com32b11442011-11-19 02:42:48 +00001314 }
1315
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001316 switch (target)
1317 {
1318 case GL_TEXTURE_2D:
1319 if (width > (context->getMaximumTextureDimension() >> level) ||
1320 height > (context->getMaximumTextureDimension() >> level))
1321 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001322 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001323 }
1324 break;
1325 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
1326 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
1327 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
1328 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
1329 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
1330 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
1331 if (width != height)
1332 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001333 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001334 }
1335
1336 if (width > (context->getMaximumCubeTextureDimension() >> level) ||
1337 height > (context->getMaximumCubeTextureDimension() >> level))
1338 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001339 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001340 }
1341 break;
1342 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001343 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001344 }
1345
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00001346 gl::Framebuffer *framebuffer = context->getReadFramebuffer();
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001347
daniel@transgaming.combbc57792010-07-28 19:21:05 +00001348 if (framebuffer->completeness() != GL_FRAMEBUFFER_COMPLETE)
1349 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001350 return gl::error(GL_INVALID_FRAMEBUFFER_OPERATION);
daniel@transgaming.combbc57792010-07-28 19:21:05 +00001351 }
1352
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00001353 if (context->getReadFramebufferHandle() != 0 && framebuffer->getSamples() != 0)
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00001354 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001355 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00001356 }
1357
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00001358 gl::Renderbuffer *source = framebuffer->getReadColorbuffer();
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +00001359 GLenum colorbufferFormat = source->getInternalFormat();
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001360
1361 // [OpenGL ES 2.0.24] table 3.9
1362 switch (internalformat)
1363 {
1364 case GL_ALPHA:
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00001365 if (colorbufferFormat != GL_ALPHA8_EXT &&
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001366 colorbufferFormat != GL_RGBA4 &&
1367 colorbufferFormat != GL_RGB5_A1 &&
shannon.woods@transgaming.com28e7ba02013-02-28 23:09:28 +00001368 colorbufferFormat != GL_BGRA8_EXT &&
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001369 colorbufferFormat != GL_RGBA8_OES)
1370 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001371 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001372 }
1373 break;
1374 case GL_LUMINANCE:
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00001375 case GL_RGB:
1376 if (colorbufferFormat != GL_RGB565 &&
1377 colorbufferFormat != GL_RGB8_OES &&
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001378 colorbufferFormat != GL_RGBA4 &&
1379 colorbufferFormat != GL_RGB5_A1 &&
shannon.woods@transgaming.com28e7ba02013-02-28 23:09:28 +00001380 colorbufferFormat != GL_BGRA8_EXT &&
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001381 colorbufferFormat != GL_RGBA8_OES)
1382 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001383 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001384 }
1385 break;
1386 case GL_LUMINANCE_ALPHA:
1387 case GL_RGBA:
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00001388 if (colorbufferFormat != GL_RGBA4 &&
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001389 colorbufferFormat != GL_RGB5_A1 &&
shannon.woods@transgaming.com28e7ba02013-02-28 23:09:28 +00001390 colorbufferFormat != GL_BGRA8_EXT &&
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001391 colorbufferFormat != GL_RGBA8_OES)
1392 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001393 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001394 }
1395 break;
1396 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
1397 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
gman@chromium.org50c526d2011-08-10 05:19:44 +00001398 if (context->supportsDXT1Textures())
1399 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001400 return gl::error(GL_INVALID_OPERATION);
gman@chromium.org50c526d2011-08-10 05:19:44 +00001401 }
1402 else
1403 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001404 return gl::error(GL_INVALID_ENUM);
gman@chromium.org50c526d2011-08-10 05:19:44 +00001405 }
1406 break;
1407 case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
1408 if (context->supportsDXT3Textures())
1409 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001410 return gl::error(GL_INVALID_OPERATION);
gman@chromium.org50c526d2011-08-10 05:19:44 +00001411 }
1412 else
1413 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001414 return gl::error(GL_INVALID_ENUM);
gman@chromium.org50c526d2011-08-10 05:19:44 +00001415 }
1416 break;
1417 case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
1418 if (context->supportsDXT5Textures())
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001419 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001420 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001421 }
1422 else
1423 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001424 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001425 }
1426 break;
daniel@transgaming.com0c854682012-05-31 01:14:11 +00001427 case GL_DEPTH_COMPONENT:
1428 case GL_DEPTH_COMPONENT16:
1429 case GL_DEPTH_COMPONENT32_OES:
1430 case GL_DEPTH_STENCIL_OES:
1431 case GL_DEPTH24_STENCIL8_OES:
1432 if (context->supportsDepthTextures())
1433 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001434 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com0c854682012-05-31 01:14:11 +00001435 }
1436 else
1437 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001438 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com0c854682012-05-31 01:14:11 +00001439 }
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001440 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001441 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001442 }
1443
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001444 if (target == GL_TEXTURE_2D)
1445 {
1446 gl::Texture2D *texture = context->getTexture2D();
1447
1448 if (!texture)
1449 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001450 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001451 }
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00001452
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00001453 if (texture->isImmutable())
1454 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001455 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00001456 }
1457
apatrick@chromium.orgb31f5322011-01-19 19:02:52 +00001458 texture->copyImage(level, internalformat, x, y, width, height, framebuffer);
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001459 }
daniel@transgaming.com19ffc242010-05-04 03:35:21 +00001460 else if (gl::IsCubemapTextureTarget(target))
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001461 {
1462 gl::TextureCubeMap *texture = context->getTextureCubeMap();
1463
1464 if (!texture)
1465 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001466 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001467 }
1468
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00001469 if (texture->isImmutable())
1470 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001471 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00001472 }
1473
apatrick@chromium.orgb31f5322011-01-19 19:02:52 +00001474 texture->copyImage(target, level, internalformat, x, y, width, height, framebuffer);
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001475 }
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001476 else UNREACHABLE();
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001477 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001478 }
1479 catch(std::bad_alloc&)
1480 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001481 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001482 }
1483}
1484
1485void __stdcall glCopyTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height)
1486{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001487 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001488 "GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001489 target, level, xoffset, yoffset, x, y, width, height);
1490
1491 try
1492 {
apatrick@chromium.org551022e2012-01-23 19:56:54 +00001493 if (!gl::IsInternalTextureTarget(target))
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001494 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001495 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001496 }
1497
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001498 if (level < 0 || xoffset < 0 || yoffset < 0 || width < 0 || height < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001499 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001500 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001501 }
1502
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001503 if (std::numeric_limits<GLsizei>::max() - xoffset < width || std::numeric_limits<GLsizei>::max() - yoffset < height)
1504 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001505 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001506 }
1507
1508 if (width == 0 || height == 0)
1509 {
1510 return;
1511 }
1512
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001513 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001514
1515 if (context)
1516 {
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001517 if (level > context->getMaximumTextureLevel())
1518 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001519 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001520 }
1521
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00001522 gl::Framebuffer *framebuffer = context->getReadFramebuffer();
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001523
daniel@transgaming.combbc57792010-07-28 19:21:05 +00001524 if (framebuffer->completeness() != GL_FRAMEBUFFER_COMPLETE)
1525 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001526 return gl::error(GL_INVALID_FRAMEBUFFER_OPERATION);
daniel@transgaming.combbc57792010-07-28 19:21:05 +00001527 }
1528
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00001529 if (context->getReadFramebufferHandle() != 0 && framebuffer->getSamples() != 0)
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00001530 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001531 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00001532 }
1533
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00001534 gl::Renderbuffer *source = framebuffer->getReadColorbuffer();
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +00001535 GLenum colorbufferFormat = source->getInternalFormat();
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001536 gl::Texture *texture = NULL;
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +00001537 GLenum textureFormat = GL_RGBA;
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001538
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001539 if (target == GL_TEXTURE_2D)
1540 {
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +00001541 gl::Texture2D *tex2d = context->getTexture2D();
1542
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00001543 if (!validateSubImageParams2D(false, width, height, xoffset, yoffset, level, GL_NONE, GL_NONE, tex2d))
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +00001544 {
1545 return; // error already registered by validateSubImageParams
1546 }
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00001547 textureFormat = gl::ExtractFormat(tex2d->getInternalFormat(level));
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +00001548 texture = tex2d;
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001549 }
daniel@transgaming.com19ffc242010-05-04 03:35:21 +00001550 else if (gl::IsCubemapTextureTarget(target))
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001551 {
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +00001552 gl::TextureCubeMap *texcube = context->getTextureCubeMap();
1553
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00001554 if (!validateSubImageParamsCube(false, width, height, xoffset, yoffset, target, level, GL_NONE, GL_NONE, texcube))
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +00001555 {
1556 return; // error already registered by validateSubImageParams
1557 }
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00001558 textureFormat = gl::ExtractFormat(texcube->getInternalFormat(target, level));
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +00001559 texture = texcube;
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001560 }
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001561 else UNREACHABLE();
1562
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001563 // [OpenGL ES 2.0.24] table 3.9
1564 switch (textureFormat)
1565 {
1566 case GL_ALPHA:
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00001567 if (colorbufferFormat != GL_ALPHA8_EXT &&
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001568 colorbufferFormat != GL_RGBA4 &&
1569 colorbufferFormat != GL_RGB5_A1 &&
1570 colorbufferFormat != GL_RGBA8_OES)
1571 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001572 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001573 }
1574 break;
1575 case GL_LUMINANCE:
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00001576 case GL_RGB:
1577 if (colorbufferFormat != GL_RGB565 &&
1578 colorbufferFormat != GL_RGB8_OES &&
1579 colorbufferFormat != GL_RGBA4 &&
1580 colorbufferFormat != GL_RGB5_A1 &&
1581 colorbufferFormat != GL_RGBA8_OES)
1582 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001583 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00001584 }
1585 break;
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001586 case GL_LUMINANCE_ALPHA:
1587 case GL_RGBA:
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00001588 if (colorbufferFormat != GL_RGBA4 &&
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001589 colorbufferFormat != GL_RGB5_A1 &&
1590 colorbufferFormat != GL_RGBA8_OES)
1591 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001592 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001593 }
1594 break;
1595 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
1596 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
gman@chromium.org50c526d2011-08-10 05:19:44 +00001597 case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
1598 case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001599 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com0c854682012-05-31 01:14:11 +00001600 case GL_DEPTH_COMPONENT:
1601 case GL_DEPTH_STENCIL_OES:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001602 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001603 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001604 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001605 }
1606
apatrick@chromium.orgb31f5322011-01-19 19:02:52 +00001607 texture->copySubImage(target, level, xoffset, yoffset, x, y, width, height, framebuffer);
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001608 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001609 }
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001610
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001611 catch(std::bad_alloc&)
1612 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001613 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001614 }
1615}
1616
1617GLuint __stdcall glCreateProgram(void)
1618{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001619 EVENT("()");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001620
1621 try
1622 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001623 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001624
1625 if (context)
1626 {
1627 return context->createProgram();
1628 }
1629 }
1630 catch(std::bad_alloc&)
1631 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001632 return gl::error(GL_OUT_OF_MEMORY, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001633 }
1634
1635 return 0;
1636}
1637
1638GLuint __stdcall glCreateShader(GLenum type)
1639{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001640 EVENT("(GLenum type = 0x%X)", type);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001641
1642 try
1643 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001644 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001645
1646 if (context)
1647 {
1648 switch (type)
1649 {
1650 case GL_FRAGMENT_SHADER:
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00001651 case GL_VERTEX_SHADER:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001652 return context->createShader(type);
1653 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001654 return gl::error(GL_INVALID_ENUM, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001655 }
1656 }
1657 }
1658 catch(std::bad_alloc&)
1659 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001660 return gl::error(GL_OUT_OF_MEMORY, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001661 }
1662
1663 return 0;
1664}
1665
1666void __stdcall glCullFace(GLenum mode)
1667{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001668 EVENT("(GLenum mode = 0x%X)", mode);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001669
1670 try
1671 {
1672 switch (mode)
1673 {
1674 case GL_FRONT:
1675 case GL_BACK:
1676 case GL_FRONT_AND_BACK:
1677 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001678 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001679
1680 if (context)
1681 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00001682 context->setCullMode(mode);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001683 }
1684 }
1685 break;
1686 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001687 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001688 }
1689 }
1690 catch(std::bad_alloc&)
1691 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001692 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001693 }
1694}
1695
1696void __stdcall glDeleteBuffers(GLsizei n, const GLuint* buffers)
1697{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001698 EVENT("(GLsizei n = %d, const GLuint* buffers = 0x%0.8p)", n, buffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001699
1700 try
1701 {
1702 if (n < 0)
1703 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001704 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001705 }
1706
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001707 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001708
1709 if (context)
1710 {
1711 for (int i = 0; i < n; i++)
1712 {
1713 context->deleteBuffer(buffers[i]);
1714 }
1715 }
1716 }
1717 catch(std::bad_alloc&)
1718 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001719 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001720 }
1721}
1722
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001723void __stdcall glDeleteFencesNV(GLsizei n, const GLuint* fences)
1724{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001725 EVENT("(GLsizei n = %d, const GLuint* fences = 0x%0.8p)", n, fences);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001726
1727 try
1728 {
1729 if (n < 0)
1730 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001731 return gl::error(GL_INVALID_VALUE);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001732 }
1733
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001734 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001735
1736 if (context)
1737 {
1738 for (int i = 0; i < n; i++)
1739 {
1740 context->deleteFence(fences[i]);
1741 }
1742 }
1743 }
1744 catch(std::bad_alloc&)
1745 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001746 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001747 }
1748}
1749
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001750void __stdcall glDeleteFramebuffers(GLsizei n, const GLuint* framebuffers)
1751{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001752 EVENT("(GLsizei n = %d, const GLuint* framebuffers = 0x%0.8p)", n, framebuffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001753
1754 try
1755 {
1756 if (n < 0)
1757 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001758 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001759 }
1760
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001761 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001762
1763 if (context)
1764 {
1765 for (int i = 0; i < n; i++)
1766 {
1767 if (framebuffers[i] != 0)
1768 {
1769 context->deleteFramebuffer(framebuffers[i]);
1770 }
1771 }
1772 }
1773 }
1774 catch(std::bad_alloc&)
1775 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001776 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001777 }
1778}
1779
1780void __stdcall glDeleteProgram(GLuint program)
1781{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001782 EVENT("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001783
1784 try
1785 {
daniel@transgaming.com75401e62010-04-13 03:26:39 +00001786 if (program == 0)
1787 {
1788 return;
1789 }
1790
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001791 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001792
1793 if (context)
1794 {
daniel@transgaming.com75401e62010-04-13 03:26:39 +00001795 if (!context->getProgram(program))
1796 {
1797 if(context->getShader(program))
1798 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001799 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com75401e62010-04-13 03:26:39 +00001800 }
1801 else
1802 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001803 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com75401e62010-04-13 03:26:39 +00001804 }
1805 }
1806
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001807 context->deleteProgram(program);
1808 }
1809 }
1810 catch(std::bad_alloc&)
1811 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001812 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001813 }
1814}
1815
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00001816void __stdcall glDeleteQueriesEXT(GLsizei n, const GLuint *ids)
1817{
1818 EVENT("(GLsizei n = %d, const GLuint *ids = 0x%0.8p)", n, ids);
1819
1820 try
1821 {
1822 if (n < 0)
1823 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001824 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00001825 }
1826
1827 gl::Context *context = gl::getNonLostContext();
1828
1829 if (context)
1830 {
1831 for (int i = 0; i < n; i++)
1832 {
1833 context->deleteQuery(ids[i]);
1834 }
1835 }
1836 }
1837 catch(std::bad_alloc&)
1838 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001839 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00001840 }
1841}
1842
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001843void __stdcall glDeleteRenderbuffers(GLsizei n, const GLuint* renderbuffers)
1844{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001845 EVENT("(GLsizei n = %d, const GLuint* renderbuffers = 0x%0.8p)", n, renderbuffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001846
1847 try
1848 {
1849 if (n < 0)
1850 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001851 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001852 }
1853
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001854 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001855
1856 if (context)
1857 {
daniel@transgaming.come2b22122010-03-11 19:22:14 +00001858 for (int i = 0; i < n; i++)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001859 {
1860 context->deleteRenderbuffer(renderbuffers[i]);
1861 }
1862 }
1863 }
1864 catch(std::bad_alloc&)
1865 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001866 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001867 }
1868}
1869
1870void __stdcall glDeleteShader(GLuint shader)
1871{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001872 EVENT("(GLuint shader = %d)", shader);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001873
1874 try
1875 {
daniel@transgaming.com75401e62010-04-13 03:26:39 +00001876 if (shader == 0)
1877 {
1878 return;
1879 }
1880
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001881 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001882
1883 if (context)
1884 {
daniel@transgaming.com75401e62010-04-13 03:26:39 +00001885 if (!context->getShader(shader))
1886 {
1887 if(context->getProgram(shader))
1888 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001889 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com75401e62010-04-13 03:26:39 +00001890 }
1891 else
1892 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001893 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com75401e62010-04-13 03:26:39 +00001894 }
1895 }
1896
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001897 context->deleteShader(shader);
1898 }
1899 }
1900 catch(std::bad_alloc&)
1901 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001902 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001903 }
1904}
1905
1906void __stdcall glDeleteTextures(GLsizei n, const GLuint* textures)
1907{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001908 EVENT("(GLsizei n = %d, const GLuint* textures = 0x%0.8p)", n, textures);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001909
1910 try
1911 {
1912 if (n < 0)
1913 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001914 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001915 }
1916
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001917 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001918
1919 if (context)
1920 {
1921 for (int i = 0; i < n; i++)
1922 {
1923 if (textures[i] != 0)
1924 {
1925 context->deleteTexture(textures[i]);
1926 }
1927 }
1928 }
1929 }
1930 catch(std::bad_alloc&)
1931 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001932 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001933 }
1934}
1935
1936void __stdcall glDepthFunc(GLenum func)
1937{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001938 EVENT("(GLenum func = 0x%X)", func);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001939
1940 try
1941 {
1942 switch (func)
1943 {
1944 case GL_NEVER:
1945 case GL_ALWAYS:
1946 case GL_LESS:
1947 case GL_LEQUAL:
1948 case GL_EQUAL:
1949 case GL_GREATER:
1950 case GL_GEQUAL:
1951 case GL_NOTEQUAL:
1952 break;
1953 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001954 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001955 }
1956
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001957 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001958
1959 if (context)
1960 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00001961 context->setDepthFunc(func);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001962 }
1963 }
1964 catch(std::bad_alloc&)
1965 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001966 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001967 }
1968}
1969
1970void __stdcall glDepthMask(GLboolean flag)
1971{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00001972 EVENT("(GLboolean flag = %u)", flag);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001973
1974 try
1975 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001976 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001977
1978 if (context)
1979 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00001980 context->setDepthMask(flag != GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001981 }
1982 }
1983 catch(std::bad_alloc&)
1984 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001985 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001986 }
1987}
1988
1989void __stdcall glDepthRangef(GLclampf zNear, GLclampf zFar)
1990{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001991 EVENT("(GLclampf zNear = %f, GLclampf zFar = %f)", zNear, zFar);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001992
1993 try
1994 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001995 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001996
1997 if (context)
1998 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00001999 context->setDepthRange(zNear, zFar);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002000 }
2001 }
2002 catch(std::bad_alloc&)
2003 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002004 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002005 }
2006}
2007
2008void __stdcall glDetachShader(GLuint program, GLuint shader)
2009{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002010 EVENT("(GLuint program = %d, GLuint shader = %d)", program, shader);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002011
2012 try
2013 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002014 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002015
2016 if (context)
2017 {
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00002018
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002019 gl::Program *programObject = context->getProgram(program);
2020 gl::Shader *shaderObject = context->getShader(shader);
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00002021
2022 if (!programObject)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002023 {
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00002024 gl::Shader *shaderByProgramHandle;
2025 shaderByProgramHandle = context->getShader(program);
2026 if (!shaderByProgramHandle)
2027 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002028 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00002029 }
2030 else
2031 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002032 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00002033 }
2034 }
2035
2036 if (!shaderObject)
2037 {
2038 gl::Program *programByShaderHandle = context->getProgram(shader);
2039 if (!programByShaderHandle)
2040 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002041 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00002042 }
2043 else
2044 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002045 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00002046 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002047 }
2048
2049 if (!programObject->detachShader(shaderObject))
2050 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002051 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002052 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002053 }
2054 }
2055 catch(std::bad_alloc&)
2056 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002057 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002058 }
2059}
2060
2061void __stdcall glDisable(GLenum cap)
2062{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002063 EVENT("(GLenum cap = 0x%X)", cap);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002064
2065 try
2066 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002067 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002068
2069 if (context)
2070 {
2071 switch (cap)
2072 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00002073 case GL_CULL_FACE: context->setCullFace(false); break;
2074 case GL_POLYGON_OFFSET_FILL: context->setPolygonOffsetFill(false); break;
2075 case GL_SAMPLE_ALPHA_TO_COVERAGE: context->setSampleAlphaToCoverage(false); break;
2076 case GL_SAMPLE_COVERAGE: context->setSampleCoverage(false); break;
2077 case GL_SCISSOR_TEST: context->setScissorTest(false); break;
2078 case GL_STENCIL_TEST: context->setStencilTest(false); break;
2079 case GL_DEPTH_TEST: context->setDepthTest(false); break;
2080 case GL_BLEND: context->setBlend(false); break;
2081 case GL_DITHER: context->setDither(false); break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002082 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002083 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002084 }
2085 }
2086 }
2087 catch(std::bad_alloc&)
2088 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002089 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002090 }
2091}
2092
2093void __stdcall glDisableVertexAttribArray(GLuint index)
2094{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002095 EVENT("(GLuint index = %d)", index);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002096
2097 try
2098 {
2099 if (index >= gl::MAX_VERTEX_ATTRIBS)
2100 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002101 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002102 }
2103
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002104 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002105
2106 if (context)
2107 {
daniel@transgaming.com83921382011-01-08 05:46:00 +00002108 context->setEnableVertexAttribArray(index, false);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002109 }
2110 }
2111 catch(std::bad_alloc&)
2112 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002113 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002114 }
2115}
2116
2117void __stdcall glDrawArrays(GLenum mode, GLint first, GLsizei count)
2118{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002119 EVENT("(GLenum mode = 0x%X, GLint first = %d, GLsizei count = %d)", mode, first, count);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002120
2121 try
2122 {
2123 if (count < 0 || first < 0)
2124 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002125 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002126 }
2127
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002128 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002129
2130 if (context)
2131 {
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00002132 context->drawArrays(mode, first, count, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002133 }
2134 }
2135 catch(std::bad_alloc&)
2136 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002137 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002138 }
2139}
2140
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002141void __stdcall glDrawArraysInstancedANGLE(GLenum mode, GLint first, GLsizei count, GLsizei primcount)
2142{
2143 EVENT("(GLenum mode = 0x%X, GLint first = %d, GLsizei count = %d, GLsizei primcount = %d)", mode, first, count, primcount);
2144
2145 try
2146 {
2147 if (count < 0 || first < 0 || primcount < 0)
2148 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002149 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002150 }
2151
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00002152 if (primcount > 0)
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002153 {
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00002154 gl::Context *context = gl::getNonLostContext();
2155
2156 if (context)
2157 {
2158 context->drawArrays(mode, first, count, primcount);
2159 }
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002160 }
2161 }
2162 catch(std::bad_alloc&)
2163 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002164 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002165 }
2166}
2167
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00002168void __stdcall glDrawElements(GLenum mode, GLsizei count, GLenum type, const GLvoid* indices)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002169{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002170 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 +00002171 mode, count, type, indices);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002172
2173 try
2174 {
2175 if (count < 0)
2176 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002177 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002178 }
2179
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002180 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002181
2182 if (context)
2183 {
daniel@transgaming.com83921382011-01-08 05:46:00 +00002184 switch (type)
2185 {
2186 case GL_UNSIGNED_BYTE:
2187 case GL_UNSIGNED_SHORT:
2188 break;
2189 case GL_UNSIGNED_INT:
2190 if (!context->supports32bitIndices())
2191 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002192 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com83921382011-01-08 05:46:00 +00002193 }
2194 break;
2195 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002196 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com83921382011-01-08 05:46:00 +00002197 }
2198
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00002199 context->drawElements(mode, count, type, indices, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +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.com4f39fd92010-03-08 20:26:45 +00002205 }
2206}
2207
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002208void __stdcall glDrawElementsInstancedANGLE(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLsizei primcount)
2209{
2210 EVENT("(GLenum mode = 0x%X, GLsizei count = %d, GLenum type = 0x%X, const GLvoid* indices = 0x%0.8p, GLsizei primcount = %d)",
2211 mode, count, type, indices, primcount);
2212
2213 try
2214 {
2215 if (count < 0 || primcount < 0)
2216 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002217 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002218 }
2219
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00002220 if (primcount > 0)
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002221 {
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00002222 gl::Context *context = gl::getNonLostContext();
2223
2224 if (context)
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002225 {
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00002226 switch (type)
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002227 {
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00002228 case GL_UNSIGNED_BYTE:
2229 case GL_UNSIGNED_SHORT:
2230 break;
2231 case GL_UNSIGNED_INT:
2232 if (!context->supports32bitIndices())
2233 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002234 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00002235 }
2236 break;
2237 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002238 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002239 }
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00002240
2241 context->drawElements(mode, count, type, indices, primcount);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002242 }
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002243 }
2244 }
2245 catch(std::bad_alloc&)
2246 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002247 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002248 }
2249}
2250
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002251void __stdcall glEnable(GLenum cap)
2252{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002253 EVENT("(GLenum cap = 0x%X)", cap);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002254
2255 try
2256 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002257 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002258
2259 if (context)
2260 {
2261 switch (cap)
2262 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00002263 case GL_CULL_FACE: context->setCullFace(true); break;
2264 case GL_POLYGON_OFFSET_FILL: context->setPolygonOffsetFill(true); break;
2265 case GL_SAMPLE_ALPHA_TO_COVERAGE: context->setSampleAlphaToCoverage(true); break;
2266 case GL_SAMPLE_COVERAGE: context->setSampleCoverage(true); break;
2267 case GL_SCISSOR_TEST: context->setScissorTest(true); break;
2268 case GL_STENCIL_TEST: context->setStencilTest(true); break;
2269 case GL_DEPTH_TEST: context->setDepthTest(true); break;
2270 case GL_BLEND: context->setBlend(true); break;
2271 case GL_DITHER: context->setDither(true); break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002272 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002273 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002274 }
2275 }
2276 }
2277 catch(std::bad_alloc&)
2278 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002279 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002280 }
2281}
2282
2283void __stdcall glEnableVertexAttribArray(GLuint index)
2284{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002285 EVENT("(GLuint index = %d)", index);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002286
2287 try
2288 {
2289 if (index >= gl::MAX_VERTEX_ATTRIBS)
2290 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002291 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002292 }
2293
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002294 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002295
2296 if (context)
2297 {
daniel@transgaming.com83921382011-01-08 05:46:00 +00002298 context->setEnableVertexAttribArray(index, true);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002299 }
2300 }
2301 catch(std::bad_alloc&)
2302 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002303 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002304 }
2305}
2306
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00002307void __stdcall glEndQueryEXT(GLenum target)
2308{
2309 EVENT("GLenum target = 0x%X)", target);
2310
2311 try
2312 {
2313 switch (target)
2314 {
2315 case GL_ANY_SAMPLES_PASSED_EXT:
2316 case GL_ANY_SAMPLES_PASSED_CONSERVATIVE_EXT:
2317 break;
2318 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002319 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00002320 }
2321
2322 gl::Context *context = gl::getNonLostContext();
2323
2324 if (context)
2325 {
2326 context->endQuery(target);
2327 }
2328 }
2329 catch(std::bad_alloc&)
2330 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002331 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00002332 }
2333}
2334
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002335void __stdcall glFinishFenceNV(GLuint fence)
2336{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002337 EVENT("(GLuint fence = %d)", fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002338
2339 try
2340 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002341 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002342
2343 if (context)
2344 {
2345 gl::Fence* fenceObject = context->getFence(fence);
2346
2347 if (fenceObject == NULL)
2348 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002349 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002350 }
2351
2352 fenceObject->finishFence();
2353 }
2354 }
2355 catch(std::bad_alloc&)
2356 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002357 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002358 }
2359}
2360
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002361void __stdcall glFinish(void)
2362{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002363 EVENT("()");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002364
2365 try
2366 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002367 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002368
2369 if (context)
2370 {
daniel@transgaming.com0d86aa72011-10-26 02:35:10 +00002371 context->sync(true);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002372 }
2373 }
2374 catch(std::bad_alloc&)
2375 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002376 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002377 }
2378}
2379
2380void __stdcall glFlush(void)
2381{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002382 EVENT("()");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002383
2384 try
2385 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002386 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002387
2388 if (context)
2389 {
daniel@transgaming.com0d86aa72011-10-26 02:35:10 +00002390 context->sync(false);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002391 }
2392 }
2393 catch(std::bad_alloc&)
2394 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002395 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002396 }
2397}
2398
2399void __stdcall glFramebufferRenderbuffer(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer)
2400{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002401 EVENT("(GLenum target = 0x%X, GLenum attachment = 0x%X, GLenum renderbuffertarget = 0x%X, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00002402 "GLuint renderbuffer = %d)", target, attachment, renderbuffertarget, renderbuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002403
2404 try
2405 {
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002406 if ((target != GL_FRAMEBUFFER && target != GL_DRAW_FRAMEBUFFER_ANGLE && target != GL_READ_FRAMEBUFFER_ANGLE)
daniel@transgaming.com2fa45512011-10-04 18:43:18 +00002407 || (renderbuffertarget != GL_RENDERBUFFER && renderbuffer != 0))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002408 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002409 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002410 }
2411
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002412 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002413
2414 if (context)
2415 {
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002416 gl::Framebuffer *framebuffer = NULL;
2417 GLuint framebufferHandle = 0;
2418 if (target == GL_READ_FRAMEBUFFER_ANGLE)
2419 {
2420 framebuffer = context->getReadFramebuffer();
2421 framebufferHandle = context->getReadFramebufferHandle();
2422 }
daniel@transgaming.com2fa45512011-10-04 18:43:18 +00002423 else
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002424 {
2425 framebuffer = context->getDrawFramebuffer();
2426 framebufferHandle = context->getDrawFramebufferHandle();
2427 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002428
daniel@transgaming.com2fa45512011-10-04 18:43:18 +00002429 if (!framebuffer || (framebufferHandle == 0 && renderbuffer != 0))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002430 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002431 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002432 }
2433
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002434 if (attachment >= GL_COLOR_ATTACHMENT0_EXT && attachment <= GL_COLOR_ATTACHMENT15_EXT)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002435 {
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002436 const unsigned int colorAttachment = (attachment - GL_COLOR_ATTACHMENT0_EXT);
2437
2438 if (colorAttachment >= context->getMaximumRenderTargets())
2439 {
2440 return gl::error(GL_INVALID_VALUE);
2441 }
2442
2443 framebuffer->setColorbuffer(colorAttachment, GL_RENDERBUFFER, renderbuffer);
2444 }
2445 else
2446 {
2447 switch (attachment)
2448 {
2449 case GL_DEPTH_ATTACHMENT:
2450 framebuffer->setDepthbuffer(GL_RENDERBUFFER, renderbuffer);
2451 break;
2452 case GL_STENCIL_ATTACHMENT:
2453 framebuffer->setStencilbuffer(GL_RENDERBUFFER, renderbuffer);
2454 break;
2455 default:
2456 return gl::error(GL_INVALID_ENUM);
2457 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002458 }
2459 }
2460 }
2461 catch(std::bad_alloc&)
2462 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002463 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002464 }
2465}
2466
2467void __stdcall glFramebufferTexture2D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level)
2468{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002469 EVENT("(GLenum target = 0x%X, GLenum attachment = 0x%X, GLenum textarget = 0x%X, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00002470 "GLuint texture = %d, GLint level = %d)", target, attachment, textarget, texture, level);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002471
2472 try
2473 {
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002474 if (target != GL_FRAMEBUFFER && target != GL_DRAW_FRAMEBUFFER_ANGLE && target != GL_READ_FRAMEBUFFER_ANGLE)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002475 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002476 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002477 }
2478
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002479 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002480
2481 if (context)
2482 {
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002483 if (attachment >= GL_COLOR_ATTACHMENT0_EXT && attachment <= GL_COLOR_ATTACHMENT15_EXT)
2484 {
2485 const unsigned int colorAttachment = (attachment - GL_COLOR_ATTACHMENT0_EXT);
2486
2487 if (colorAttachment >= context->getMaximumRenderTargets())
2488 {
2489 return gl::error(GL_INVALID_VALUE);
2490 }
2491 }
2492 else
2493 {
2494 switch (attachment)
2495 {
2496 case GL_DEPTH_ATTACHMENT:
2497 case GL_STENCIL_ATTACHMENT:
2498 break;
2499 default:
2500 return gl::error(GL_INVALID_ENUM);
2501 }
2502 }
2503
daniel@transgaming.com93a81472010-04-20 18:52:58 +00002504 if (texture == 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002505 {
daniel@transgaming.com93a81472010-04-20 18:52:58 +00002506 textarget = GL_NONE;
2507 }
2508 else
2509 {
2510 gl::Texture *tex = context->getTexture(texture);
2511
2512 if (tex == NULL)
2513 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002514 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com93a81472010-04-20 18:52:58 +00002515 }
2516
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002517 switch (textarget)
2518 {
2519 case GL_TEXTURE_2D:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002520 {
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00002521 if (tex->getTarget() != GL_TEXTURE_2D)
2522 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002523 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00002524 }
2525 gl::Texture2D *tex2d = static_cast<gl::Texture2D *>(tex);
daniel@transgaming.com92f49922012-05-09 15:49:19 +00002526 if (tex2d->isCompressed(0))
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00002527 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002528 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00002529 }
2530 break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002531 }
daniel@transgaming.com93a81472010-04-20 18:52:58 +00002532
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002533 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002534 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002535 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002536 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002537 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002538 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
daniel@transgaming.com93a81472010-04-20 18:52:58 +00002539 {
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00002540 if (tex->getTarget() != GL_TEXTURE_CUBE_MAP)
2541 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002542 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00002543 }
2544 gl::TextureCubeMap *texcube = static_cast<gl::TextureCubeMap *>(tex);
daniel@transgaming.com4df88e82012-05-09 15:49:24 +00002545 if (texcube->isCompressed(textarget, level))
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00002546 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002547 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00002548 }
2549 break;
daniel@transgaming.com93a81472010-04-20 18:52:58 +00002550 }
daniel@transgaming.com93a81472010-04-20 18:52:58 +00002551
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002552 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002553 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002554 }
2555
2556 if (level != 0)
2557 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002558 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002559 }
2560 }
2561
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002562 gl::Framebuffer *framebuffer = NULL;
2563 GLuint framebufferHandle = 0;
2564 if (target == GL_READ_FRAMEBUFFER_ANGLE)
2565 {
2566 framebuffer = context->getReadFramebuffer();
2567 framebufferHandle = context->getReadFramebufferHandle();
2568 }
2569 else
2570 {
2571 framebuffer = context->getDrawFramebuffer();
2572 framebufferHandle = context->getDrawFramebufferHandle();
2573 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002574
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002575 if (framebufferHandle == 0 || !framebuffer)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002576 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002577 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002578 }
2579
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002580 if (attachment >= GL_COLOR_ATTACHMENT0_EXT && attachment <= GL_COLOR_ATTACHMENT15_EXT)
daniel@transgaming.comfbc09532010-04-26 15:33:41 +00002581 {
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002582 const unsigned int colorAttachment = (attachment - GL_COLOR_ATTACHMENT0_EXT);
2583
2584 if (colorAttachment >= context->getMaximumRenderTargets())
2585 {
2586 return gl::error(GL_INVALID_VALUE);
2587 }
2588
2589 framebuffer->setColorbuffer(colorAttachment, textarget, texture);
2590 }
2591 else
2592 {
2593 switch (attachment)
2594 {
2595 case GL_DEPTH_ATTACHMENT: framebuffer->setDepthbuffer(textarget, texture); break;
2596 case GL_STENCIL_ATTACHMENT: framebuffer->setStencilbuffer(textarget, texture); break;
2597 }
daniel@transgaming.comfbc09532010-04-26 15:33:41 +00002598 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002599 }
2600 }
2601 catch(std::bad_alloc&)
2602 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002603 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002604 }
2605}
2606
2607void __stdcall glFrontFace(GLenum mode)
2608{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002609 EVENT("(GLenum mode = 0x%X)", mode);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002610
2611 try
2612 {
2613 switch (mode)
2614 {
2615 case GL_CW:
2616 case GL_CCW:
2617 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002618 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002619
2620 if (context)
2621 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00002622 context->setFrontFace(mode);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002623 }
2624 }
2625 break;
2626 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002627 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002628 }
2629 }
2630 catch(std::bad_alloc&)
2631 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002632 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002633 }
2634}
2635
2636void __stdcall glGenBuffers(GLsizei n, GLuint* buffers)
2637{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002638 EVENT("(GLsizei n = %d, GLuint* buffers = 0x%0.8p)", n, buffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002639
2640 try
2641 {
2642 if (n < 0)
2643 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002644 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002645 }
2646
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002647 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002648
2649 if (context)
2650 {
2651 for (int i = 0; i < n; i++)
2652 {
2653 buffers[i] = context->createBuffer();
2654 }
2655 }
2656 }
2657 catch(std::bad_alloc&)
2658 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002659 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002660 }
2661}
2662
2663void __stdcall glGenerateMipmap(GLenum target)
2664{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002665 EVENT("(GLenum target = 0x%X)", target);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002666
2667 try
2668 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002669 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com8fd99e22010-04-20 18:52:00 +00002670
2671 if (context)
2672 {
daniel@transgaming.com8fd99e22010-04-20 18:52:00 +00002673 switch (target)
2674 {
2675 case GL_TEXTURE_2D:
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00002676 {
2677 gl::Texture2D *tex2d = context->getTexture2D();
2678
daniel@transgaming.com92f49922012-05-09 15:49:19 +00002679 if (tex2d->isCompressed(0))
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00002680 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002681 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00002682 }
daniel@transgaming.com0c854682012-05-31 01:14:11 +00002683 if (tex2d->isDepth(0))
2684 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002685 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com0c854682012-05-31 01:14:11 +00002686 }
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00002687
2688 tex2d->generateMipmaps();
2689 break;
2690 }
daniel@transgaming.com8fd99e22010-04-20 18:52:00 +00002691
2692 case GL_TEXTURE_CUBE_MAP:
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00002693 {
2694 gl::TextureCubeMap *texcube = context->getTextureCubeMap();
2695
daniel@transgaming.com4df88e82012-05-09 15:49:24 +00002696 if (texcube->isCompressed(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0))
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00002697 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002698 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00002699 }
2700
2701 texcube->generateMipmaps();
2702 break;
2703 }
daniel@transgaming.com8fd99e22010-04-20 18:52:00 +00002704
2705 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002706 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com8fd99e22010-04-20 18:52:00 +00002707 }
daniel@transgaming.com8fd99e22010-04-20 18:52:00 +00002708 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002709 }
2710 catch(std::bad_alloc&)
2711 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002712 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002713 }
2714}
2715
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002716void __stdcall glGenFencesNV(GLsizei n, GLuint* fences)
2717{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002718 EVENT("(GLsizei n = %d, GLuint* fences = 0x%0.8p)", n, fences);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002719
2720 try
2721 {
2722 if (n < 0)
2723 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002724 return gl::error(GL_INVALID_VALUE);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002725 }
2726
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002727 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002728
2729 if (context)
2730 {
2731 for (int i = 0; i < n; i++)
2732 {
2733 fences[i] = context->createFence();
2734 }
2735 }
2736 }
2737 catch(std::bad_alloc&)
2738 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002739 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002740 }
2741}
2742
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002743void __stdcall glGenFramebuffers(GLsizei n, GLuint* framebuffers)
2744{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002745 EVENT("(GLsizei n = %d, GLuint* framebuffers = 0x%0.8p)", n, framebuffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002746
2747 try
2748 {
2749 if (n < 0)
2750 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002751 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002752 }
2753
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002754 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002755
2756 if (context)
2757 {
2758 for (int i = 0; i < n; i++)
2759 {
2760 framebuffers[i] = context->createFramebuffer();
2761 }
2762 }
2763 }
2764 catch(std::bad_alloc&)
2765 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002766 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002767 }
2768}
2769
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00002770void __stdcall glGenQueriesEXT(GLsizei n, GLuint* ids)
2771{
2772 EVENT("(GLsizei n = %d, GLuint* ids = 0x%0.8p)", n, ids);
2773
2774 try
2775 {
2776 if (n < 0)
2777 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002778 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00002779 }
2780
2781 gl::Context *context = gl::getNonLostContext();
2782
2783 if (context)
2784 {
2785 for (int i = 0; i < n; i++)
2786 {
2787 ids[i] = context->createQuery();
2788 }
2789 }
2790 }
2791 catch(std::bad_alloc&)
2792 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002793 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00002794 }
2795}
2796
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002797void __stdcall glGenRenderbuffers(GLsizei n, GLuint* renderbuffers)
2798{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002799 EVENT("(GLsizei n = %d, GLuint* renderbuffers = 0x%0.8p)", n, renderbuffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002800
2801 try
2802 {
2803 if (n < 0)
2804 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002805 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002806 }
2807
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002808 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002809
2810 if (context)
2811 {
2812 for (int i = 0; i < n; i++)
2813 {
2814 renderbuffers[i] = context->createRenderbuffer();
2815 }
2816 }
2817 }
2818 catch(std::bad_alloc&)
2819 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002820 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002821 }
2822}
2823
2824void __stdcall glGenTextures(GLsizei n, GLuint* textures)
2825{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002826 EVENT("(GLsizei n = %d, GLuint* textures = 0x%0.8p)", n, textures);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002827
2828 try
2829 {
2830 if (n < 0)
2831 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002832 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002833 }
2834
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002835 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002836
2837 if (context)
2838 {
2839 for (int i = 0; i < n; i++)
2840 {
2841 textures[i] = context->createTexture();
2842 }
2843 }
2844 }
2845 catch(std::bad_alloc&)
2846 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002847 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002848 }
2849}
2850
daniel@transgaming.com85423182010-04-22 13:35:27 +00002851void __stdcall glGetActiveAttrib(GLuint program, GLuint index, GLsizei bufsize, GLsizei *length, GLint *size, GLenum *type, GLchar *name)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002852{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002853 EVENT("(GLuint program = %d, GLuint index = %d, GLsizei bufsize = %d, GLsizei *length = 0x%0.8p, "
daniel@transgaming.com85423182010-04-22 13:35:27 +00002854 "GLint *size = 0x%0.8p, GLenum *type = %0.8p, GLchar *name = %0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002855 program, index, bufsize, length, size, type, name);
2856
2857 try
2858 {
2859 if (bufsize < 0)
2860 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002861 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002862 }
2863
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002864 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com85423182010-04-22 13:35:27 +00002865
2866 if (context)
2867 {
2868 gl::Program *programObject = context->getProgram(program);
2869
2870 if (!programObject)
2871 {
2872 if (context->getShader(program))
2873 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002874 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com85423182010-04-22 13:35:27 +00002875 }
2876 else
2877 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002878 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com85423182010-04-22 13:35:27 +00002879 }
2880 }
2881
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00002882 if (index >= (GLuint)programObject->getActiveAttributeCount())
daniel@transgaming.com85423182010-04-22 13:35:27 +00002883 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002884 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com85423182010-04-22 13:35:27 +00002885 }
2886
2887 programObject->getActiveAttribute(index, bufsize, length, size, type, name);
2888 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002889 }
2890 catch(std::bad_alloc&)
2891 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002892 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002893 }
2894}
2895
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00002896void __stdcall glGetActiveUniform(GLuint program, GLuint index, GLsizei bufsize, GLsizei* length, GLint* size, GLenum* type, GLchar* name)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002897{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002898 EVENT("(GLuint program = %d, GLuint index = %d, GLsizei bufsize = %d, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00002899 "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 +00002900 program, index, bufsize, length, size, type, name);
2901
2902 try
2903 {
2904 if (bufsize < 0)
2905 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002906 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002907 }
2908
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002909 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00002910
2911 if (context)
2912 {
2913 gl::Program *programObject = context->getProgram(program);
2914
2915 if (!programObject)
2916 {
2917 if (context->getShader(program))
2918 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002919 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00002920 }
2921 else
2922 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002923 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00002924 }
2925 }
2926
2927 if (index >= (GLuint)programObject->getActiveUniformCount())
2928 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002929 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00002930 }
2931
2932 programObject->getActiveUniform(index, bufsize, length, size, type, name);
2933 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002934 }
2935 catch(std::bad_alloc&)
2936 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002937 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002938 }
2939}
2940
2941void __stdcall glGetAttachedShaders(GLuint program, GLsizei maxcount, GLsizei* count, GLuint* shaders)
2942{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002943 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 +00002944 program, maxcount, count, shaders);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002945
2946 try
2947 {
2948 if (maxcount < 0)
2949 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002950 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002951 }
2952
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002953 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com6c785212010-03-30 03:36:17 +00002954
2955 if (context)
2956 {
2957 gl::Program *programObject = context->getProgram(program);
2958
2959 if (!programObject)
2960 {
daniel@transgaming.com23953e32010-04-13 19:53:31 +00002961 if (context->getShader(program))
2962 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002963 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com23953e32010-04-13 19:53:31 +00002964 }
2965 else
2966 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002967 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com23953e32010-04-13 19:53:31 +00002968 }
daniel@transgaming.com6c785212010-03-30 03:36:17 +00002969 }
2970
2971 return programObject->getAttachedShaders(maxcount, count, shaders);
2972 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002973 }
2974 catch(std::bad_alloc&)
2975 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002976 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002977 }
2978}
2979
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00002980int __stdcall glGetAttribLocation(GLuint program, const GLchar* name)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002981{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002982 EVENT("(GLuint program = %d, const GLchar* name = %s)", program, name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002983
2984 try
2985 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002986 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002987
2988 if (context)
2989 {
daniel@transgaming.combb274c32010-04-13 03:26:21 +00002990
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002991 gl::Program *programObject = context->getProgram(program);
2992
2993 if (!programObject)
2994 {
daniel@transgaming.combb274c32010-04-13 03:26:21 +00002995 if (context->getShader(program))
2996 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002997 return gl::error(GL_INVALID_OPERATION, -1);
daniel@transgaming.combb274c32010-04-13 03:26:21 +00002998 }
2999 else
3000 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003001 return gl::error(GL_INVALID_VALUE, -1);
daniel@transgaming.combb274c32010-04-13 03:26:21 +00003002 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003003 }
3004
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003005 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
daniel@transgaming.com716056c2012-07-24 18:38:59 +00003006 if (!programObject->isLinked() || !programBinary)
daniel@transgaming.comcf4aa872010-04-13 03:26:27 +00003007 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003008 return gl::error(GL_INVALID_OPERATION, -1);
daniel@transgaming.comcf4aa872010-04-13 03:26:27 +00003009 }
3010
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003011 return programBinary->getAttributeLocation(name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003012 }
3013 }
3014 catch(std::bad_alloc&)
3015 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003016 return gl::error(GL_OUT_OF_MEMORY, -1);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003017 }
3018
3019 return -1;
3020}
3021
3022void __stdcall glGetBooleanv(GLenum pname, GLboolean* params)
3023{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003024 EVENT("(GLenum pname = 0x%X, GLboolean* params = 0x%0.8p)", pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003025
3026 try
3027 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003028 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003029
3030 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003031 {
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003032 if (!(context->getBooleanv(pname, params)))
3033 {
3034 GLenum nativeType;
3035 unsigned int numParams = 0;
3036 if (!context->getQueryParameterInfo(pname, &nativeType, &numParams))
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003037 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003038
3039 if (numParams == 0)
3040 return; // it is known that the pname is valid, but there are no parameters to return
3041
3042 if (nativeType == GL_FLOAT)
3043 {
3044 GLfloat *floatParams = NULL;
3045 floatParams = new GLfloat[numParams];
3046
3047 context->getFloatv(pname, floatParams);
3048
3049 for (unsigned int i = 0; i < numParams; ++i)
3050 {
3051 if (floatParams[i] == 0.0f)
3052 params[i] = GL_FALSE;
3053 else
3054 params[i] = GL_TRUE;
3055 }
3056
3057 delete [] floatParams;
3058 }
3059 else if (nativeType == GL_INT)
3060 {
3061 GLint *intParams = NULL;
3062 intParams = new GLint[numParams];
3063
3064 context->getIntegerv(pname, intParams);
3065
3066 for (unsigned int i = 0; i < numParams; ++i)
3067 {
3068 if (intParams[i] == 0)
3069 params[i] = GL_FALSE;
3070 else
3071 params[i] = GL_TRUE;
3072 }
3073
3074 delete [] intParams;
3075 }
3076 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003077 }
3078 }
3079 catch(std::bad_alloc&)
3080 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003081 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003082 }
3083}
3084
3085void __stdcall glGetBufferParameteriv(GLenum target, GLenum pname, GLint* params)
3086{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003087 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 +00003088
3089 try
3090 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003091 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comaa0ccbd2010-04-15 20:45:05 +00003092
3093 if (context)
3094 {
3095 gl::Buffer *buffer;
3096
3097 switch (target)
3098 {
3099 case GL_ARRAY_BUFFER:
3100 buffer = context->getArrayBuffer();
3101 break;
3102 case GL_ELEMENT_ARRAY_BUFFER:
3103 buffer = context->getElementArrayBuffer();
3104 break;
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003105 default: return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comaa0ccbd2010-04-15 20:45:05 +00003106 }
3107
3108 if (!buffer)
3109 {
3110 // A null buffer means that "0" is bound to the requested buffer target
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003111 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comaa0ccbd2010-04-15 20:45:05 +00003112 }
3113
3114 switch (pname)
3115 {
3116 case GL_BUFFER_USAGE:
3117 *params = buffer->usage();
3118 break;
3119 case GL_BUFFER_SIZE:
3120 *params = buffer->size();
3121 break;
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003122 default: return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comaa0ccbd2010-04-15 20:45:05 +00003123 }
3124 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003125 }
3126 catch(std::bad_alloc&)
3127 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003128 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003129 }
3130}
3131
3132GLenum __stdcall glGetError(void)
3133{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003134 EVENT("()");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003135
3136 gl::Context *context = gl::getContext();
3137
3138 if (context)
3139 {
daniel@transgaming.com82b28912011-12-12 21:01:35 +00003140 return context->getError();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003141 }
3142
3143 return GL_NO_ERROR;
3144}
3145
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00003146void __stdcall glGetFenceivNV(GLuint fence, GLenum pname, GLint *params)
3147{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003148 EVENT("(GLuint fence = %d, GLenum pname = 0x%X, GLint *params = 0x%0.8p)", fence, pname, params);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00003149
3150 try
3151 {
3152
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003153 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00003154
3155 if (context)
3156 {
3157 gl::Fence *fenceObject = context->getFence(fence);
3158
3159 if (fenceObject == NULL)
3160 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003161 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00003162 }
3163
3164 fenceObject->getFenceiv(pname, params);
3165 }
3166 }
3167 catch(std::bad_alloc&)
3168 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003169 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00003170 }
3171}
3172
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003173void __stdcall glGetFloatv(GLenum pname, GLfloat* params)
3174{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003175 EVENT("(GLenum pname = 0x%X, GLfloat* params = 0x%0.8p)", pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003176
3177 try
3178 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003179 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com32e58cd2010-03-24 09:44:10 +00003180
3181 if (context)
3182 {
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003183 if (!(context->getFloatv(pname, params)))
daniel@transgaming.com32e58cd2010-03-24 09:44:10 +00003184 {
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003185 GLenum nativeType;
3186 unsigned int numParams = 0;
3187 if (!context->getQueryParameterInfo(pname, &nativeType, &numParams))
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003188 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003189
3190 if (numParams == 0)
3191 return; // it is known that the pname is valid, but that there are no parameters to return.
3192
3193 if (nativeType == GL_BOOL)
3194 {
3195 GLboolean *boolParams = NULL;
3196 boolParams = new GLboolean[numParams];
3197
3198 context->getBooleanv(pname, boolParams);
3199
3200 for (unsigned int i = 0; i < numParams; ++i)
3201 {
3202 if (boolParams[i] == GL_FALSE)
3203 params[i] = 0.0f;
3204 else
3205 params[i] = 1.0f;
3206 }
3207
3208 delete [] boolParams;
3209 }
3210 else if (nativeType == GL_INT)
3211 {
3212 GLint *intParams = NULL;
3213 intParams = new GLint[numParams];
3214
3215 context->getIntegerv(pname, intParams);
3216
3217 for (unsigned int i = 0; i < numParams; ++i)
3218 {
3219 params[i] = (GLfloat)intParams[i];
3220 }
3221
3222 delete [] intParams;
3223 }
daniel@transgaming.com32e58cd2010-03-24 09:44:10 +00003224 }
3225 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003226 }
3227 catch(std::bad_alloc&)
3228 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003229 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003230 }
3231}
3232
3233void __stdcall glGetFramebufferAttachmentParameteriv(GLenum target, GLenum attachment, GLenum pname, GLint* params)
3234{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003235 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 +00003236 target, attachment, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003237
3238 try
3239 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003240 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003241
3242 if (context)
3243 {
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00003244 if (target != GL_FRAMEBUFFER && target != GL_DRAW_FRAMEBUFFER_ANGLE && target != GL_READ_FRAMEBUFFER_ANGLE)
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003245 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003246 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003247 }
3248
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00003249 gl::Framebuffer *framebuffer = NULL;
3250 if (target == GL_READ_FRAMEBUFFER_ANGLE)
3251 {
3252 if(context->getReadFramebufferHandle() == 0)
3253 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003254 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00003255 }
3256
3257 framebuffer = context->getReadFramebuffer();
3258 }
3259 else
3260 {
3261 if (context->getDrawFramebufferHandle() == 0)
3262 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003263 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00003264 }
3265
3266 framebuffer = context->getDrawFramebuffer();
3267 }
3268
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003269 GLenum attachmentType;
3270 GLuint attachmentHandle;
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00003271
3272 if (attachment >= GL_COLOR_ATTACHMENT0_EXT && attachment <= GL_COLOR_ATTACHMENT15_EXT)
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003273 {
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00003274 const unsigned int colorAttachment = (attachment - GL_COLOR_ATTACHMENT0_EXT);
3275
3276 if (colorAttachment >= context->getMaximumRenderTargets())
3277 {
3278 return gl::error(GL_INVALID_ENUM);
3279 }
3280
3281 attachmentType = framebuffer->getColorbufferType(colorAttachment);
3282 attachmentHandle = framebuffer->getColorbufferHandle(colorAttachment);
3283 }
3284 else
3285 {
3286 switch (attachment)
3287 {
3288 case GL_DEPTH_ATTACHMENT:
3289 attachmentType = framebuffer->getDepthbufferType();
3290 attachmentHandle = framebuffer->getDepthbufferHandle();
3291 break;
3292 case GL_STENCIL_ATTACHMENT:
3293 attachmentType = framebuffer->getStencilbufferType();
3294 attachmentHandle = framebuffer->getStencilbufferHandle();
3295 break;
3296 default: return gl::error(GL_INVALID_ENUM);
3297 }
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003298 }
3299
3300 GLenum attachmentObjectType; // Type category
daniel@transgaming.comfbc09532010-04-26 15:33:41 +00003301 if (attachmentType == GL_NONE || attachmentType == GL_RENDERBUFFER)
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003302 {
3303 attachmentObjectType = attachmentType;
3304 }
apatrick@chromium.org551022e2012-01-23 19:56:54 +00003305 else if (gl::IsInternalTextureTarget(attachmentType))
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003306 {
3307 attachmentObjectType = GL_TEXTURE;
3308 }
apatrick@chromium.orga1d80592012-01-25 21:52:10 +00003309 else
3310 {
3311 UNREACHABLE();
3312 return;
3313 }
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003314
3315 switch (pname)
3316 {
3317 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE:
3318 *params = attachmentObjectType;
3319 break;
3320 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME:
3321 if (attachmentObjectType == GL_RENDERBUFFER || attachmentObjectType == GL_TEXTURE)
3322 {
3323 *params = attachmentHandle;
3324 }
3325 else
3326 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003327 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003328 }
3329 break;
3330 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL:
3331 if (attachmentObjectType == GL_TEXTURE)
3332 {
3333 *params = 0; // FramebufferTexture2D will not allow level to be set to anything else in GL ES 2.0
3334 }
3335 else
3336 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003337 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003338 }
3339 break;
3340 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE:
3341 if (attachmentObjectType == GL_TEXTURE)
3342 {
daniel@transgaming.com19ffc242010-05-04 03:35:21 +00003343 if (gl::IsCubemapTextureTarget(attachmentType))
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003344 {
3345 *params = attachmentType;
3346 }
3347 else
3348 {
3349 *params = 0;
3350 }
3351 }
3352 else
3353 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003354 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003355 }
3356 break;
3357 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003358 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003359 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003360 }
3361 }
3362 catch(std::bad_alloc&)
3363 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003364 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003365 }
3366}
3367
daniel@transgaming.com17f548c2011-11-09 17:47:02 +00003368GLenum __stdcall glGetGraphicsResetStatusEXT(void)
3369{
3370 EVENT("()");
3371
3372 try
3373 {
3374 gl::Context *context = gl::getContext();
3375
3376 if (context)
3377 {
3378 return context->getResetStatus();
3379 }
3380
3381 return GL_NO_ERROR;
3382 }
3383 catch(std::bad_alloc&)
3384 {
3385 return GL_OUT_OF_MEMORY;
3386 }
3387}
3388
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003389void __stdcall glGetIntegerv(GLenum pname, GLint* params)
3390{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003391 EVENT("(GLenum pname = 0x%X, GLint* params = 0x%0.8p)", pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003392
3393 try
3394 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003395 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003396
3397 if (context)
3398 {
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003399 if (!(context->getIntegerv(pname, params)))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003400 {
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003401 GLenum nativeType;
3402 unsigned int numParams = 0;
3403 if (!context->getQueryParameterInfo(pname, &nativeType, &numParams))
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003404 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003405
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003406 if (numParams == 0)
3407 return; // it is known that pname is valid, but there are no parameters to return
3408
3409 if (nativeType == GL_BOOL)
3410 {
3411 GLboolean *boolParams = NULL;
3412 boolParams = new GLboolean[numParams];
3413
3414 context->getBooleanv(pname, boolParams);
3415
3416 for (unsigned int i = 0; i < numParams; ++i)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003417 {
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003418 if (boolParams[i] == GL_FALSE)
3419 params[i] = 0;
3420 else
3421 params[i] = 1;
3422 }
3423
3424 delete [] boolParams;
3425 }
3426 else if (nativeType == GL_FLOAT)
3427 {
3428 GLfloat *floatParams = NULL;
3429 floatParams = new GLfloat[numParams];
3430
3431 context->getFloatv(pname, floatParams);
3432
3433 for (unsigned int i = 0; i < numParams; ++i)
3434 {
daniel@transgaming.comc1641352010-04-26 15:33:36 +00003435 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 +00003436 {
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003437 params[i] = (GLint)(((GLfloat)(0xFFFFFFFF) * floatParams[i] - 1.0f) / 2.0f);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003438 }
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003439 else
3440 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 +00003441 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003442
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003443 delete [] floatParams;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003444 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003445 }
3446 }
3447 }
3448 catch(std::bad_alloc&)
3449 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003450 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003451 }
3452}
3453
3454void __stdcall glGetProgramiv(GLuint program, GLenum pname, GLint* params)
3455{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003456 EVENT("(GLuint program = %d, GLenum pname = %d, GLint* params = 0x%0.8p)", program, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003457
3458 try
3459 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003460 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003461
3462 if (context)
3463 {
3464 gl::Program *programObject = context->getProgram(program);
3465
3466 if (!programObject)
3467 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003468 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003469 }
3470
3471 switch (pname)
3472 {
3473 case GL_DELETE_STATUS:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003474 *params = programObject->isFlaggedForDeletion();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003475 return;
3476 case GL_LINK_STATUS:
daniel@transgaming.com716056c2012-07-24 18:38:59 +00003477 *params = programObject->isLinked();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003478 return;
3479 case GL_VALIDATE_STATUS:
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00003480 *params = programObject->isValidated();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003481 return;
3482 case GL_INFO_LOG_LENGTH:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003483 *params = programObject->getInfoLogLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003484 return;
3485 case GL_ATTACHED_SHADERS:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003486 *params = programObject->getAttachedShadersCount();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003487 return;
3488 case GL_ACTIVE_ATTRIBUTES:
daniel@transgaming.com85423182010-04-22 13:35:27 +00003489 *params = programObject->getActiveAttributeCount();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003490 return;
3491 case GL_ACTIVE_ATTRIBUTE_MAX_LENGTH:
daniel@transgaming.com85423182010-04-22 13:35:27 +00003492 *params = programObject->getActiveAttributeMaxLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003493 return;
3494 case GL_ACTIVE_UNIFORMS:
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00003495 *params = programObject->getActiveUniformCount();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003496 return;
3497 case GL_ACTIVE_UNIFORM_MAX_LENGTH:
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00003498 *params = programObject->getActiveUniformMaxLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003499 return;
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00003500 case GL_PROGRAM_BINARY_LENGTH_OES:
apatrick@chromium.org90080e32012-07-09 22:15:33 +00003501 *params = programObject->getProgramBinaryLength();
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00003502 return;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003503 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003504 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003505 }
3506 }
3507 }
3508 catch(std::bad_alloc&)
3509 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003510 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003511 }
3512}
3513
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00003514void __stdcall glGetProgramInfoLog(GLuint program, GLsizei bufsize, GLsizei* length, GLchar* infolog)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003515{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003516 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 +00003517 program, bufsize, length, infolog);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003518
3519 try
3520 {
3521 if (bufsize < 0)
3522 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003523 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003524 }
3525
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003526 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003527
3528 if (context)
3529 {
3530 gl::Program *programObject = context->getProgram(program);
3531
3532 if (!programObject)
3533 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003534 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003535 }
3536
3537 programObject->getInfoLog(bufsize, length, infolog);
3538 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003539 }
3540 catch(std::bad_alloc&)
3541 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003542 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003543 }
3544}
3545
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003546void __stdcall glGetQueryivEXT(GLenum target, GLenum pname, GLint *params)
3547{
3548 EVENT("GLenum target = 0x%X, GLenum pname = 0x%X, GLint *params = 0x%0.8p)", target, pname, params);
3549
3550 try
3551 {
3552 switch (pname)
3553 {
3554 case GL_CURRENT_QUERY_EXT:
3555 break;
3556 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003557 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003558 }
3559
3560 gl::Context *context = gl::getNonLostContext();
3561
3562 if (context)
3563 {
3564 params[0] = context->getActiveQuery(target);
3565 }
3566 }
3567 catch(std::bad_alloc&)
3568 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003569 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003570 }
3571}
3572
3573void __stdcall glGetQueryObjectuivEXT(GLuint id, GLenum pname, GLuint *params)
3574{
3575 EVENT("(GLuint id = %d, GLenum pname = 0x%X, GLuint *params = 0x%0.8p)", id, pname, params);
3576
3577 try
3578 {
3579 switch (pname)
3580 {
3581 case GL_QUERY_RESULT_EXT:
3582 case GL_QUERY_RESULT_AVAILABLE_EXT:
3583 break;
3584 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003585 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003586 }
3587 gl::Context *context = gl::getNonLostContext();
3588
3589 if (context)
3590 {
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003591 gl::Query *queryObject = context->getQuery(id, false, GL_NONE);
3592
3593 if (!queryObject)
3594 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003595 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003596 }
3597
3598 if (context->getActiveQuery(queryObject->getType()) == id)
3599 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003600 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003601 }
3602
3603 switch(pname)
3604 {
3605 case GL_QUERY_RESULT_EXT:
3606 params[0] = queryObject->getResult();
3607 break;
3608 case GL_QUERY_RESULT_AVAILABLE_EXT:
3609 params[0] = queryObject->isResultAvailable();
3610 break;
3611 default:
3612 ASSERT(false);
3613 }
3614 }
3615 }
3616 catch(std::bad_alloc&)
3617 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003618 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003619 }
3620}
3621
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003622void __stdcall glGetRenderbufferParameteriv(GLenum target, GLenum pname, GLint* params)
3623{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003624 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 +00003625
3626 try
3627 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003628 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003629
3630 if (context)
3631 {
3632 if (target != GL_RENDERBUFFER)
3633 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003634 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003635 }
3636
daniel@transgaming.com428d1582010-05-04 03:35:25 +00003637 if (context->getRenderbufferHandle() == 0)
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003638 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003639 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003640 }
3641
daniel@transgaming.com428d1582010-05-04 03:35:25 +00003642 gl::Renderbuffer *renderbuffer = context->getRenderbuffer(context->getRenderbufferHandle());
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003643
3644 switch (pname)
3645 {
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +00003646 case GL_RENDERBUFFER_WIDTH: *params = renderbuffer->getWidth(); break;
3647 case GL_RENDERBUFFER_HEIGHT: *params = renderbuffer->getHeight(); break;
3648 case GL_RENDERBUFFER_INTERNAL_FORMAT: *params = renderbuffer->getInternalFormat(); break;
3649 case GL_RENDERBUFFER_RED_SIZE: *params = renderbuffer->getRedSize(); break;
3650 case GL_RENDERBUFFER_GREEN_SIZE: *params = renderbuffer->getGreenSize(); break;
3651 case GL_RENDERBUFFER_BLUE_SIZE: *params = renderbuffer->getBlueSize(); break;
3652 case GL_RENDERBUFFER_ALPHA_SIZE: *params = renderbuffer->getAlphaSize(); break;
3653 case GL_RENDERBUFFER_DEPTH_SIZE: *params = renderbuffer->getDepthSize(); break;
3654 case GL_RENDERBUFFER_STENCIL_SIZE: *params = renderbuffer->getStencilSize(); break;
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00003655 case GL_RENDERBUFFER_SAMPLES_ANGLE:
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +00003656 if (context->getMaxSupportedSamples() != 0)
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00003657 {
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +00003658 *params = renderbuffer->getSamples();
3659 }
3660 else
3661 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003662 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00003663 }
3664 break;
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003665 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003666 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003667 }
3668 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003669 }
3670 catch(std::bad_alloc&)
3671 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003672 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003673 }
3674}
3675
3676void __stdcall glGetShaderiv(GLuint shader, GLenum pname, GLint* params)
3677{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003678 EVENT("(GLuint shader = %d, GLenum pname = %d, GLint* params = 0x%0.8p)", shader, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003679
3680 try
3681 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003682 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003683
3684 if (context)
3685 {
3686 gl::Shader *shaderObject = context->getShader(shader);
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00003687
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003688 if (!shaderObject)
3689 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003690 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003691 }
3692
3693 switch (pname)
3694 {
3695 case GL_SHADER_TYPE:
3696 *params = shaderObject->getType();
3697 return;
3698 case GL_DELETE_STATUS:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003699 *params = shaderObject->isFlaggedForDeletion();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003700 return;
3701 case GL_COMPILE_STATUS:
3702 *params = shaderObject->isCompiled() ? GL_TRUE : GL_FALSE;
3703 return;
3704 case GL_INFO_LOG_LENGTH:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003705 *params = shaderObject->getInfoLogLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003706 return;
3707 case GL_SHADER_SOURCE_LENGTH:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003708 *params = shaderObject->getSourceLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003709 return;
zmo@google.coma574f782011-10-03 21:45:23 +00003710 case GL_TRANSLATED_SHADER_SOURCE_LENGTH_ANGLE:
3711 *params = shaderObject->getTranslatedSourceLength();
3712 return;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003713 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003714 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003715 }
3716 }
3717 }
3718 catch(std::bad_alloc&)
3719 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003720 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003721 }
3722}
3723
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00003724void __stdcall glGetShaderInfoLog(GLuint shader, GLsizei bufsize, GLsizei* length, GLchar* infolog)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003725{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003726 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 +00003727 shader, bufsize, length, infolog);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003728
3729 try
3730 {
3731 if (bufsize < 0)
3732 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003733 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003734 }
3735
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003736 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003737
3738 if (context)
3739 {
3740 gl::Shader *shaderObject = context->getShader(shader);
3741
3742 if (!shaderObject)
3743 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003744 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003745 }
3746
3747 shaderObject->getInfoLog(bufsize, length, infolog);
3748 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003749 }
3750 catch(std::bad_alloc&)
3751 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003752 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003753 }
3754}
3755
3756void __stdcall glGetShaderPrecisionFormat(GLenum shadertype, GLenum precisiontype, GLint* range, GLint* precision)
3757{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003758 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 +00003759 shadertype, precisiontype, range, precision);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003760
3761 try
3762 {
daniel@transgaming.com6c785212010-03-30 03:36:17 +00003763 switch (shadertype)
3764 {
3765 case GL_VERTEX_SHADER:
3766 case GL_FRAGMENT_SHADER:
3767 break;
3768 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003769 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com6c785212010-03-30 03:36:17 +00003770 }
3771
3772 switch (precisiontype)
3773 {
3774 case GL_LOW_FLOAT:
3775 case GL_MEDIUM_FLOAT:
3776 case GL_HIGH_FLOAT:
3777 // Assume IEEE 754 precision
3778 range[0] = 127;
3779 range[1] = 127;
daniel@transgaming.comc5c15382010-04-23 18:34:49 +00003780 *precision = 23;
daniel@transgaming.com6c785212010-03-30 03:36:17 +00003781 break;
3782 case GL_LOW_INT:
3783 case GL_MEDIUM_INT:
3784 case GL_HIGH_INT:
3785 // Some (most) hardware only supports single-precision floating-point numbers,
3786 // which can accurately represent integers up to +/-16777216
3787 range[0] = 24;
3788 range[1] = 24;
daniel@transgaming.comc5c15382010-04-23 18:34:49 +00003789 *precision = 0;
daniel@transgaming.com6c785212010-03-30 03:36:17 +00003790 break;
3791 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003792 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com6c785212010-03-30 03:36:17 +00003793 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003794 }
3795 catch(std::bad_alloc&)
3796 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003797 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003798 }
3799}
3800
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00003801void __stdcall glGetShaderSource(GLuint shader, GLsizei bufsize, GLsizei* length, GLchar* source)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003802{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003803 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 +00003804 shader, bufsize, length, source);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003805
3806 try
3807 {
3808 if (bufsize < 0)
3809 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003810 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003811 }
3812
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003813 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003814
3815 if (context)
3816 {
3817 gl::Shader *shaderObject = context->getShader(shader);
3818
3819 if (!shaderObject)
3820 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003821 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003822 }
3823
3824 shaderObject->getSource(bufsize, length, source);
3825 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003826 }
3827 catch(std::bad_alloc&)
3828 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003829 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003830 }
3831}
3832
zmo@google.coma574f782011-10-03 21:45:23 +00003833void __stdcall glGetTranslatedShaderSourceANGLE(GLuint shader, GLsizei bufsize, GLsizei* length, GLchar* source)
3834{
3835 EVENT("(GLuint shader = %d, GLsizei bufsize = %d, GLsizei* length = 0x%0.8p, GLchar* source = 0x%0.8p)",
3836 shader, bufsize, length, source);
3837
3838 try
3839 {
3840 if (bufsize < 0)
3841 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003842 return gl::error(GL_INVALID_VALUE);
zmo@google.coma574f782011-10-03 21:45:23 +00003843 }
3844
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003845 gl::Context *context = gl::getNonLostContext();
zmo@google.coma574f782011-10-03 21:45:23 +00003846
3847 if (context)
3848 {
3849 gl::Shader *shaderObject = context->getShader(shader);
3850
3851 if (!shaderObject)
3852 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003853 return gl::error(GL_INVALID_OPERATION);
zmo@google.coma574f782011-10-03 21:45:23 +00003854 }
3855
3856 shaderObject->getTranslatedSource(bufsize, length, source);
3857 }
3858 }
3859 catch(std::bad_alloc&)
3860 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003861 return gl::error(GL_OUT_OF_MEMORY);
zmo@google.coma574f782011-10-03 21:45:23 +00003862 }
3863}
3864
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003865const GLubyte* __stdcall glGetString(GLenum name)
3866{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003867 EVENT("(GLenum name = 0x%X)", name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003868
3869 try
3870 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003871 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com3e4c6002010-05-05 18:50:13 +00003872
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003873 switch (name)
3874 {
3875 case GL_VENDOR:
daniel@transgaming.coma0ce7e62011-01-25 14:47:16 +00003876 return (GLubyte*)"Google Inc.";
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003877 case GL_RENDERER:
daniel@transgaming.comc23ff642011-08-16 20:28:45 +00003878 return (GLubyte*)((context != NULL) ? context->getRendererString() : "ANGLE");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003879 case GL_VERSION:
daniel@transgaming.com1825d8e2012-08-27 16:25:29 +00003880 return (GLubyte*)"OpenGL ES 2.0 (ANGLE " VERSION_STRING ")";
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003881 case GL_SHADING_LANGUAGE_VERSION:
daniel@transgaming.com1825d8e2012-08-27 16:25:29 +00003882 return (GLubyte*)"OpenGL ES GLSL ES 1.00 (ANGLE " VERSION_STRING ")";
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003883 case GL_EXTENSIONS:
daniel@transgaming.com3e4c6002010-05-05 18:50:13 +00003884 return (GLubyte*)((context != NULL) ? context->getExtensionString() : "");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003885 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003886 return gl::error(GL_INVALID_ENUM, (GLubyte*)NULL);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003887 }
3888 }
3889 catch(std::bad_alloc&)
3890 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003891 return gl::error(GL_OUT_OF_MEMORY, (GLubyte*)NULL);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003892 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003893}
3894
3895void __stdcall glGetTexParameterfv(GLenum target, GLenum pname, GLfloat* params)
3896{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003897 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 +00003898
3899 try
3900 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003901 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003902
3903 if (context)
3904 {
3905 gl::Texture *texture;
3906
3907 switch (target)
3908 {
3909 case GL_TEXTURE_2D:
3910 texture = context->getTexture2D();
3911 break;
3912 case GL_TEXTURE_CUBE_MAP:
3913 texture = context->getTextureCubeMap();
3914 break;
3915 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003916 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003917 }
3918
3919 switch (pname)
3920 {
3921 case GL_TEXTURE_MAG_FILTER:
3922 *params = (GLfloat)texture->getMagFilter();
3923 break;
3924 case GL_TEXTURE_MIN_FILTER:
3925 *params = (GLfloat)texture->getMinFilter();
3926 break;
3927 case GL_TEXTURE_WRAP_S:
3928 *params = (GLfloat)texture->getWrapS();
3929 break;
3930 case GL_TEXTURE_WRAP_T:
3931 *params = (GLfloat)texture->getWrapT();
3932 break;
daniel@transgaming.comd30bd0a2011-11-11 04:10:34 +00003933 case GL_TEXTURE_IMMUTABLE_FORMAT_EXT:
3934 *params = (GLfloat)(texture->isImmutable() ? GL_TRUE : GL_FALSE);
3935 break;
daniel@transgaming.com7d18c172011-11-11 04:18:21 +00003936 case GL_TEXTURE_USAGE_ANGLE:
3937 *params = (GLfloat)texture->getUsage();
3938 break;
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00003939 case GL_TEXTURE_MAX_ANISOTROPY_EXT:
3940 if (!context->supportsTextureFilterAnisotropy())
3941 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003942 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00003943 }
3944 *params = (GLfloat)texture->getMaxAnisotropy();
3945 break;
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003946 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003947 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003948 }
3949 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003950 }
3951 catch(std::bad_alloc&)
3952 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003953 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003954 }
3955}
3956
3957void __stdcall glGetTexParameteriv(GLenum target, GLenum pname, GLint* params)
3958{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003959 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 +00003960
3961 try
3962 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003963 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003964
3965 if (context)
3966 {
3967 gl::Texture *texture;
3968
3969 switch (target)
3970 {
3971 case GL_TEXTURE_2D:
3972 texture = context->getTexture2D();
3973 break;
3974 case GL_TEXTURE_CUBE_MAP:
3975 texture = context->getTextureCubeMap();
3976 break;
3977 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003978 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003979 }
3980
3981 switch (pname)
3982 {
3983 case GL_TEXTURE_MAG_FILTER:
3984 *params = texture->getMagFilter();
3985 break;
3986 case GL_TEXTURE_MIN_FILTER:
3987 *params = texture->getMinFilter();
3988 break;
3989 case GL_TEXTURE_WRAP_S:
3990 *params = texture->getWrapS();
3991 break;
3992 case GL_TEXTURE_WRAP_T:
3993 *params = texture->getWrapT();
3994 break;
daniel@transgaming.comd30bd0a2011-11-11 04:10:34 +00003995 case GL_TEXTURE_IMMUTABLE_FORMAT_EXT:
3996 *params = texture->isImmutable() ? GL_TRUE : GL_FALSE;
3997 break;
daniel@transgaming.com7d18c172011-11-11 04:18:21 +00003998 case GL_TEXTURE_USAGE_ANGLE:
3999 *params = texture->getUsage();
4000 break;
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00004001 case GL_TEXTURE_MAX_ANISOTROPY_EXT:
4002 if (!context->supportsTextureFilterAnisotropy())
4003 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004004 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00004005 }
4006 *params = (GLint)texture->getMaxAnisotropy();
4007 break;
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00004008 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004009 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00004010 }
4011 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004012 }
4013 catch(std::bad_alloc&)
4014 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004015 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004016 }
4017}
4018
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004019void __stdcall glGetnUniformfvEXT(GLuint program, GLint location, GLsizei bufSize, GLfloat* params)
4020{
4021 EVENT("(GLuint program = %d, GLint location = %d, GLsizei bufSize = %d, GLfloat* params = 0x%0.8p)",
4022 program, location, bufSize, params);
4023
4024 try
4025 {
4026 if (bufSize < 0)
4027 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004028 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004029 }
4030
4031 gl::Context *context = gl::getNonLostContext();
4032
4033 if (context)
4034 {
4035 if (program == 0)
4036 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004037 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004038 }
4039
4040 gl::Program *programObject = context->getProgram(program);
4041
daniel@transgaming.com716056c2012-07-24 18:38:59 +00004042 if (!programObject || !programObject->isLinked())
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004043 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004044 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004045 }
4046
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00004047 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
4048 if (!programBinary)
4049 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004050 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00004051 }
4052
4053 if (!programBinary->getUniformfv(location, &bufSize, params))
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004054 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004055 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004056 }
4057 }
4058 }
4059 catch(std::bad_alloc&)
4060 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004061 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004062 }
4063}
4064
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004065void __stdcall glGetUniformfv(GLuint program, GLint location, GLfloat* params)
4066{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004067 EVENT("(GLuint program = %d, GLint location = %d, GLfloat* params = 0x%0.8p)", program, location, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004068
4069 try
4070 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004071 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004072
4073 if (context)
4074 {
4075 if (program == 0)
4076 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004077 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004078 }
4079
4080 gl::Program *programObject = context->getProgram(program);
4081
daniel@transgaming.com716056c2012-07-24 18:38:59 +00004082 if (!programObject || !programObject->isLinked())
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004083 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004084 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004085 }
4086
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00004087 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
4088 if (!programBinary)
4089 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004090 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00004091 }
4092
4093 if (!programBinary->getUniformfv(location, NULL, params))
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004094 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004095 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004096 }
4097 }
4098 }
4099 catch(std::bad_alloc&)
4100 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004101 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004102 }
4103}
4104
4105void __stdcall glGetnUniformivEXT(GLuint program, GLint location, GLsizei bufSize, GLint* params)
4106{
4107 EVENT("(GLuint program = %d, GLint location = %d, GLsizei bufSize = %d, GLint* params = 0x%0.8p)",
4108 program, location, bufSize, params);
4109
4110 try
4111 {
4112 if (bufSize < 0)
4113 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004114 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004115 }
4116
4117 gl::Context *context = gl::getNonLostContext();
4118
4119 if (context)
4120 {
4121 if (program == 0)
4122 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004123 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004124 }
4125
4126 gl::Program *programObject = context->getProgram(program);
4127
daniel@transgaming.com716056c2012-07-24 18:38:59 +00004128 if (!programObject || !programObject->isLinked())
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004129 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004130 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004131 }
4132
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00004133 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
4134 if (!programBinary)
4135 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004136 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00004137 }
4138
4139 if (!programBinary->getUniformiv(location, &bufSize, params))
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004140 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004141 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004142 }
4143 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004144 }
4145 catch(std::bad_alloc&)
4146 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004147 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004148 }
4149}
4150
4151void __stdcall glGetUniformiv(GLuint program, GLint location, GLint* params)
4152{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004153 EVENT("(GLuint program = %d, GLint location = %d, GLint* params = 0x%0.8p)", program, location, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004154
4155 try
4156 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004157 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004158
4159 if (context)
4160 {
4161 if (program == 0)
4162 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004163 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004164 }
4165
4166 gl::Program *programObject = context->getProgram(program);
4167
daniel@transgaming.com716056c2012-07-24 18:38:59 +00004168 if (!programObject || !programObject->isLinked())
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004169 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004170 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004171 }
4172
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00004173 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
4174 if (!programBinary)
4175 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004176 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00004177 }
4178
4179 if (!programBinary->getUniformiv(location, NULL, params))
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004180 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004181 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004182 }
4183 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004184 }
4185 catch(std::bad_alloc&)
4186 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004187 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004188 }
4189}
4190
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00004191int __stdcall glGetUniformLocation(GLuint program, const GLchar* name)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004192{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004193 EVENT("(GLuint program = %d, const GLchar* name = 0x%0.8p)", program, name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004194
4195 try
4196 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004197 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004198
4199 if (strstr(name, "gl_") == name)
4200 {
4201 return -1;
4202 }
4203
4204 if (context)
4205 {
4206 gl::Program *programObject = context->getProgram(program);
4207
4208 if (!programObject)
4209 {
daniel@transgaming.comd1abe5b2010-04-13 19:53:33 +00004210 if (context->getShader(program))
4211 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004212 return gl::error(GL_INVALID_OPERATION, -1);
daniel@transgaming.comd1abe5b2010-04-13 19:53:33 +00004213 }
4214 else
4215 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004216 return gl::error(GL_INVALID_VALUE, -1);
daniel@transgaming.comd1abe5b2010-04-13 19:53:33 +00004217 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004218 }
4219
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00004220 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
daniel@transgaming.com716056c2012-07-24 18:38:59 +00004221 if (!programObject->isLinked() || !programBinary)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004222 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004223 return gl::error(GL_INVALID_OPERATION, -1);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004224 }
4225
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00004226 return programBinary->getUniformLocation(name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004227 }
4228 }
4229 catch(std::bad_alloc&)
4230 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004231 return gl::error(GL_OUT_OF_MEMORY, -1);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004232 }
4233
4234 return -1;
4235}
4236
4237void __stdcall glGetVertexAttribfv(GLuint index, GLenum pname, GLfloat* params)
4238{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004239 EVENT("(GLuint index = %d, GLenum pname = 0x%X, GLfloat* params = 0x%0.8p)", index, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004240
4241 try
4242 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004243 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004244
daniel@transgaming.come0078962010-04-15 20:45:08 +00004245 if (context)
4246 {
4247 if (index >= gl::MAX_VERTEX_ATTRIBS)
4248 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004249 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004250 }
4251
daniel@transgaming.com83921382011-01-08 05:46:00 +00004252 const gl::VertexAttribute &attribState = context->getVertexAttribState(index);
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004253
daniel@transgaming.come0078962010-04-15 20:45:08 +00004254 switch (pname)
4255 {
4256 case GL_VERTEX_ATTRIB_ARRAY_ENABLED:
daniel@transgaming.com83921382011-01-08 05:46:00 +00004257 *params = (GLfloat)(attribState.mArrayEnabled ? GL_TRUE : GL_FALSE);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004258 break;
4259 case GL_VERTEX_ATTRIB_ARRAY_SIZE:
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004260 *params = (GLfloat)attribState.mSize;
daniel@transgaming.come0078962010-04-15 20:45:08 +00004261 break;
4262 case GL_VERTEX_ATTRIB_ARRAY_STRIDE:
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004263 *params = (GLfloat)attribState.mStride;
daniel@transgaming.come0078962010-04-15 20:45:08 +00004264 break;
4265 case GL_VERTEX_ATTRIB_ARRAY_TYPE:
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004266 *params = (GLfloat)attribState.mType;
daniel@transgaming.come0078962010-04-15 20:45:08 +00004267 break;
4268 case GL_VERTEX_ATTRIB_ARRAY_NORMALIZED:
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004269 *params = (GLfloat)(attribState.mNormalized ? GL_TRUE : GL_FALSE);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004270 break;
4271 case GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING:
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +00004272 *params = (GLfloat)attribState.mBoundBuffer.id();
daniel@transgaming.come0078962010-04-15 20:45:08 +00004273 break;
4274 case GL_CURRENT_VERTEX_ATTRIB:
4275 for (int i = 0; i < 4; ++i)
4276 {
shannon.woods%transgaming.com@gtempaccount.com3026dc72013-04-13 03:37:27 +00004277 params[i] = attribState.mCurrentValue.FloatValues[i];
daniel@transgaming.come0078962010-04-15 20:45:08 +00004278 }
4279 break;
shannon.woods%transgaming.com@gtempaccount.com14eb55e2013-04-13 03:35:06 +00004280 case GL_VERTEX_ATTRIB_ARRAY_DIVISOR:
4281 // Don't verify ES3 context because GL_VERTEX_ATTRIB_ARRAY_DIVISOR_ANGLE uses
4282 // the same constant.
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00004283 *params = (GLfloat)attribState.mDivisor;
4284 break;
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004285 default: return gl::error(GL_INVALID_ENUM);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004286 }
4287 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004288 }
4289 catch(std::bad_alloc&)
4290 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004291 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004292 }
4293}
4294
4295void __stdcall glGetVertexAttribiv(GLuint index, GLenum pname, GLint* params)
4296{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004297 EVENT("(GLuint index = %d, GLenum pname = 0x%X, GLint* params = 0x%0.8p)", index, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004298
4299 try
4300 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004301 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004302
daniel@transgaming.come0078962010-04-15 20:45:08 +00004303 if (context)
4304 {
4305 if (index >= gl::MAX_VERTEX_ATTRIBS)
4306 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004307 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004308 }
4309
daniel@transgaming.com83921382011-01-08 05:46:00 +00004310 const gl::VertexAttribute &attribState = context->getVertexAttribState(index);
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004311
daniel@transgaming.come0078962010-04-15 20:45:08 +00004312 switch (pname)
4313 {
4314 case GL_VERTEX_ATTRIB_ARRAY_ENABLED:
daniel@transgaming.com83921382011-01-08 05:46:00 +00004315 *params = (attribState.mArrayEnabled ? GL_TRUE : GL_FALSE);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004316 break;
4317 case GL_VERTEX_ATTRIB_ARRAY_SIZE:
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004318 *params = attribState.mSize;
daniel@transgaming.come0078962010-04-15 20:45:08 +00004319 break;
4320 case GL_VERTEX_ATTRIB_ARRAY_STRIDE:
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004321 *params = attribState.mStride;
daniel@transgaming.come0078962010-04-15 20:45:08 +00004322 break;
4323 case GL_VERTEX_ATTRIB_ARRAY_TYPE:
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004324 *params = attribState.mType;
daniel@transgaming.come0078962010-04-15 20:45:08 +00004325 break;
4326 case GL_VERTEX_ATTRIB_ARRAY_NORMALIZED:
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004327 *params = (attribState.mNormalized ? GL_TRUE : GL_FALSE);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004328 break;
4329 case GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING:
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +00004330 *params = attribState.mBoundBuffer.id();
daniel@transgaming.come0078962010-04-15 20:45:08 +00004331 break;
4332 case GL_CURRENT_VERTEX_ATTRIB:
4333 for (int i = 0; i < 4; ++i)
4334 {
shannon.woods%transgaming.com@gtempaccount.com3026dc72013-04-13 03:37:27 +00004335 float currentValue = attribState.mCurrentValue.FloatValues[i];
daniel@transgaming.come0078962010-04-15 20:45:08 +00004336 params[i] = (GLint)(currentValue > 0.0f ? floor(currentValue + 0.5f) : ceil(currentValue - 0.5f));
4337 }
4338 break;
shannon.woods%transgaming.com@gtempaccount.com14eb55e2013-04-13 03:35:06 +00004339 case GL_VERTEX_ATTRIB_ARRAY_DIVISOR:
4340 // Don't verify ES3 context because GL_VERTEX_ATTRIB_ARRAY_DIVISOR_ANGLE uses
4341 // the same constant.
4342 META_ASSERT(GL_VERTEX_ATTRIB_ARRAY_DIVISOR == GL_VERTEX_ATTRIB_ARRAY_DIVISOR_ANGLE);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00004343 *params = (GLint)attribState.mDivisor;
4344 break;
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004345 default: return gl::error(GL_INVALID_ENUM);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004346 }
4347 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004348 }
4349 catch(std::bad_alloc&)
4350 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004351 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004352 }
4353}
4354
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00004355void __stdcall glGetVertexAttribPointerv(GLuint index, GLenum pname, GLvoid** pointer)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004356{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004357 EVENT("(GLuint index = %d, GLenum pname = 0x%X, GLvoid** pointer = 0x%0.8p)", index, pname, pointer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004358
4359 try
4360 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004361 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004362
daniel@transgaming.come0078962010-04-15 20:45:08 +00004363 if (context)
4364 {
4365 if (index >= gl::MAX_VERTEX_ATTRIBS)
4366 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004367 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004368 }
4369
4370 if (pname != GL_VERTEX_ATTRIB_ARRAY_POINTER)
4371 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004372 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004373 }
4374
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004375 *pointer = const_cast<GLvoid*>(context->getVertexAttribPointer(index));
daniel@transgaming.come0078962010-04-15 20:45:08 +00004376 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004377 }
4378 catch(std::bad_alloc&)
4379 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004380 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004381 }
4382}
4383
4384void __stdcall glHint(GLenum target, GLenum mode)
4385{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004386 EVENT("(GLenum target = 0x%X, GLenum mode = 0x%X)", target, mode);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004387
4388 try
4389 {
alokp@chromium.orgd303ef92010-09-09 17:30:15 +00004390 switch (mode)
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00004391 {
alokp@chromium.orgd303ef92010-09-09 17:30:15 +00004392 case GL_FASTEST:
4393 case GL_NICEST:
4394 case GL_DONT_CARE:
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00004395 break;
4396 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004397 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00004398 }
4399
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004400 gl::Context *context = gl::getNonLostContext();
alokp@chromium.orgd303ef92010-09-09 17:30:15 +00004401 switch (target)
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00004402 {
alokp@chromium.orgd303ef92010-09-09 17:30:15 +00004403 case GL_GENERATE_MIPMAP_HINT:
4404 if (context) context->setGenerateMipmapHint(mode);
4405 break;
4406 case GL_FRAGMENT_SHADER_DERIVATIVE_HINT_OES:
4407 if (context) context->setFragmentShaderDerivativeHint(mode);
4408 break;
4409 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004410 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00004411 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004412 }
4413 catch(std::bad_alloc&)
4414 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004415 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004416 }
4417}
4418
4419GLboolean __stdcall glIsBuffer(GLuint buffer)
4420{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004421 EVENT("(GLuint buffer = %d)", buffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004422
4423 try
4424 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004425 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004426
4427 if (context && buffer)
4428 {
4429 gl::Buffer *bufferObject = context->getBuffer(buffer);
4430
4431 if (bufferObject)
4432 {
4433 return GL_TRUE;
4434 }
4435 }
4436 }
4437 catch(std::bad_alloc&)
4438 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004439 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004440 }
4441
4442 return GL_FALSE;
4443}
4444
4445GLboolean __stdcall glIsEnabled(GLenum cap)
4446{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004447 EVENT("(GLenum cap = 0x%X)", cap);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004448
4449 try
4450 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004451 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004452
4453 if (context)
4454 {
4455 switch (cap)
4456 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004457 case GL_CULL_FACE: return context->isCullFaceEnabled();
4458 case GL_POLYGON_OFFSET_FILL: return context->isPolygonOffsetFillEnabled();
4459 case GL_SAMPLE_ALPHA_TO_COVERAGE: return context->isSampleAlphaToCoverageEnabled();
4460 case GL_SAMPLE_COVERAGE: return context->isSampleCoverageEnabled();
4461 case GL_SCISSOR_TEST: return context->isScissorTestEnabled();
4462 case GL_STENCIL_TEST: return context->isStencilTestEnabled();
4463 case GL_DEPTH_TEST: return context->isDepthTestEnabled();
4464 case GL_BLEND: return context->isBlendEnabled();
4465 case GL_DITHER: return context->isDitherEnabled();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004466 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004467 return gl::error(GL_INVALID_ENUM, false);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004468 }
4469 }
4470 }
4471 catch(std::bad_alloc&)
4472 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004473 return gl::error(GL_OUT_OF_MEMORY, false);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004474 }
4475
4476 return false;
4477}
4478
daniel@transgaming.comfe208882010-09-01 15:47:57 +00004479GLboolean __stdcall glIsFenceNV(GLuint fence)
4480{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004481 EVENT("(GLuint fence = %d)", fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004482
4483 try
4484 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004485 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004486
4487 if (context)
4488 {
4489 gl::Fence *fenceObject = context->getFence(fence);
4490
4491 if (fenceObject == NULL)
4492 {
4493 return GL_FALSE;
4494 }
4495
4496 return fenceObject->isFence();
4497 }
4498 }
4499 catch(std::bad_alloc&)
4500 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004501 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004502 }
4503
4504 return GL_FALSE;
daniel@transgaming.comfe208882010-09-01 15:47:57 +00004505}
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004506
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004507GLboolean __stdcall glIsFramebuffer(GLuint framebuffer)
4508{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004509 EVENT("(GLuint framebuffer = %d)", framebuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004510
4511 try
4512 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004513 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004514
4515 if (context && framebuffer)
4516 {
4517 gl::Framebuffer *framebufferObject = context->getFramebuffer(framebuffer);
4518
4519 if (framebufferObject)
4520 {
4521 return GL_TRUE;
4522 }
4523 }
4524 }
4525 catch(std::bad_alloc&)
4526 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004527 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004528 }
4529
4530 return GL_FALSE;
4531}
4532
4533GLboolean __stdcall glIsProgram(GLuint program)
4534{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004535 EVENT("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004536
4537 try
4538 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004539 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004540
4541 if (context && program)
4542 {
4543 gl::Program *programObject = context->getProgram(program);
4544
4545 if (programObject)
4546 {
4547 return GL_TRUE;
4548 }
4549 }
4550 }
4551 catch(std::bad_alloc&)
4552 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004553 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004554 }
4555
4556 return GL_FALSE;
4557}
4558
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00004559GLboolean __stdcall glIsQueryEXT(GLuint id)
4560{
4561 EVENT("(GLuint id = %d)", id);
4562
4563 try
4564 {
4565 if (id == 0)
4566 {
4567 return GL_FALSE;
4568 }
4569
4570 gl::Context *context = gl::getNonLostContext();
4571
4572 if (context)
4573 {
4574 gl::Query *queryObject = context->getQuery(id, false, GL_NONE);
4575
4576 if (queryObject)
4577 {
4578 return GL_TRUE;
4579 }
4580 }
4581 }
4582 catch(std::bad_alloc&)
4583 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004584 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00004585 }
4586
4587 return GL_FALSE;
4588}
4589
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004590GLboolean __stdcall glIsRenderbuffer(GLuint renderbuffer)
4591{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004592 EVENT("(GLuint renderbuffer = %d)", renderbuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004593
4594 try
4595 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004596 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004597
4598 if (context && renderbuffer)
4599 {
4600 gl::Renderbuffer *renderbufferObject = context->getRenderbuffer(renderbuffer);
4601
4602 if (renderbufferObject)
4603 {
4604 return GL_TRUE;
4605 }
4606 }
4607 }
4608 catch(std::bad_alloc&)
4609 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004610 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004611 }
4612
4613 return GL_FALSE;
4614}
4615
4616GLboolean __stdcall glIsShader(GLuint shader)
4617{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004618 EVENT("(GLuint shader = %d)", shader);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004619
4620 try
4621 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004622 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004623
4624 if (context && shader)
4625 {
4626 gl::Shader *shaderObject = context->getShader(shader);
4627
4628 if (shaderObject)
4629 {
4630 return GL_TRUE;
4631 }
4632 }
4633 }
4634 catch(std::bad_alloc&)
4635 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004636 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004637 }
4638
4639 return GL_FALSE;
4640}
4641
4642GLboolean __stdcall glIsTexture(GLuint texture)
4643{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004644 EVENT("(GLuint texture = %d)", texture);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004645
4646 try
4647 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004648 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004649
4650 if (context && texture)
4651 {
4652 gl::Texture *textureObject = context->getTexture(texture);
4653
4654 if (textureObject)
4655 {
4656 return GL_TRUE;
4657 }
4658 }
4659 }
4660 catch(std::bad_alloc&)
4661 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004662 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004663 }
4664
4665 return GL_FALSE;
4666}
4667
4668void __stdcall glLineWidth(GLfloat width)
4669{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004670 EVENT("(GLfloat width = %f)", width);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004671
4672 try
4673 {
4674 if (width <= 0.0f)
4675 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004676 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004677 }
4678
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004679 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com32e58cd2010-03-24 09:44:10 +00004680
4681 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004682 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004683 context->setLineWidth(width);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004684 }
4685 }
4686 catch(std::bad_alloc&)
4687 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004688 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004689 }
4690}
4691
4692void __stdcall glLinkProgram(GLuint program)
4693{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004694 EVENT("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004695
4696 try
4697 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004698 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004699
4700 if (context)
4701 {
4702 gl::Program *programObject = context->getProgram(program);
4703
4704 if (!programObject)
4705 {
daniel@transgaming.com277b7142010-04-13 03:26:44 +00004706 if (context->getShader(program))
4707 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004708 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com277b7142010-04-13 03:26:44 +00004709 }
4710 else
4711 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004712 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com277b7142010-04-13 03:26:44 +00004713 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004714 }
4715
daniel@transgaming.com95d29422012-07-24 18:36:10 +00004716 context->linkProgram(program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004717 }
4718 }
4719 catch(std::bad_alloc&)
4720 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004721 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004722 }
4723}
4724
4725void __stdcall glPixelStorei(GLenum pname, GLint param)
4726{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004727 EVENT("(GLenum pname = 0x%X, GLint param = %d)", pname, param);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004728
4729 try
4730 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004731 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004732
4733 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004734 {
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004735 switch (pname)
4736 {
4737 case GL_UNPACK_ALIGNMENT:
4738 if (param != 1 && param != 2 && param != 4 && param != 8)
4739 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004740 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004741 }
4742
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004743 context->setUnpackAlignment(param);
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004744 break;
4745
4746 case GL_PACK_ALIGNMENT:
4747 if (param != 1 && param != 2 && param != 4 && param != 8)
4748 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004749 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004750 }
4751
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004752 context->setPackAlignment(param);
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004753 break;
4754
bsalomon@google.com56d46ab2011-11-23 14:53:10 +00004755 case GL_PACK_REVERSE_ROW_ORDER_ANGLE:
4756 context->setPackReverseRowOrder(param != 0);
4757 break;
4758
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004759 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004760 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004761 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004762 }
4763 }
4764 catch(std::bad_alloc&)
4765 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004766 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004767 }
4768}
4769
4770void __stdcall glPolygonOffset(GLfloat factor, GLfloat units)
4771{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004772 EVENT("(GLfloat factor = %f, GLfloat units = %f)", factor, units);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004773
4774 try
4775 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004776 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comaede6302010-04-29 03:35:48 +00004777
4778 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004779 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004780 context->setPolygonOffsetParams(factor, units);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004781 }
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.comb7915a52011-11-12 03:14:20 +00004789void __stdcall glReadnPixelsEXT(GLint x, GLint y, GLsizei width, GLsizei height,
4790 GLenum format, GLenum type, GLsizei bufSize,
4791 GLvoid *data)
4792{
4793 EVENT("(GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d, "
4794 "GLenum format = 0x%X, GLenum type = 0x%X, GLsizei bufSize = 0x%d, GLvoid *data = 0x%0.8p)",
4795 x, y, width, height, format, type, bufSize, data);
4796
4797 try
4798 {
4799 if (width < 0 || height < 0 || bufSize < 0)
4800 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004801 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00004802 }
4803
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00004804 gl::Context *context = gl::getNonLostContext();
4805
4806 if (context)
4807 {
daniel@transgaming.com42944b02012-09-27 17:45:57 +00004808 GLenum currentFormat, currentType;
4809
4810 // Failure in getCurrentReadFormatType indicates that no color attachment is currently bound,
4811 // and attempting to read back if that's the case is an error. The error will be registered
4812 // by getCurrentReadFormat.
4813 if (!context->getCurrentReadFormatType(&currentFormat, &currentType))
4814 return;
4815
4816 if (!(currentFormat == format && currentType == type) && !validReadFormatType(format, type))
4817 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004818 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com42944b02012-09-27 17:45:57 +00004819 }
4820
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00004821 context->readPixels(x, y, width, height, format, type, &bufSize, data);
4822 }
4823 }
4824 catch(std::bad_alloc&)
4825 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004826 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00004827 }
4828}
4829
4830void __stdcall glReadPixels(GLint x, GLint y, GLsizei width, GLsizei height,
4831 GLenum format, GLenum type, GLvoid* pixels)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004832{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004833 EVENT("(GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00004834 "GLenum format = 0x%X, GLenum type = 0x%X, GLvoid* pixels = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00004835 x, y, width, height, format, type, pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004836
4837 try
4838 {
4839 if (width < 0 || height < 0)
4840 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004841 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004842 }
4843
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004844 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004845
4846 if (context)
4847 {
daniel@transgaming.com42944b02012-09-27 17:45:57 +00004848 GLenum currentFormat, currentType;
4849
4850 // Failure in getCurrentReadFormatType indicates that no color attachment is currently bound,
4851 // and attempting to read back if that's the case is an error. The error will be registered
4852 // by getCurrentReadFormat.
4853 if (!context->getCurrentReadFormatType(&currentFormat, &currentType))
4854 return;
4855
4856 if (!(currentFormat == format && currentType == type) && !validReadFormatType(format, type))
4857 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004858 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com42944b02012-09-27 17:45:57 +00004859 }
4860
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00004861 context->readPixels(x, y, width, height, format, type, NULL, pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004862 }
4863 }
4864 catch(std::bad_alloc&)
4865 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004866 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004867 }
4868}
4869
4870void __stdcall glReleaseShaderCompiler(void)
4871{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004872 EVENT("()");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004873
4874 try
4875 {
4876 gl::Shader::releaseCompiler();
4877 }
4878 catch(std::bad_alloc&)
4879 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004880 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004881 }
4882}
4883
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00004884void __stdcall glRenderbufferStorageMultisampleANGLE(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004885{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004886 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 +00004887 target, samples, internalformat, width, height);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004888
4889 try
4890 {
4891 switch (target)
4892 {
4893 case GL_RENDERBUFFER:
4894 break;
4895 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004896 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004897 }
4898
daniel@transgaming.comedc19182010-10-15 17:57:55 +00004899 if (!gl::IsColorRenderable(internalformat) && !gl::IsDepthRenderable(internalformat) && !gl::IsStencilRenderable(internalformat))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004900 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004901 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004902 }
4903
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00004904 if (width < 0 || height < 0 || samples < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004905 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004906 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004907 }
4908
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004909 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004910
4911 if (context)
4912 {
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00004913 if (width > context->getMaximumRenderbufferDimension() ||
4914 height > context->getMaximumRenderbufferDimension() ||
4915 samples > context->getMaxSupportedSamples())
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00004916 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004917 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00004918 }
4919
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +00004920 GLuint handle = context->getRenderbufferHandle();
4921 if (handle == 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004922 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004923 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004924 }
4925
4926 switch (internalformat)
4927 {
4928 case GL_DEPTH_COMPONENT16:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004929 case GL_RGBA4:
4930 case GL_RGB5_A1:
4931 case GL_RGB565:
daniel@transgaming.com63977542010-08-24 19:21:02 +00004932 case GL_RGB8_OES:
4933 case GL_RGBA8_OES:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004934 case GL_STENCIL_INDEX8:
daniel@transgaming.comcdacc8e2010-07-28 19:20:50 +00004935 case GL_DEPTH24_STENCIL8_OES:
daniel@transgaming.com70062c92012-11-28 19:32:30 +00004936 context->setRenderbufferStorage(width, height, internalformat, samples);
daniel@transgaming.comcdacc8e2010-07-28 19:20:50 +00004937 break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004938 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004939 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004940 }
4941 }
4942 }
4943 catch(std::bad_alloc&)
4944 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004945 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004946 }
4947}
4948
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00004949void __stdcall glRenderbufferStorage(GLenum target, GLenum internalformat, GLsizei width, GLsizei height)
4950{
4951 glRenderbufferStorageMultisampleANGLE(target, 0, internalformat, width, height);
4952}
4953
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004954void __stdcall glSampleCoverage(GLclampf value, GLboolean invert)
4955{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00004956 EVENT("(GLclampf value = %f, GLboolean invert = %u)", value, invert);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004957
4958 try
4959 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004960 gl::Context* context = gl::getNonLostContext();
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00004961
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004962 if (context)
4963 {
daniel@transgaming.coma36f98e2010-05-18 18:51:09 +00004964 context->setSampleCoverageParams(gl::clamp01(value), invert == GL_TRUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004965 }
4966 }
4967 catch(std::bad_alloc&)
4968 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004969 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004970 }
4971}
4972
daniel@transgaming.comfe208882010-09-01 15:47:57 +00004973void __stdcall glSetFenceNV(GLuint fence, GLenum condition)
4974{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004975 EVENT("(GLuint fence = %d, GLenum condition = 0x%X)", fence, condition);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004976
4977 try
4978 {
4979 if (condition != GL_ALL_COMPLETED_NV)
4980 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004981 return gl::error(GL_INVALID_ENUM);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004982 }
4983
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004984 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004985
4986 if (context)
4987 {
4988 gl::Fence *fenceObject = context->getFence(fence);
4989
4990 if (fenceObject == NULL)
4991 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004992 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004993 }
4994
4995 fenceObject->setFence(condition);
4996 }
4997 }
4998 catch(std::bad_alloc&)
4999 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005000 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005001 }
daniel@transgaming.comfe208882010-09-01 15:47:57 +00005002}
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005003
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005004void __stdcall glScissor(GLint x, GLint y, GLsizei width, GLsizei height)
5005{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005006 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 +00005007
5008 try
5009 {
5010 if (width < 0 || height < 0)
5011 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005012 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005013 }
5014
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005015 gl::Context* context = gl::getNonLostContext();
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00005016
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005017 if (context)
5018 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00005019 context->setScissorParams(x, y, width, height);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005020 }
5021 }
5022 catch(std::bad_alloc&)
5023 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005024 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005025 }
5026}
5027
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00005028void __stdcall glShaderBinary(GLsizei n, const GLuint* shaders, GLenum binaryformat, const GLvoid* binary, GLsizei length)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005029{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005030 EVENT("(GLsizei n = %d, const GLuint* shaders = 0x%0.8p, GLenum binaryformat = 0x%X, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00005031 "const GLvoid* binary = 0x%0.8p, GLsizei length = %d)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00005032 n, shaders, binaryformat, binary, length);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005033
5034 try
5035 {
daniel@transgaming.comd1f667f2010-04-29 03:38:52 +00005036 // No binary shader formats are supported.
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005037 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005038 }
5039 catch(std::bad_alloc&)
5040 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005041 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005042 }
5043}
5044
shannon.woods%transgaming.com@gtempaccount.com5f339332013-04-13 03:29:02 +00005045void __stdcall glShaderSource(GLuint shader, GLsizei count, const GLchar* const* string, const GLint* length)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005046{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005047 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 +00005048 shader, count, string, length);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005049
5050 try
5051 {
daniel@transgaming.com8e6a6be2010-04-13 03:26:41 +00005052 if (count < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005053 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005054 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005055 }
5056
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005057 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005058
5059 if (context)
5060 {
5061 gl::Shader *shaderObject = context->getShader(shader);
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00005062
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005063 if (!shaderObject)
5064 {
daniel@transgaming.com8e6a6be2010-04-13 03:26:41 +00005065 if (context->getProgram(shader))
5066 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005067 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com8e6a6be2010-04-13 03:26:41 +00005068 }
5069 else
5070 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005071 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com8e6a6be2010-04-13 03:26:41 +00005072 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005073 }
5074
5075 shaderObject->setSource(count, string, length);
5076 }
5077 }
5078 catch(std::bad_alloc&)
5079 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005080 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005081 }
5082}
5083
5084void __stdcall glStencilFunc(GLenum func, GLint ref, GLuint mask)
5085{
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00005086 glStencilFuncSeparate(GL_FRONT_AND_BACK, func, ref, mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005087}
5088
5089void __stdcall glStencilFuncSeparate(GLenum face, GLenum func, GLint ref, GLuint mask)
5090{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005091 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 +00005092
5093 try
5094 {
5095 switch (face)
5096 {
5097 case GL_FRONT:
5098 case GL_BACK:
5099 case GL_FRONT_AND_BACK:
5100 break;
5101 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005102 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005103 }
5104
5105 switch (func)
5106 {
5107 case GL_NEVER:
5108 case GL_ALWAYS:
5109 case GL_LESS:
5110 case GL_LEQUAL:
5111 case GL_EQUAL:
5112 case GL_GEQUAL:
5113 case GL_GREATER:
5114 case GL_NOTEQUAL:
5115 break;
5116 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005117 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005118 }
5119
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005120 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005121
5122 if (context)
5123 {
5124 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
5125 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00005126 context->setStencilParams(func, ref, mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005127 }
5128
5129 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
5130 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00005131 context->setStencilBackParams(func, ref, mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005132 }
5133 }
5134 }
5135 catch(std::bad_alloc&)
5136 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005137 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005138 }
5139}
5140
5141void __stdcall glStencilMask(GLuint mask)
5142{
5143 glStencilMaskSeparate(GL_FRONT_AND_BACK, mask);
5144}
5145
5146void __stdcall glStencilMaskSeparate(GLenum face, GLuint mask)
5147{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005148 EVENT("(GLenum face = 0x%X, GLuint mask = %d)", face, mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005149
5150 try
5151 {
5152 switch (face)
5153 {
5154 case GL_FRONT:
5155 case GL_BACK:
5156 case GL_FRONT_AND_BACK:
5157 break;
5158 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005159 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005160 }
5161
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005162 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005163
5164 if (context)
5165 {
5166 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
5167 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00005168 context->setStencilWritemask(mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005169 }
5170
5171 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
5172 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00005173 context->setStencilBackWritemask(mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005174 }
5175 }
5176 }
5177 catch(std::bad_alloc&)
5178 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005179 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005180 }
5181}
5182
5183void __stdcall glStencilOp(GLenum fail, GLenum zfail, GLenum zpass)
5184{
5185 glStencilOpSeparate(GL_FRONT_AND_BACK, fail, zfail, zpass);
5186}
5187
5188void __stdcall glStencilOpSeparate(GLenum face, GLenum fail, GLenum zfail, GLenum zpass)
5189{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005190 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 +00005191 face, fail, zfail, zpass);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005192
5193 try
5194 {
5195 switch (face)
5196 {
5197 case GL_FRONT:
5198 case GL_BACK:
5199 case GL_FRONT_AND_BACK:
5200 break;
5201 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005202 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005203 }
5204
5205 switch (fail)
5206 {
5207 case GL_ZERO:
5208 case GL_KEEP:
5209 case GL_REPLACE:
5210 case GL_INCR:
5211 case GL_DECR:
5212 case GL_INVERT:
5213 case GL_INCR_WRAP:
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00005214 case GL_DECR_WRAP:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005215 break;
5216 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005217 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005218 }
5219
5220 switch (zfail)
5221 {
5222 case GL_ZERO:
5223 case GL_KEEP:
5224 case GL_REPLACE:
5225 case GL_INCR:
5226 case GL_DECR:
5227 case GL_INVERT:
5228 case GL_INCR_WRAP:
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00005229 case GL_DECR_WRAP:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005230 break;
5231 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005232 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005233 }
5234
5235 switch (zpass)
5236 {
5237 case GL_ZERO:
5238 case GL_KEEP:
5239 case GL_REPLACE:
5240 case GL_INCR:
5241 case GL_DECR:
5242 case GL_INVERT:
5243 case GL_INCR_WRAP:
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00005244 case GL_DECR_WRAP:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005245 break;
5246 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005247 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005248 }
5249
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005250 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005251
5252 if (context)
5253 {
5254 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
5255 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00005256 context->setStencilOperations(fail, zfail, zpass);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005257 }
5258
5259 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
5260 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00005261 context->setStencilBackOperations(fail, zfail, zpass);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005262 }
5263 }
5264 }
5265 catch(std::bad_alloc&)
5266 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005267 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005268 }
5269}
5270
daniel@transgaming.comfe208882010-09-01 15:47:57 +00005271GLboolean __stdcall glTestFenceNV(GLuint fence)
5272{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005273 EVENT("(GLuint fence = %d)", fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005274
5275 try
5276 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005277 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005278
5279 if (context)
5280 {
5281 gl::Fence *fenceObject = context->getFence(fence);
5282
5283 if (fenceObject == NULL)
5284 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005285 return gl::error(GL_INVALID_OPERATION, GL_TRUE);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005286 }
5287
5288 return fenceObject->testFence();
5289 }
5290 }
5291 catch(std::bad_alloc&)
5292 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005293 gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005294 }
5295
5296 return GL_TRUE;
daniel@transgaming.comfe208882010-09-01 15:47:57 +00005297}
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005298
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00005299void __stdcall glTexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height,
5300 GLint border, GLenum format, GLenum type, const GLvoid* pixels)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005301{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005302 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 +00005303 "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 +00005304 target, level, internalformat, width, height, border, format, type, pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005305
5306 try
5307 {
daniel@transgaming.com4f9ef0d2011-05-30 23:51:19 +00005308 if (!validImageSize(level, width, height))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005309 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005310 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005311 }
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00005312
apatrick@chromium.orge057c5d2012-01-26 19:18:24 +00005313 if (internalformat != GLint(format))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005314 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005315 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005316 }
5317
daniel@transgaming.com6377e362012-06-05 19:49:55 +00005318 // validate <type> by itself (used as secondary key below)
5319 switch (type)
5320 {
5321 case GL_UNSIGNED_BYTE:
5322 case GL_UNSIGNED_SHORT_5_6_5:
5323 case GL_UNSIGNED_SHORT_4_4_4_4:
5324 case GL_UNSIGNED_SHORT_5_5_5_1:
5325 case GL_UNSIGNED_SHORT:
5326 case GL_UNSIGNED_INT:
5327 case GL_UNSIGNED_INT_24_8_OES:
5328 case GL_HALF_FLOAT_OES:
5329 case GL_FLOAT:
5330 break;
5331 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005332 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com6377e362012-06-05 19:49:55 +00005333 }
5334
5335 // validate <format> + <type> combinations
5336 // - invalid <format> -> sets INVALID_ENUM
5337 // - invalid <format>+<type> combination -> sets INVALID_OPERATION
daniel@transgaming.com8a0a2db2011-03-21 16:38:20 +00005338 switch (format)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005339 {
5340 case GL_ALPHA:
5341 case GL_LUMINANCE:
5342 case GL_LUMINANCE_ALPHA:
5343 switch (type)
5344 {
5345 case GL_UNSIGNED_BYTE:
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00005346 case GL_FLOAT:
5347 case GL_HALF_FLOAT_OES:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005348 break;
5349 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005350 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005351 }
5352 break;
5353 case GL_RGB:
5354 switch (type)
5355 {
5356 case GL_UNSIGNED_BYTE:
5357 case GL_UNSIGNED_SHORT_5_6_5:
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00005358 case GL_FLOAT:
5359 case GL_HALF_FLOAT_OES:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005360 break;
5361 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005362 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005363 }
5364 break;
5365 case GL_RGBA:
5366 switch (type)
5367 {
5368 case GL_UNSIGNED_BYTE:
5369 case GL_UNSIGNED_SHORT_4_4_4_4:
5370 case GL_UNSIGNED_SHORT_5_5_5_1:
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00005371 case GL_FLOAT:
5372 case GL_HALF_FLOAT_OES:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005373 break;
5374 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005375 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005376 }
5377 break;
daniel@transgaming.coma9198d92010-08-08 04:49:56 +00005378 case GL_BGRA_EXT:
5379 switch (type)
5380 {
5381 case GL_UNSIGNED_BYTE:
5382 break;
5383 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005384 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.coma9198d92010-08-08 04:49:56 +00005385 }
5386 break;
daniel@transgaming.com01868132010-08-24 19:21:17 +00005387 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT: // error cases for compressed textures are handled below
5388 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
gman@chromium.org50c526d2011-08-10 05:19:44 +00005389 case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
5390 case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
daniel@transgaming.com01868132010-08-24 19:21:17 +00005391 break;
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00005392 case GL_DEPTH_COMPONENT:
5393 switch (type)
5394 {
5395 case GL_UNSIGNED_SHORT:
5396 case GL_UNSIGNED_INT:
5397 break;
5398 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005399 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00005400 }
5401 break;
5402 case GL_DEPTH_STENCIL_OES:
5403 switch (type)
5404 {
5405 case GL_UNSIGNED_INT_24_8_OES:
5406 break;
5407 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005408 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00005409 }
5410 break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005411 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005412 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005413 }
5414
5415 if (border != 0)
5416 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005417 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005418 }
5419
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005420 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005421
5422 if (context)
5423 {
daniel@transgaming.com32b11442011-11-19 02:42:48 +00005424 if (level > context->getMaximumTextureLevel())
5425 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005426 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com32b11442011-11-19 02:42:48 +00005427 }
5428
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00005429 switch (target)
5430 {
5431 case GL_TEXTURE_2D:
5432 if (width > (context->getMaximumTextureDimension() >> level) ||
5433 height > (context->getMaximumTextureDimension() >> level))
5434 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005435 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00005436 }
5437 break;
5438 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
5439 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
5440 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
5441 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
5442 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
5443 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
5444 if (width != height)
5445 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005446 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00005447 }
5448
5449 if (width > (context->getMaximumCubeTextureDimension() >> level) ||
5450 height > (context->getMaximumCubeTextureDimension() >> level))
5451 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005452 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00005453 }
5454 break;
5455 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005456 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00005457 }
5458
gman@chromium.org50c526d2011-08-10 05:19:44 +00005459 switch (format) {
5460 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
5461 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
5462 if (context->supportsDXT1Textures())
daniel@transgaming.com01868132010-08-24 19:21:17 +00005463 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005464 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com01868132010-08-24 19:21:17 +00005465 }
5466 else
5467 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005468 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com01868132010-08-24 19:21:17 +00005469 }
gman@chromium.org50c526d2011-08-10 05:19:44 +00005470 break;
5471 case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
5472 if (context->supportsDXT3Textures())
5473 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005474 return gl::error(GL_INVALID_OPERATION);
gman@chromium.org50c526d2011-08-10 05:19:44 +00005475 }
5476 else
5477 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005478 return gl::error(GL_INVALID_ENUM);
gman@chromium.org50c526d2011-08-10 05:19:44 +00005479 }
5480 break;
5481 case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
5482 if (context->supportsDXT5Textures())
5483 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005484 return gl::error(GL_INVALID_OPERATION);
gman@chromium.org50c526d2011-08-10 05:19:44 +00005485 }
5486 else
5487 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005488 return gl::error(GL_INVALID_ENUM);
gman@chromium.org50c526d2011-08-10 05:19:44 +00005489 }
5490 break;
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00005491 case GL_DEPTH_COMPONENT:
5492 case GL_DEPTH_STENCIL_OES:
5493 if (!context->supportsDepthTextures())
5494 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005495 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00005496 }
daniel@transgaming.com0c854682012-05-31 01:14:11 +00005497 if (target != GL_TEXTURE_2D)
5498 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005499 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com0c854682012-05-31 01:14:11 +00005500 }
daniel@transgaming.com797924b2012-06-05 19:50:01 +00005501 // OES_depth_texture supports loading depth data and multiple levels,
5502 // but ANGLE_depth_texture does not
5503 if (pixels != NULL || level != 0)
daniel@transgaming.com0c854682012-05-31 01:14:11 +00005504 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005505 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com0c854682012-05-31 01:14:11 +00005506 }
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00005507 break;
gman@chromium.org50c526d2011-08-10 05:19:44 +00005508 default:
5509 break;
daniel@transgaming.com01868132010-08-24 19:21:17 +00005510 }
5511
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00005512 if (type == GL_FLOAT)
5513 {
daniel@transgaming.combbeffbb2011-11-09 17:46:11 +00005514 if (!context->supportsFloat32Textures())
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00005515 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005516 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00005517 }
5518 }
5519 else if (type == GL_HALF_FLOAT_OES)
5520 {
daniel@transgaming.combbeffbb2011-11-09 17:46:11 +00005521 if (!context->supportsFloat16Textures())
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00005522 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005523 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00005524 }
5525 }
5526
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005527 if (target == GL_TEXTURE_2D)
5528 {
5529 gl::Texture2D *texture = context->getTexture2D();
5530
5531 if (!texture)
5532 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005533 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005534 }
5535
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005536 if (texture->isImmutable())
5537 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005538 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005539 }
5540
daniel@transgaming.com8a0a2db2011-03-21 16:38:20 +00005541 texture->setImage(level, width, height, format, type, context->getUnpackAlignment(), pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005542 }
5543 else
5544 {
5545 gl::TextureCubeMap *texture = context->getTextureCubeMap();
5546
5547 if (!texture)
5548 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005549 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005550 }
5551
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005552 if (texture->isImmutable())
5553 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005554 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005555 }
5556
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005557 switch (target)
5558 {
5559 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
daniel@transgaming.com8a0a2db2011-03-21 16:38:20 +00005560 texture->setImagePosX(level, width, height, format, type, context->getUnpackAlignment(), pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005561 break;
5562 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
daniel@transgaming.com8a0a2db2011-03-21 16:38:20 +00005563 texture->setImageNegX(level, width, height, format, type, context->getUnpackAlignment(), pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005564 break;
5565 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
daniel@transgaming.com8a0a2db2011-03-21 16:38:20 +00005566 texture->setImagePosY(level, width, height, format, type, context->getUnpackAlignment(), pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005567 break;
5568 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
daniel@transgaming.com8a0a2db2011-03-21 16:38:20 +00005569 texture->setImageNegY(level, width, height, format, type, context->getUnpackAlignment(), pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005570 break;
5571 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
daniel@transgaming.com8a0a2db2011-03-21 16:38:20 +00005572 texture->setImagePosZ(level, width, height, format, type, context->getUnpackAlignment(), pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005573 break;
5574 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
daniel@transgaming.com8a0a2db2011-03-21 16:38:20 +00005575 texture->setImageNegZ(level, width, height, format, type, context->getUnpackAlignment(), pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005576 break;
5577 default: UNREACHABLE();
5578 }
5579 }
5580 }
5581 }
5582 catch(std::bad_alloc&)
5583 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005584 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005585 }
5586}
5587
5588void __stdcall glTexParameterf(GLenum target, GLenum pname, GLfloat param)
5589{
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005590 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLint param = %f)", target, pname, param);
5591
5592 try
5593 {
5594 gl::Context *context = gl::getNonLostContext();
5595
5596 if (context)
5597 {
5598 gl::Texture *texture;
5599
5600 switch (target)
5601 {
5602 case GL_TEXTURE_2D:
5603 texture = context->getTexture2D();
5604 break;
5605 case GL_TEXTURE_CUBE_MAP:
5606 texture = context->getTextureCubeMap();
5607 break;
5608 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005609 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005610 }
5611
5612 switch (pname)
5613 {
5614 case GL_TEXTURE_WRAP_S:
5615 if (!texture->setWrapS((GLenum)param))
5616 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005617 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005618 }
5619 break;
5620 case GL_TEXTURE_WRAP_T:
5621 if (!texture->setWrapT((GLenum)param))
5622 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005623 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005624 }
5625 break;
5626 case GL_TEXTURE_MIN_FILTER:
5627 if (!texture->setMinFilter((GLenum)param))
5628 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005629 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005630 }
5631 break;
5632 case GL_TEXTURE_MAG_FILTER:
5633 if (!texture->setMagFilter((GLenum)param))
5634 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005635 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005636 }
5637 break;
5638 case GL_TEXTURE_USAGE_ANGLE:
5639 if (!texture->setUsage((GLenum)param))
5640 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005641 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005642 }
5643 break;
5644 case GL_TEXTURE_MAX_ANISOTROPY_EXT:
5645 if (!context->supportsTextureFilterAnisotropy())
5646 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005647 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005648 }
5649 if (!texture->setMaxAnisotropy((float)param, context->getTextureMaxAnisotropy()))
5650 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005651 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005652 }
5653 break;
5654 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005655 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005656 }
5657 }
5658 }
5659 catch(std::bad_alloc&)
5660 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005661 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005662 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005663}
5664
5665void __stdcall glTexParameterfv(GLenum target, GLenum pname, const GLfloat* params)
5666{
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005667 glTexParameterf(target, pname, (GLfloat)*params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005668}
5669
5670void __stdcall glTexParameteri(GLenum target, GLenum pname, GLint param)
5671{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005672 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLint param = %d)", target, pname, param);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005673
5674 try
5675 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005676 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005677
5678 if (context)
5679 {
5680 gl::Texture *texture;
5681
5682 switch (target)
5683 {
5684 case GL_TEXTURE_2D:
5685 texture = context->getTexture2D();
5686 break;
5687 case GL_TEXTURE_CUBE_MAP:
5688 texture = context->getTextureCubeMap();
5689 break;
5690 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005691 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005692 }
5693
5694 switch (pname)
5695 {
5696 case GL_TEXTURE_WRAP_S:
5697 if (!texture->setWrapS((GLenum)param))
5698 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005699 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005700 }
5701 break;
5702 case GL_TEXTURE_WRAP_T:
5703 if (!texture->setWrapT((GLenum)param))
5704 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005705 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005706 }
5707 break;
5708 case GL_TEXTURE_MIN_FILTER:
5709 if (!texture->setMinFilter((GLenum)param))
5710 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005711 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005712 }
5713 break;
5714 case GL_TEXTURE_MAG_FILTER:
5715 if (!texture->setMagFilter((GLenum)param))
5716 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005717 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005718 }
5719 break;
daniel@transgaming.com7d18c172011-11-11 04:18:21 +00005720 case GL_TEXTURE_USAGE_ANGLE:
5721 if (!texture->setUsage((GLenum)param))
5722 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005723 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com7d18c172011-11-11 04:18:21 +00005724 }
5725 break;
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005726 case GL_TEXTURE_MAX_ANISOTROPY_EXT:
5727 if (!context->supportsTextureFilterAnisotropy())
5728 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005729 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005730 }
5731 if (!texture->setMaxAnisotropy((float)param, context->getTextureMaxAnisotropy()))
5732 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005733 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005734 }
5735 break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005736 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005737 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005738 }
5739 }
5740 }
5741 catch(std::bad_alloc&)
5742 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005743 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005744 }
5745}
5746
5747void __stdcall glTexParameteriv(GLenum target, GLenum pname, const GLint* params)
5748{
5749 glTexParameteri(target, pname, *params);
5750}
5751
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005752void __stdcall glTexStorage2DEXT(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height)
5753{
5754 EVENT("(GLenum target = 0x%X, GLsizei levels = %d, GLenum internalformat = 0x%X, GLsizei width = %d, GLsizei height = %d)",
5755 target, levels, internalformat, width, height);
5756
5757 try
5758 {
5759 if (target != GL_TEXTURE_2D && target != GL_TEXTURE_CUBE_MAP)
5760 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005761 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005762 }
5763
5764 if (width < 1 || height < 1 || levels < 1)
5765 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005766 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005767 }
5768
5769 if (target == GL_TEXTURE_CUBE_MAP && width != height)
5770 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005771 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005772 }
5773
daniel@transgaming.com45b888a2011-11-16 03:56:39 +00005774 if (levels != 1 && levels != gl::log2(std::max(width, height)) + 1)
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005775 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005776 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005777 }
5778
5779 GLenum format = gl::ExtractFormat(internalformat);
5780 GLenum type = gl::ExtractType(internalformat);
5781
5782 if (format == GL_NONE || type == GL_NONE)
5783 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005784 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005785 }
5786
5787 gl::Context *context = gl::getNonLostContext();
5788
5789 if (context)
5790 {
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00005791 switch (target)
5792 {
5793 case GL_TEXTURE_2D:
5794 if (width > context->getMaximumTextureDimension() ||
5795 height > context->getMaximumTextureDimension())
5796 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005797 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00005798 }
5799 break;
5800 case GL_TEXTURE_CUBE_MAP:
5801 if (width > context->getMaximumCubeTextureDimension() ||
5802 height > context->getMaximumCubeTextureDimension())
5803 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005804 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00005805 }
5806 break;
5807 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005808 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00005809 }
5810
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005811 if (levels != 1 && !context->supportsNonPower2Texture())
5812 {
5813 if (!gl::isPow2(width) || !gl::isPow2(height))
5814 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005815 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005816 }
5817 }
5818
daniel@transgaming.come1077362011-11-11 04:16:50 +00005819 switch (internalformat)
5820 {
5821 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
5822 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
5823 if (!context->supportsDXT1Textures())
5824 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005825 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.come1077362011-11-11 04:16:50 +00005826 }
5827 break;
5828 case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
5829 if (!context->supportsDXT3Textures())
5830 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005831 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.come1077362011-11-11 04:16:50 +00005832 }
5833 break;
5834 case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
5835 if (!context->supportsDXT5Textures())
5836 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005837 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.come1077362011-11-11 04:16:50 +00005838 }
5839 break;
daniel@transgaming.comff941aa2011-11-11 04:17:09 +00005840 case GL_RGBA32F_EXT:
5841 case GL_RGB32F_EXT:
5842 case GL_ALPHA32F_EXT:
5843 case GL_LUMINANCE32F_EXT:
5844 case GL_LUMINANCE_ALPHA32F_EXT:
5845 if (!context->supportsFloat32Textures())
5846 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005847 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comff941aa2011-11-11 04:17:09 +00005848 }
5849 break;
5850 case GL_RGBA16F_EXT:
5851 case GL_RGB16F_EXT:
5852 case GL_ALPHA16F_EXT:
5853 case GL_LUMINANCE16F_EXT:
5854 case GL_LUMINANCE_ALPHA16F_EXT:
5855 if (!context->supportsFloat16Textures())
5856 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005857 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comff941aa2011-11-11 04:17:09 +00005858 }
5859 break;
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00005860 case GL_DEPTH_COMPONENT16:
5861 case GL_DEPTH_COMPONENT32_OES:
5862 case GL_DEPTH24_STENCIL8_OES:
5863 if (!context->supportsDepthTextures())
5864 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005865 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00005866 }
daniel@transgaming.com0c854682012-05-31 01:14:11 +00005867 if (target != GL_TEXTURE_2D)
5868 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005869 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com0c854682012-05-31 01:14:11 +00005870 }
daniel@transgaming.com797924b2012-06-05 19:50:01 +00005871 // ANGLE_depth_texture only supports 1-level textures
5872 if (levels != 1)
5873 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005874 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com797924b2012-06-05 19:50:01 +00005875 }
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00005876 break;
5877 default:
5878 break;
daniel@transgaming.come1077362011-11-11 04:16:50 +00005879 }
5880
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005881 if (target == GL_TEXTURE_2D)
5882 {
5883 gl::Texture2D *texture = context->getTexture2D();
5884
5885 if (!texture || texture->id() == 0)
5886 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005887 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005888 }
5889
5890 if (texture->isImmutable())
5891 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005892 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005893 }
5894
5895 texture->storage(levels, internalformat, width, height);
5896 }
5897 else if (target == GL_TEXTURE_CUBE_MAP)
5898 {
5899 gl::TextureCubeMap *texture = context->getTextureCubeMap();
5900
5901 if (!texture || texture->id() == 0)
5902 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005903 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005904 }
5905
5906 if (texture->isImmutable())
5907 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005908 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005909 }
5910
5911 texture->storage(levels, internalformat, width);
5912 }
5913 else UNREACHABLE();
5914 }
5915 }
5916 catch(std::bad_alloc&)
5917 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005918 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005919 }
5920}
5921
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00005922void __stdcall glTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height,
5923 GLenum format, GLenum type, const GLvoid* pixels)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005924{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005925 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00005926 "GLsizei width = %d, GLsizei height = %d, GLenum format = 0x%X, GLenum type = 0x%X, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00005927 "const GLvoid* pixels = 0x%0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005928 target, level, xoffset, yoffset, width, height, format, type, pixels);
5929
5930 try
5931 {
apatrick@chromium.org551022e2012-01-23 19:56:54 +00005932 if (!gl::IsInternalTextureTarget(target))
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005933 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005934 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005935 }
5936
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00005937 if (level < 0 || xoffset < 0 || yoffset < 0 || width < 0 || height < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005938 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005939 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005940 }
5941
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005942 if (std::numeric_limits<GLsizei>::max() - xoffset < width || std::numeric_limits<GLsizei>::max() - yoffset < height)
5943 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005944 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005945 }
5946
daniel@transgaming.com8833dd22012-06-05 19:49:58 +00005947 if (!checkTextureFormatType(format, type))
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005948 {
daniel@transgaming.com8833dd22012-06-05 19:49:58 +00005949 return; // error is set by helper function
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005950 }
5951
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005952 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005953
5954 if (context)
5955 {
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00005956 if (level > context->getMaximumTextureLevel())
5957 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005958 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00005959 }
5960
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00005961 if (format == GL_FLOAT)
5962 {
daniel@transgaming.combbeffbb2011-11-09 17:46:11 +00005963 if (!context->supportsFloat32Textures())
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00005964 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005965 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00005966 }
5967 }
5968 else if (format == GL_HALF_FLOAT_OES)
5969 {
daniel@transgaming.combbeffbb2011-11-09 17:46:11 +00005970 if (!context->supportsFloat16Textures())
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00005971 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005972 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00005973 }
5974 }
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00005975 else if (gl::IsDepthTexture(format))
5976 {
5977 if (!context->supportsDepthTextures())
5978 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005979 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00005980 }
daniel@transgaming.com0c854682012-05-31 01:14:11 +00005981 if (target != GL_TEXTURE_2D)
5982 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005983 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com0c854682012-05-31 01:14:11 +00005984 }
5985 // OES_depth_texture supports loading depth data, but ANGLE_depth_texture does not
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005986 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00005987 }
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00005988
daniel@transgaming.com1d2d3c42012-05-31 01:14:15 +00005989 if (width == 0 || height == 0 || pixels == NULL)
5990 {
5991 return;
5992 }
5993
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005994 if (target == GL_TEXTURE_2D)
5995 {
5996 gl::Texture2D *texture = context->getTexture2D();
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00005997 if (validateSubImageParams2D(false, width, height, xoffset, yoffset, level, format, type, texture))
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005998 {
daniel@transgaming.com343373a2011-11-29 19:42:32 +00005999 texture->subImage(level, xoffset, yoffset, width, height, format, type, context->getUnpackAlignment(), pixels);
daniel@transgaming.com00c75962010-03-11 20:36:15 +00006000 }
daniel@transgaming.com00c75962010-03-11 20:36:15 +00006001 }
daniel@transgaming.com19ffc242010-05-04 03:35:21 +00006002 else if (gl::IsCubemapTextureTarget(target))
daniel@transgaming.com00c75962010-03-11 20:36:15 +00006003 {
6004 gl::TextureCubeMap *texture = context->getTextureCubeMap();
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00006005 if (validateSubImageParamsCube(false, width, height, xoffset, yoffset, target, level, format, type, texture))
daniel@transgaming.com00c75962010-03-11 20:36:15 +00006006 {
daniel@transgaming.com343373a2011-11-29 19:42:32 +00006007 texture->subImage(target, level, xoffset, yoffset, width, height, format, type, context->getUnpackAlignment(), pixels);
daniel@transgaming.com00c75962010-03-11 20:36:15 +00006008 }
daniel@transgaming.com00c75962010-03-11 20:36:15 +00006009 }
6010 else
6011 {
6012 UNREACHABLE();
6013 }
6014 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006015 }
6016 catch(std::bad_alloc&)
6017 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006018 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006019 }
6020}
6021
6022void __stdcall glUniform1f(GLint location, GLfloat x)
6023{
6024 glUniform1fv(location, 1, &x);
6025}
6026
6027void __stdcall glUniform1fv(GLint location, GLsizei count, const GLfloat* v)
6028{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006029 EVENT("(GLint location = %d, GLsizei count = %d, const GLfloat* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006030
6031 try
6032 {
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006033 if (count < 0)
6034 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006035 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006036 }
6037
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006038 if (location == -1)
6039 {
6040 return;
6041 }
6042
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006043 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006044
6045 if (context)
6046 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00006047 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006048 if (!programBinary)
6049 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006050 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006051 }
6052
6053 if (!programBinary->setUniform1fv(location, count, v))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006054 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006055 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006056 }
6057 }
6058 }
6059 catch(std::bad_alloc&)
6060 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006061 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006062 }
6063}
6064
6065void __stdcall glUniform1i(GLint location, GLint x)
6066{
6067 glUniform1iv(location, 1, &x);
6068}
6069
6070void __stdcall glUniform1iv(GLint location, GLsizei count, const GLint* v)
6071{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006072 EVENT("(GLint location = %d, GLsizei count = %d, const GLint* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006073
6074 try
6075 {
6076 if (count < 0)
6077 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006078 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006079 }
6080
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006081 if (location == -1)
6082 {
6083 return;
6084 }
6085
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006086 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006087
6088 if (context)
6089 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00006090 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006091 if (!programBinary)
6092 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006093 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006094 }
6095
6096 if (!programBinary->setUniform1iv(location, count, v))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006097 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006098 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006099 }
6100 }
6101 }
6102 catch(std::bad_alloc&)
6103 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006104 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006105 }
6106}
6107
6108void __stdcall glUniform2f(GLint location, GLfloat x, GLfloat y)
6109{
6110 GLfloat xy[2] = {x, y};
6111
6112 glUniform2fv(location, 1, (GLfloat*)&xy);
6113}
6114
6115void __stdcall glUniform2fv(GLint location, GLsizei count, const GLfloat* v)
6116{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006117 EVENT("(GLint location = %d, GLsizei count = %d, const GLfloat* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006118
6119 try
6120 {
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006121 if (count < 0)
6122 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006123 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006124 }
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006125
6126 if (location == -1)
6127 {
6128 return;
6129 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006130
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006131 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006132
6133 if (context)
6134 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00006135 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006136 if (!programBinary)
6137 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006138 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006139 }
6140
6141 if (!programBinary->setUniform2fv(location, count, v))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006142 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006143 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006144 }
6145 }
6146 }
6147 catch(std::bad_alloc&)
6148 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006149 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006150 }
6151}
6152
6153void __stdcall glUniform2i(GLint location, GLint x, GLint y)
6154{
6155 GLint xy[4] = {x, y};
6156
6157 glUniform2iv(location, 1, (GLint*)&xy);
6158}
6159
6160void __stdcall glUniform2iv(GLint location, GLsizei count, const GLint* v)
6161{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006162 EVENT("(GLint location = %d, GLsizei count = %d, const GLint* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006163
6164 try
6165 {
6166 if (count < 0)
6167 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006168 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006169 }
6170
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006171 if (location == -1)
6172 {
6173 return;
6174 }
6175
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006176 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006177
6178 if (context)
6179 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00006180 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006181 if (!programBinary)
6182 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006183 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006184 }
6185
6186 if (!programBinary->setUniform2iv(location, count, v))
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006187 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006188 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006189 }
6190 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006191 }
6192 catch(std::bad_alloc&)
6193 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006194 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006195 }
6196}
6197
6198void __stdcall glUniform3f(GLint location, GLfloat x, GLfloat y, GLfloat z)
6199{
6200 GLfloat xyz[3] = {x, y, z};
6201
6202 glUniform3fv(location, 1, (GLfloat*)&xyz);
6203}
6204
6205void __stdcall glUniform3fv(GLint location, GLsizei count, const GLfloat* v)
6206{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006207 EVENT("(GLint location = %d, GLsizei count = %d, const GLfloat* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006208
6209 try
6210 {
6211 if (count < 0)
6212 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006213 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006214 }
6215
6216 if (location == -1)
6217 {
6218 return;
6219 }
6220
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006221 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006222
6223 if (context)
6224 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00006225 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006226 if (!programBinary)
6227 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006228 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006229 }
6230
6231 if (!programBinary->setUniform3fv(location, count, v))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006232 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006233 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006234 }
6235 }
6236 }
6237 catch(std::bad_alloc&)
6238 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006239 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006240 }
6241}
6242
6243void __stdcall glUniform3i(GLint location, GLint x, GLint y, GLint z)
6244{
6245 GLint xyz[3] = {x, y, z};
6246
6247 glUniform3iv(location, 1, (GLint*)&xyz);
6248}
6249
6250void __stdcall glUniform3iv(GLint location, GLsizei count, const GLint* v)
6251{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006252 EVENT("(GLint location = %d, GLsizei count = %d, const GLint* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006253
6254 try
6255 {
6256 if (count < 0)
6257 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006258 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006259 }
6260
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006261 if (location == -1)
6262 {
6263 return;
6264 }
6265
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006266 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006267
6268 if (context)
6269 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00006270 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006271 if (!programBinary)
6272 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006273 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006274 }
6275
6276 if (!programBinary->setUniform3iv(location, count, v))
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006277 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006278 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006279 }
6280 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006281 }
6282 catch(std::bad_alloc&)
6283 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006284 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006285 }
6286}
6287
6288void __stdcall glUniform4f(GLint location, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
6289{
6290 GLfloat xyzw[4] = {x, y, z, w};
6291
6292 glUniform4fv(location, 1, (GLfloat*)&xyzw);
6293}
6294
6295void __stdcall glUniform4fv(GLint location, GLsizei count, const GLfloat* v)
6296{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006297 EVENT("(GLint location = %d, GLsizei count = %d, const GLfloat* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006298
6299 try
6300 {
6301 if (count < 0)
6302 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006303 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006304 }
6305
6306 if (location == -1)
6307 {
6308 return;
6309 }
6310
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006311 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006312
6313 if (context)
6314 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00006315 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006316 if (!programBinary)
6317 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006318 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006319 }
6320
6321 if (!programBinary->setUniform4fv(location, count, v))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006322 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006323 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006324 }
6325 }
6326 }
6327 catch(std::bad_alloc&)
6328 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006329 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006330 }
6331}
6332
6333void __stdcall glUniform4i(GLint location, GLint x, GLint y, GLint z, GLint w)
6334{
6335 GLint xyzw[4] = {x, y, z, w};
6336
6337 glUniform4iv(location, 1, (GLint*)&xyzw);
6338}
6339
6340void __stdcall glUniform4iv(GLint location, GLsizei count, const GLint* v)
6341{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006342 EVENT("(GLint location = %d, GLsizei count = %d, const GLint* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006343
6344 try
6345 {
6346 if (count < 0)
6347 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006348 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006349 }
6350
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006351 if (location == -1)
6352 {
6353 return;
6354 }
6355
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006356 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006357
6358 if (context)
6359 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00006360 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006361 if (!programBinary)
6362 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006363 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006364 }
6365
6366 if (!programBinary->setUniform4iv(location, count, v))
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006367 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006368 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006369 }
6370 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006371 }
6372 catch(std::bad_alloc&)
6373 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006374 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006375 }
6376}
6377
6378void __stdcall glUniformMatrix2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
6379{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006380 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00006381 location, count, transpose, value);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006382
6383 try
6384 {
6385 if (count < 0 || transpose != GL_FALSE)
6386 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006387 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006388 }
6389
6390 if (location == -1)
6391 {
6392 return;
6393 }
6394
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006395 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006396
6397 if (context)
6398 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00006399 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006400 if (!programBinary)
6401 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006402 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006403 }
6404
6405 if (!programBinary->setUniformMatrix2fv(location, count, value))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006406 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006407 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006408 }
6409 }
6410 }
6411 catch(std::bad_alloc&)
6412 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006413 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006414 }
6415}
6416
6417void __stdcall glUniformMatrix3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
6418{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006419 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00006420 location, count, transpose, value);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006421
6422 try
6423 {
6424 if (count < 0 || transpose != GL_FALSE)
6425 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006426 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006427 }
6428
6429 if (location == -1)
6430 {
6431 return;
6432 }
6433
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006434 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006435
6436 if (context)
6437 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00006438 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006439 if (!programBinary)
6440 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006441 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006442 }
6443
6444 if (!programBinary->setUniformMatrix3fv(location, count, value))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006445 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006446 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006447 }
6448 }
6449 }
6450 catch(std::bad_alloc&)
6451 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006452 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006453 }
6454}
6455
6456void __stdcall glUniformMatrix4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
6457{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006458 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00006459 location, count, transpose, value);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006460
6461 try
6462 {
6463 if (count < 0 || transpose != GL_FALSE)
6464 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006465 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006466 }
6467
6468 if (location == -1)
6469 {
6470 return;
6471 }
6472
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006473 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006474
6475 if (context)
6476 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00006477 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006478 if (!programBinary)
6479 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006480 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006481 }
6482
6483 if (!programBinary->setUniformMatrix4fv(location, count, value))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006484 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006485 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006486 }
6487 }
6488 }
6489 catch(std::bad_alloc&)
6490 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006491 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006492 }
6493}
6494
6495void __stdcall glUseProgram(GLuint program)
6496{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006497 EVENT("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006498
6499 try
6500 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006501 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006502
6503 if (context)
6504 {
6505 gl::Program *programObject = context->getProgram(program);
6506
daniel@transgaming.comc8478202010-04-13 19:53:35 +00006507 if (!programObject && program != 0)
6508 {
6509 if (context->getShader(program))
6510 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006511 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comc8478202010-04-13 19:53:35 +00006512 }
6513 else
6514 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006515 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comc8478202010-04-13 19:53:35 +00006516 }
6517 }
6518
daniel@transgaming.com716056c2012-07-24 18:38:59 +00006519 if (program != 0 && !programObject->isLinked())
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006520 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006521 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006522 }
6523
6524 context->useProgram(program);
6525 }
6526 }
6527 catch(std::bad_alloc&)
6528 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006529 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006530 }
6531}
6532
6533void __stdcall glValidateProgram(GLuint program)
6534{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006535 EVENT("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006536
6537 try
6538 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006539 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00006540
6541 if (context)
6542 {
6543 gl::Program *programObject = context->getProgram(program);
6544
6545 if (!programObject)
6546 {
6547 if (context->getShader(program))
6548 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006549 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00006550 }
6551 else
6552 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006553 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00006554 }
6555 }
6556
apatrick@chromium.org253b8d22012-06-22 19:27:21 +00006557 programObject->validate();
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00006558 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006559 }
6560 catch(std::bad_alloc&)
6561 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006562 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006563 }
6564}
6565
6566void __stdcall glVertexAttrib1f(GLuint index, GLfloat x)
6567{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006568 EVENT("(GLuint index = %d, GLfloat x = %f)", index, x);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006569
6570 try
6571 {
6572 if (index >= gl::MAX_VERTEX_ATTRIBS)
6573 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006574 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006575 }
6576
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006577 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006578
6579 if (context)
6580 {
6581 GLfloat vals[4] = { x, 0, 0, 1 };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00006582 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006583 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006584 }
6585 catch(std::bad_alloc&)
6586 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006587 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006588 }
6589}
6590
6591void __stdcall glVertexAttrib1fv(GLuint index, const GLfloat* values)
6592{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006593 EVENT("(GLuint index = %d, const GLfloat* values = 0x%0.8p)", index, values);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006594
6595 try
6596 {
6597 if (index >= gl::MAX_VERTEX_ATTRIBS)
6598 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006599 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006600 }
6601
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006602 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006603
6604 if (context)
6605 {
6606 GLfloat vals[4] = { values[0], 0, 0, 1 };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00006607 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006608 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006609 }
6610 catch(std::bad_alloc&)
6611 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006612 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006613 }
6614}
6615
6616void __stdcall glVertexAttrib2f(GLuint index, GLfloat x, GLfloat y)
6617{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006618 EVENT("(GLuint index = %d, GLfloat x = %f, GLfloat y = %f)", index, x, y);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006619
6620 try
6621 {
6622 if (index >= gl::MAX_VERTEX_ATTRIBS)
6623 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006624 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006625 }
6626
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006627 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006628
6629 if (context)
6630 {
6631 GLfloat vals[4] = { x, y, 0, 1 };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00006632 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006633 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006634 }
6635 catch(std::bad_alloc&)
6636 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006637 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006638 }
6639}
6640
6641void __stdcall glVertexAttrib2fv(GLuint index, const GLfloat* values)
6642{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006643 EVENT("(GLuint index = %d, const GLfloat* values = 0x%0.8p)", index, values);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006644
6645 try
6646 {
6647 if (index >= gl::MAX_VERTEX_ATTRIBS)
6648 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006649 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006650 }
6651
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006652 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006653
6654 if (context)
6655 {
6656 GLfloat vals[4] = { values[0], values[1], 0, 1 };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00006657 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006658 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006659 }
6660 catch(std::bad_alloc&)
6661 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006662 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006663 }
6664}
6665
6666void __stdcall glVertexAttrib3f(GLuint index, GLfloat x, GLfloat y, GLfloat z)
6667{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006668 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 +00006669
6670 try
6671 {
6672 if (index >= gl::MAX_VERTEX_ATTRIBS)
6673 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006674 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006675 }
6676
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006677 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006678
6679 if (context)
6680 {
6681 GLfloat vals[4] = { x, y, z, 1 };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00006682 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006683 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006684 }
6685 catch(std::bad_alloc&)
6686 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006687 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006688 }
6689}
6690
6691void __stdcall glVertexAttrib3fv(GLuint index, const GLfloat* values)
6692{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006693 EVENT("(GLuint index = %d, const GLfloat* values = 0x%0.8p)", index, values);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006694
6695 try
6696 {
6697 if (index >= gl::MAX_VERTEX_ATTRIBS)
6698 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006699 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006700 }
6701
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006702 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006703
6704 if (context)
6705 {
6706 GLfloat vals[4] = { values[0], values[1], values[2], 1 };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00006707 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006708 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006709 }
6710 catch(std::bad_alloc&)
6711 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006712 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006713 }
6714}
6715
6716void __stdcall glVertexAttrib4f(GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
6717{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006718 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 +00006719
6720 try
6721 {
6722 if (index >= gl::MAX_VERTEX_ATTRIBS)
6723 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006724 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006725 }
6726
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006727 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006728
6729 if (context)
6730 {
6731 GLfloat vals[4] = { x, y, z, w };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00006732 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006733 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006734 }
6735 catch(std::bad_alloc&)
6736 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006737 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006738 }
6739}
6740
6741void __stdcall glVertexAttrib4fv(GLuint index, const GLfloat* values)
6742{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006743 EVENT("(GLuint index = %d, const GLfloat* values = 0x%0.8p)", index, values);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006744
6745 try
6746 {
6747 if (index >= gl::MAX_VERTEX_ATTRIBS)
6748 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006749 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006750 }
6751
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006752 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006753
6754 if (context)
6755 {
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00006756 context->setVertexAttribf(index, values);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006757 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006758 }
6759 catch(std::bad_alloc&)
6760 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006761 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006762 }
6763}
6764
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00006765void __stdcall glVertexAttribDivisorANGLE(GLuint index, GLuint divisor)
6766{
6767 EVENT("(GLuint index = %d, GLuint divisor = %d)", index, divisor);
6768
6769 try
6770 {
6771 if (index >= gl::MAX_VERTEX_ATTRIBS)
6772 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006773 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00006774 }
6775
6776 gl::Context *context = gl::getNonLostContext();
6777
6778 if (context)
6779 {
6780 context->setVertexAttribDivisor(index, divisor);
6781 }
6782 }
6783 catch(std::bad_alloc&)
6784 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006785 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00006786 }
6787}
6788
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00006789void __stdcall glVertexAttribPointer(GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid* ptr)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006790{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006791 EVENT("(GLuint index = %d, GLint size = %d, GLenum type = 0x%X, "
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006792 "GLboolean normalized = %u, GLsizei stride = %d, const GLvoid* ptr = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00006793 index, size, type, normalized, stride, ptr);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006794
6795 try
6796 {
6797 if (index >= gl::MAX_VERTEX_ATTRIBS)
6798 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006799 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006800 }
6801
6802 if (size < 1 || size > 4)
6803 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006804 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006805 }
6806
shannon.woods%transgaming.com@gtempaccount.com1a4e09a2013-04-13 03:33:30 +00006807 gl::Context *context = gl::getNonLostContext();
6808
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006809 switch (type)
6810 {
6811 case GL_BYTE:
6812 case GL_UNSIGNED_BYTE:
6813 case GL_SHORT:
6814 case GL_UNSIGNED_SHORT:
6815 case GL_FIXED:
6816 case GL_FLOAT:
6817 break;
shannon.woods%transgaming.com@gtempaccount.com1a4e09a2013-04-13 03:33:30 +00006818 case GL_HALF_FLOAT:
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00006819 case GL_INT:
6820 case GL_UNSIGNED_INT:
shannon.woods%transgaming.com@gtempaccount.com1ab57be2013-04-13 03:38:39 +00006821 case GL_INT_2_10_10_10_REV:
6822 case GL_UNSIGNED_INT_2_10_10_10_REV:
shannon.woods%transgaming.com@gtempaccount.com1a4e09a2013-04-13 03:33:30 +00006823 if (context && context->getClientVersion() < 3)
6824 {
6825 return gl::error(GL_INVALID_ENUM);
6826 }
6827 else
6828 {
6829 break;
6830 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006831 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006832 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006833 }
6834
6835 if (stride < 0)
6836 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006837 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006838 }
6839
shannon.woods%transgaming.com@gtempaccount.com1ab57be2013-04-13 03:38:39 +00006840 if ((type == GL_INT_2_10_10_10_REV || type == GL_UNSIGNED_INT_2_10_10_10_REV) && size != 4)
6841 {
6842 return gl::error(GL_INVALID_OPERATION);
6843 }
6844
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006845 if (context)
6846 {
shannon.woods%transgaming.com@gtempaccount.com8de4e6a2013-04-13 03:37:44 +00006847 context->setVertexAttribState(index, context->getArrayBuffer(), size, type,
6848 normalized == GL_TRUE, false, stride, ptr);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006849 }
6850 }
6851 catch(std::bad_alloc&)
6852 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006853 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006854 }
6855}
6856
6857void __stdcall glViewport(GLint x, GLint y, GLsizei width, GLsizei height)
6858{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006859 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 +00006860
6861 try
6862 {
6863 if (width < 0 || height < 0)
6864 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006865 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006866 }
6867
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006868 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006869
6870 if (context)
6871 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00006872 context->setViewportParams(x, y, width, height);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006873 }
6874 }
6875 catch(std::bad_alloc&)
6876 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006877 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006878 }
6879}
6880
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006881// OpenGL ES 3.0 functions
6882
6883void __stdcall glReadBuffer(GLenum mode)
6884{
6885 EVENT("(GLenum mode = 0x%X)", mode);
6886
6887 try
6888 {
6889 gl::Context *context = gl::getNonLostContext();
6890
6891 if (context)
6892 {
6893 if (context->getClientVersion() < 3)
6894 {
6895 return gl::error(GL_INVALID_OPERATION);
6896 }
6897 }
6898
6899 UNIMPLEMENTED();
6900 }
6901 catch(std::bad_alloc&)
6902 {
6903 return gl::error(GL_OUT_OF_MEMORY);
6904 }
6905}
6906
6907void __stdcall glDrawRangeElements(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid* indices)
6908{
6909 EVENT("(GLenum mode = 0x%X, GLuint start = %u, GLuint end = %u, GLsizei count = %d, GLenum type = 0x%X, "
6910 "const GLvoid* indices = 0x%0.8p)", mode, start, end, count, type, indices);
6911
6912 try
6913 {
6914 gl::Context *context = gl::getNonLostContext();
6915
6916 if (context)
6917 {
6918 if (context->getClientVersion() < 3)
6919 {
6920 return gl::error(GL_INVALID_OPERATION);
6921 }
6922 }
6923
6924 UNIMPLEMENTED();
6925 }
6926 catch(std::bad_alloc&)
6927 {
6928 return gl::error(GL_OUT_OF_MEMORY);
6929 }
6930}
6931
6932void __stdcall glTexImage3D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid* pixels)
6933{
6934 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint internalformat = %d, GLsizei width = %d, "
6935 "GLsizei height = %d, GLsizei depth = %d, GLint border = %d, GLenum format = 0x%X, "
6936 "GLenum type = 0x%X, const GLvoid* pixels = 0x%0.8p)",
6937 target, level, internalformat, width, height, depth, border, format, type, pixels);
6938
6939 try
6940 {
6941 gl::Context *context = gl::getNonLostContext();
6942
6943 if (context)
6944 {
6945 if (context->getClientVersion() < 3)
6946 {
6947 return gl::error(GL_INVALID_OPERATION);
6948 }
6949 }
6950
6951 UNIMPLEMENTED();
6952 }
6953 catch(std::bad_alloc&)
6954 {
6955 return gl::error(GL_OUT_OF_MEMORY);
6956 }
6957}
6958
6959void __stdcall glTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid* pixels)
6960{
6961 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
6962 "GLint zoffset = %d, GLsizei width = %d, GLsizei height = %d, GLsizei depth = %d, "
6963 "GLenum format = 0x%X, GLenum type = 0x%X, const GLvoid* pixels = 0x%0.8p)",
6964 target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels);
6965
6966 try
6967 {
6968 gl::Context *context = gl::getNonLostContext();
6969
6970 if (context)
6971 {
6972 if (context->getClientVersion() < 3)
6973 {
6974 return gl::error(GL_INVALID_OPERATION);
6975 }
6976 }
6977
6978 UNIMPLEMENTED();
6979 }
6980 catch(std::bad_alloc&)
6981 {
6982 return gl::error(GL_OUT_OF_MEMORY);
6983 }
6984}
6985
6986void __stdcall glCopyTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height)
6987{
6988 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
6989 "GLint zoffset = %d, GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d)",
6990 target, level, xoffset, yoffset, zoffset, x, y, width, height);
6991
6992 try
6993 {
6994 gl::Context *context = gl::getNonLostContext();
6995
6996 if (context)
6997 {
6998 if (context->getClientVersion() < 3)
6999 {
7000 return gl::error(GL_INVALID_OPERATION);
7001 }
7002 }
7003
7004 UNIMPLEMENTED();
7005 }
7006 catch(std::bad_alloc&)
7007 {
7008 return gl::error(GL_OUT_OF_MEMORY);
7009 }
7010}
7011
7012void __stdcall glCompressedTexImage3D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid* data)
7013{
7014 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint internalformat = %d, GLsizei width = %d, "
7015 "GLsizei height = %d, GLsizei depth = %d, GLint border = %d, GLsizei imageSize = %d, "
7016 "const GLvoid* data = 0x%0.8p)",
7017 target, level, internalformat, width, height, depth, border, imageSize, data);
7018
7019 try
7020 {
7021 gl::Context *context = gl::getNonLostContext();
7022
7023 if (context)
7024 {
7025 if (context->getClientVersion() < 3)
7026 {
7027 return gl::error(GL_INVALID_OPERATION);
7028 }
7029 }
7030
7031 UNIMPLEMENTED();
7032 }
7033 catch(std::bad_alloc&)
7034 {
7035 return gl::error(GL_OUT_OF_MEMORY);
7036 }
7037}
7038
7039void __stdcall glCompressedTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid* data)
7040{
7041 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
7042 "GLint zoffset = %d, GLsizei width = %d, GLsizei height = %d, GLsizei depth = %d, "
7043 "GLenum format = 0x%X, GLsizei imageSize = %d, const GLvoid* data = 0x%0.8p)",
7044 target, level, xoffset, yoffset, zoffset, width, height, depth, format, imageSize, data);
7045
7046 try
7047 {
7048 gl::Context *context = gl::getNonLostContext();
7049
7050 if (context)
7051 {
7052 if (context->getClientVersion() < 3)
7053 {
7054 return gl::error(GL_INVALID_OPERATION);
7055 }
7056 }
7057
7058 UNIMPLEMENTED();
7059 }
7060 catch(std::bad_alloc&)
7061 {
7062 return gl::error(GL_OUT_OF_MEMORY);
7063 }
7064}
7065
7066void __stdcall glGenQueries(GLsizei n, GLuint* ids)
7067{
7068 EVENT("(GLsizei n = %d, GLuint* ids = 0x%0.8p)", n, ids);
7069
7070 try
7071 {
7072 gl::Context *context = gl::getNonLostContext();
7073
7074 if (context)
7075 {
7076 if (context->getClientVersion() < 3)
7077 {
7078 return gl::error(GL_INVALID_OPERATION);
7079 }
7080 }
7081
7082 UNIMPLEMENTED();
7083 }
7084 catch(std::bad_alloc&)
7085 {
7086 return gl::error(GL_OUT_OF_MEMORY);
7087 }
7088}
7089
7090void __stdcall glDeleteQueries(GLsizei n, const GLuint* ids)
7091{
7092 EVENT("(GLsizei n = %d, GLuint* ids = 0x%0.8p)", n, ids);
7093
7094 try
7095 {
7096 gl::Context *context = gl::getNonLostContext();
7097
7098 if (context)
7099 {
7100 if (context->getClientVersion() < 3)
7101 {
7102 return gl::error(GL_INVALID_OPERATION);
7103 }
7104 }
7105
7106 UNIMPLEMENTED();
7107 }
7108 catch(std::bad_alloc&)
7109 {
7110 return gl::error(GL_OUT_OF_MEMORY);
7111 }
7112}
7113
7114GLboolean __stdcall glIsQuery(GLuint id)
7115{
7116 EVENT("(GLuint id = %u)", id);
7117
7118 try
7119 {
7120 gl::Context *context = gl::getNonLostContext();
7121
7122 if (context)
7123 {
7124 if (context->getClientVersion() < 3)
7125 {
7126 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
7127 }
7128 }
7129
7130 UNIMPLEMENTED();
7131 }
7132 catch(std::bad_alloc&)
7133 {
7134 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
7135 }
7136
7137 return GL_FALSE;
7138}
7139
7140void __stdcall glBeginQuery(GLenum target, GLuint id)
7141{
7142 EVENT("(GLenum target = 0x%X, GLuint id = %u)", target, id);
7143
7144 try
7145 {
7146 gl::Context *context = gl::getNonLostContext();
7147
7148 if (context)
7149 {
7150 if (context->getClientVersion() < 3)
7151 {
7152 return gl::error(GL_INVALID_OPERATION);
7153 }
7154 }
7155
7156 UNIMPLEMENTED();
7157 }
7158 catch(std::bad_alloc&)
7159 {
7160 return gl::error(GL_OUT_OF_MEMORY);
7161 }
7162}
7163
7164void __stdcall glEndQuery(GLenum target)
7165{
7166 EVENT("(GLenum target = 0x%X)", target);
7167
7168 try
7169 {
7170 gl::Context *context = gl::getNonLostContext();
7171
7172 if (context)
7173 {
7174 if (context->getClientVersion() < 3)
7175 {
7176 return gl::error(GL_INVALID_OPERATION);
7177 }
7178 }
7179
7180 UNIMPLEMENTED();
7181 }
7182 catch(std::bad_alloc&)
7183 {
7184 return gl::error(GL_OUT_OF_MEMORY);
7185 }
7186}
7187
7188void __stdcall glGetQueryiv(GLenum target, GLenum pname, GLint* params)
7189{
7190 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLint* params = 0x%0.8p)", target, pname, params);
7191
7192 try
7193 {
7194 gl::Context *context = gl::getNonLostContext();
7195
7196 if (context)
7197 {
7198 if (context->getClientVersion() < 3)
7199 {
7200 return gl::error(GL_INVALID_OPERATION);
7201 }
7202 }
7203
7204 UNIMPLEMENTED();
7205 }
7206 catch(std::bad_alloc&)
7207 {
7208 return gl::error(GL_OUT_OF_MEMORY);
7209 }
7210}
7211
7212void __stdcall glGetQueryObjectuiv(GLuint id, GLenum pname, GLuint* params)
7213{
7214 EVENT("(GLuint id = %u, GLenum pname = 0x%X, GLint* params = 0x%0.8p)", id, pname, params);
7215
7216 try
7217 {
7218 gl::Context *context = gl::getNonLostContext();
7219
7220 if (context)
7221 {
7222 if (context->getClientVersion() < 3)
7223 {
7224 return gl::error(GL_INVALID_OPERATION);
7225 }
7226 }
7227
7228 UNIMPLEMENTED();
7229 }
7230 catch(std::bad_alloc&)
7231 {
7232 return gl::error(GL_OUT_OF_MEMORY);
7233 }
7234}
7235
7236GLboolean __stdcall glUnmapBuffer(GLenum target)
7237{
7238 EVENT("(GLenum target = 0x%X)", target);
7239
7240 try
7241 {
7242 gl::Context *context = gl::getNonLostContext();
7243
7244 if (context)
7245 {
7246 if (context->getClientVersion() < 3)
7247 {
7248 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
7249 }
7250 }
7251
7252 UNIMPLEMENTED();
7253 }
7254 catch(std::bad_alloc&)
7255 {
7256 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
7257 }
7258
7259 return GL_FALSE;
7260}
7261
7262void __stdcall glGetBufferPointerv(GLenum target, GLenum pname, GLvoid** params)
7263{
7264 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLvoid** params = 0x%0.8p)", target, pname, params);
7265
7266 try
7267 {
7268 gl::Context *context = gl::getNonLostContext();
7269
7270 if (context)
7271 {
7272 if (context->getClientVersion() < 3)
7273 {
7274 return gl::error(GL_INVALID_OPERATION);
7275 }
7276 }
7277
7278 UNIMPLEMENTED();
7279 }
7280 catch(std::bad_alloc&)
7281 {
7282 return gl::error(GL_OUT_OF_MEMORY);
7283 }
7284}
7285
7286void __stdcall glDrawBuffers(GLsizei n, const GLenum* bufs)
7287{
7288 EVENT("(GLsizei n = %d, const GLenum* bufs = 0x%0.8p)", n, bufs);
7289
7290 try
7291 {
7292 gl::Context *context = gl::getNonLostContext();
7293
7294 if (context)
7295 {
7296 if (context->getClientVersion() < 3)
7297 {
7298 return gl::error(GL_INVALID_OPERATION);
7299 }
7300 }
7301
7302 UNIMPLEMENTED();
7303 }
7304 catch(std::bad_alloc&)
7305 {
7306 return gl::error(GL_OUT_OF_MEMORY);
7307 }
7308}
7309
7310void __stdcall glUniformMatrix2x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
7311{
7312 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
7313 location, count, transpose, value);
7314
7315 try
7316 {
7317 gl::Context *context = gl::getNonLostContext();
7318
7319 if (context)
7320 {
7321 if (context->getClientVersion() < 3)
7322 {
7323 return gl::error(GL_INVALID_OPERATION);
7324 }
7325 }
7326
7327 UNIMPLEMENTED();
7328 }
7329 catch(std::bad_alloc&)
7330 {
7331 return gl::error(GL_OUT_OF_MEMORY);
7332 }
7333}
7334
7335void __stdcall glUniformMatrix3x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
7336{
7337 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
7338 location, count, transpose, value);
7339
7340 try
7341 {
7342 gl::Context *context = gl::getNonLostContext();
7343
7344 if (context)
7345 {
7346 if (context->getClientVersion() < 3)
7347 {
7348 return gl::error(GL_INVALID_OPERATION);
7349 }
7350 }
7351
7352 UNIMPLEMENTED();
7353 }
7354 catch(std::bad_alloc&)
7355 {
7356 return gl::error(GL_OUT_OF_MEMORY);
7357 }
7358}
7359
7360void __stdcall glUniformMatrix2x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
7361{
7362 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
7363 location, count, transpose, value);
7364
7365 try
7366 {
7367 gl::Context *context = gl::getNonLostContext();
7368
7369 if (context)
7370 {
7371 if (context->getClientVersion() < 3)
7372 {
7373 return gl::error(GL_INVALID_OPERATION);
7374 }
7375 }
7376
7377 UNIMPLEMENTED();
7378 }
7379 catch(std::bad_alloc&)
7380 {
7381 return gl::error(GL_OUT_OF_MEMORY);
7382 }
7383}
7384
7385void __stdcall glUniformMatrix4x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
7386{
7387 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
7388 location, count, transpose, value);
7389
7390 try
7391 {
7392 gl::Context *context = gl::getNonLostContext();
7393
7394 if (context)
7395 {
7396 if (context->getClientVersion() < 3)
7397 {
7398 return gl::error(GL_INVALID_OPERATION);
7399 }
7400 }
7401
7402 UNIMPLEMENTED();
7403 }
7404 catch(std::bad_alloc&)
7405 {
7406 return gl::error(GL_OUT_OF_MEMORY);
7407 }
7408}
7409
7410void __stdcall glUniformMatrix3x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
7411{
7412 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
7413 location, count, transpose, value);
7414
7415 try
7416 {
7417 gl::Context *context = gl::getNonLostContext();
7418
7419 if (context)
7420 {
7421 if (context->getClientVersion() < 3)
7422 {
7423 return gl::error(GL_INVALID_OPERATION);
7424 }
7425 }
7426
7427 UNIMPLEMENTED();
7428 }
7429 catch(std::bad_alloc&)
7430 {
7431 return gl::error(GL_OUT_OF_MEMORY);
7432 }
7433}
7434
7435void __stdcall glUniformMatrix4x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
7436{
7437 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
7438 location, count, transpose, value);
7439
7440 try
7441 {
7442 gl::Context *context = gl::getNonLostContext();
7443
7444 if (context)
7445 {
7446 if (context->getClientVersion() < 3)
7447 {
7448 return gl::error(GL_INVALID_OPERATION);
7449 }
7450 }
7451
7452 UNIMPLEMENTED();
7453 }
7454 catch(std::bad_alloc&)
7455 {
7456 return gl::error(GL_OUT_OF_MEMORY);
7457 }
7458}
7459
7460void __stdcall glBlitFramebuffer(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter)
7461{
7462 EVENT("(GLint srcX0 = %d, GLint srcY0 = %d, GLint srcX1 = %d, GLint srcY1 = %d, GLint dstX0 = %d, "
7463 "GLint dstY0 = %d, GLint dstX1 = %d, GLint dstY1 = %d, GLbitfield mask = 0x%X, GLenum filter = 0x%X)",
7464 srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter);
7465
7466 try
7467 {
7468 gl::Context *context = gl::getNonLostContext();
7469
7470 if (context)
7471 {
7472 if (context->getClientVersion() < 3)
7473 {
7474 return gl::error(GL_INVALID_OPERATION);
7475 }
7476 }
7477
7478 UNIMPLEMENTED();
7479 }
7480 catch(std::bad_alloc&)
7481 {
7482 return gl::error(GL_OUT_OF_MEMORY);
7483 }
7484}
7485
7486void __stdcall glRenderbufferStorageMultisample(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height)
7487{
7488 EVENT("(GLenum target = 0x%X, GLsizei samples = %d, GLenum internalformat = 0x%X, GLsizei width = %d, GLsizei height = %d)",
7489 target, samples, internalformat, width, height);
7490
7491 try
7492 {
7493 gl::Context *context = gl::getNonLostContext();
7494
7495 if (context)
7496 {
7497 if (context->getClientVersion() < 3)
7498 {
7499 return gl::error(GL_INVALID_OPERATION);
7500 }
7501 }
7502
7503 UNIMPLEMENTED();
7504 }
7505 catch(std::bad_alloc&)
7506 {
7507 return gl::error(GL_OUT_OF_MEMORY);
7508 }
7509}
7510
7511void __stdcall glFramebufferTextureLayer(GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer)
7512{
7513 EVENT("(GLenum target = 0x%X, GLenum attachment = 0x%X, GLuint texture = %u, GLint level = %d, GLint layer = %d)",
7514 target, attachment, texture, level, layer);
7515
7516 try
7517 {
7518 gl::Context *context = gl::getNonLostContext();
7519
7520 if (context)
7521 {
7522 if (context->getClientVersion() < 3)
7523 {
7524 return gl::error(GL_INVALID_OPERATION);
7525 }
7526 }
7527
7528 UNIMPLEMENTED();
7529 }
7530 catch(std::bad_alloc&)
7531 {
7532 return gl::error(GL_OUT_OF_MEMORY);
7533 }
7534}
7535
7536GLvoid* __stdcall glMapBufferRange(GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access)
7537{
7538 EVENT("(GLenum target = 0x%X, GLintptr offset = %d, GLsizeiptr length = %d, GLbitfield access = 0x%X)",
7539 target, offset, length, access);
7540
7541 try
7542 {
7543 gl::Context *context = gl::getNonLostContext();
7544
7545 if (context)
7546 {
7547 if (context->getClientVersion() < 3)
7548 {
7549 return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLvoid*>(NULL));
7550 }
7551 }
7552
7553 UNIMPLEMENTED();
7554 }
7555 catch(std::bad_alloc&)
7556 {
7557 return gl::error(GL_OUT_OF_MEMORY, reinterpret_cast<GLvoid*>(NULL));
7558 }
7559
7560 return NULL;
7561}
7562
7563void __stdcall glFlushMappedBufferRange(GLenum target, GLintptr offset, GLsizeiptr length)
7564{
7565 EVENT("(GLenum target = 0x%X, GLintptr offset = %d, GLsizeiptr length = %d)", target, offset, length);
7566
7567 try
7568 {
7569 gl::Context *context = gl::getNonLostContext();
7570
7571 if (context)
7572 {
7573 if (context->getClientVersion() < 3)
7574 {
7575 return gl::error(GL_INVALID_OPERATION);
7576 }
7577 }
7578
7579 UNIMPLEMENTED();
7580 }
7581 catch(std::bad_alloc&)
7582 {
7583 return gl::error(GL_OUT_OF_MEMORY);
7584 }
7585}
7586
7587void __stdcall glBindVertexArray(GLuint array)
7588{
7589 EVENT("(GLuint array = %u)", array);
7590
7591 try
7592 {
7593 gl::Context *context = gl::getNonLostContext();
7594
7595 if (context)
7596 {
7597 if (context->getClientVersion() < 3)
7598 {
7599 return gl::error(GL_INVALID_OPERATION);
7600 }
7601 }
7602
7603 UNIMPLEMENTED();
7604 }
7605 catch(std::bad_alloc&)
7606 {
7607 return gl::error(GL_OUT_OF_MEMORY);
7608 }
7609}
7610
7611void __stdcall glDeleteVertexArrays(GLsizei n, const GLuint* arrays)
7612{
7613 EVENT("(GLsizei n = %d, const GLuint* arrays = 0x%0.8p)", n, arrays);
7614
7615 try
7616 {
7617 gl::Context *context = gl::getNonLostContext();
7618
7619 if (context)
7620 {
7621 if (context->getClientVersion() < 3)
7622 {
7623 return gl::error(GL_INVALID_OPERATION);
7624 }
7625 }
7626
7627 UNIMPLEMENTED();
7628 }
7629 catch(std::bad_alloc&)
7630 {
7631 return gl::error(GL_OUT_OF_MEMORY);
7632 }
7633}
7634
7635void __stdcall glGenVertexArrays(GLsizei n, GLuint* arrays)
7636{
7637 EVENT("(GLsizei n = %d, GLuint* arrays = 0x%0.8p)", n, arrays);
7638
7639 try
7640 {
7641 gl::Context *context = gl::getNonLostContext();
7642
7643 if (context)
7644 {
7645 if (context->getClientVersion() < 3)
7646 {
7647 return gl::error(GL_INVALID_OPERATION);
7648 }
7649 }
7650
7651 UNIMPLEMENTED();
7652 }
7653 catch(std::bad_alloc&)
7654 {
7655 return gl::error(GL_OUT_OF_MEMORY);
7656 }
7657}
7658
7659GLboolean __stdcall glIsVertexArray(GLuint array)
7660{
7661 EVENT("(GLuint array = %u)", array);
7662
7663 try
7664 {
7665 gl::Context *context = gl::getNonLostContext();
7666
7667 if (context)
7668 {
7669 if (context->getClientVersion() < 3)
7670 {
7671 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
7672 }
7673 }
7674
7675 UNIMPLEMENTED();
7676 }
7677 catch(std::bad_alloc&)
7678 {
7679 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
7680 }
7681
7682 return GL_FALSE;
7683}
7684
7685void __stdcall glGetIntegeri_v(GLenum target, GLuint index, GLint* data)
7686{
7687 EVENT("(GLenum target = 0x%X, GLuint index = %u, GLint* data = 0x%0.8p)",
7688 target, index, data);
7689
7690 try
7691 {
7692 gl::Context *context = gl::getNonLostContext();
7693
7694 if (context)
7695 {
7696 if (context->getClientVersion() < 3)
7697 {
7698 return gl::error(GL_INVALID_OPERATION);
7699 }
7700 }
7701
7702 UNIMPLEMENTED();
7703 }
7704 catch(std::bad_alloc&)
7705 {
7706 return gl::error(GL_OUT_OF_MEMORY);
7707 }
7708}
7709
7710void __stdcall glBeginTransformFeedback(GLenum primitiveMode)
7711{
7712 EVENT("(GLenum primitiveMode = 0x%X)", primitiveMode);
7713
7714 try
7715 {
7716 gl::Context *context = gl::getNonLostContext();
7717
7718 if (context)
7719 {
7720 if (context->getClientVersion() < 3)
7721 {
7722 return gl::error(GL_INVALID_OPERATION);
7723 }
7724 }
7725
7726 UNIMPLEMENTED();
7727 }
7728 catch(std::bad_alloc&)
7729 {
7730 return gl::error(GL_OUT_OF_MEMORY);
7731 }
7732}
7733
7734void __stdcall glEndTransformFeedback(void)
7735{
7736 EVENT("(void)");
7737
7738 try
7739 {
7740 gl::Context *context = gl::getNonLostContext();
7741
7742 if (context)
7743 {
7744 if (context->getClientVersion() < 3)
7745 {
7746 return gl::error(GL_INVALID_OPERATION);
7747 }
7748 }
7749
7750 UNIMPLEMENTED();
7751 }
7752 catch(std::bad_alloc&)
7753 {
7754 return gl::error(GL_OUT_OF_MEMORY);
7755 }
7756}
7757
7758void __stdcall glBindBufferRange(GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size)
7759{
7760 EVENT("(GLenum target = 0x%X, GLuint index = %u, GLuint buffer = %u, GLintptr offset = %d, GLsizeiptr size = %d)",
7761 target, index, buffer, offset, size);
7762
7763 try
7764 {
7765 gl::Context *context = gl::getNonLostContext();
7766
7767 if (context)
7768 {
7769 if (context->getClientVersion() < 3)
7770 {
7771 return gl::error(GL_INVALID_OPERATION);
7772 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007773
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007774 switch (target)
7775 {
7776 case GL_TRANSFORM_FEEDBACK_BUFFER:
7777 if (index > context->getMaxTransformFeedbackBufferBindings())
7778 {
7779 return gl::error(GL_INVALID_VALUE);
7780 }
7781 break;
7782
7783 case GL_UNIFORM_BUFFER:
7784 if (index >= context->getMaximumCombinedUniformBufferBindings())
7785 {
7786 return gl::error(GL_INVALID_VALUE);
7787 }
7788 break;
7789
7790 default:
7791 return gl::error(GL_INVALID_ENUM);
7792 }
7793
7794 gl::Buffer *bufferObject = context->getBuffer(buffer);
7795 if (!bufferObject)
7796 {
7797 // Buffer index must not have been valid
7798 return gl::error(GL_INVALID_VALUE);
7799 }
7800
7801 if (size <= 0 || static_cast<unsigned int>(offset + size) > bufferObject->size())
7802 {
7803 return gl::error(GL_INVALID_VALUE);
7804 }
7805
7806 switch (target)
7807 {
7808 case GL_TRANSFORM_FEEDBACK_BUFFER:
7809 context->bindTransformFeedbackBuffer(buffer, index, offset, size);
7810 break;
7811
7812 case GL_UNIFORM_BUFFER:
7813 context->bindUniformBuffer(buffer, index, offset, size);
7814 break;
7815
7816 default:
7817 UNREACHABLE();
7818 }
7819 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007820 }
7821 catch(std::bad_alloc&)
7822 {
7823 return gl::error(GL_OUT_OF_MEMORY);
7824 }
7825}
7826
7827void __stdcall glBindBufferBase(GLenum target, GLuint index, GLuint buffer)
7828{
7829 EVENT("(GLenum target = 0x%X, GLuint index = %u, GLuint buffer = %u)",
7830 target, index, buffer);
7831
7832 try
7833 {
7834 gl::Context *context = gl::getNonLostContext();
7835
7836 if (context)
7837 {
7838 if (context->getClientVersion() < 3)
7839 {
7840 return gl::error(GL_INVALID_OPERATION);
7841 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007842
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007843 switch (target)
7844 {
7845 case GL_TRANSFORM_FEEDBACK_BUFFER:
7846 if (index > context->getMaxTransformFeedbackBufferBindings())
7847 {
7848 return gl::error(GL_INVALID_VALUE);
7849 }
7850 break;
7851
7852 case GL_UNIFORM_BUFFER:
7853 if (index > context->getMaximumCombinedUniformBufferBindings())
7854 {
7855 return gl::error(GL_INVALID_VALUE);
7856 }
7857 break;
7858
7859 default:
7860 return gl::error(GL_INVALID_ENUM);
7861 }
7862
7863 gl::Buffer *bufferObject = context->getBuffer(buffer);
7864 if (!bufferObject)
7865 {
7866 // Buffer index must not have been valid
7867 return gl::error(GL_INVALID_VALUE);
7868 }
7869
7870 switch (target)
7871 {
7872 case GL_TRANSFORM_FEEDBACK_BUFFER:
7873 context->bindTransformFeedbackBuffer(buffer, index, 0, -1);
7874 break;
7875
7876 case GL_UNIFORM_BUFFER:
7877 context->bindUniformBuffer(buffer, index, 0, -1);
7878 break;
7879
7880 default:
7881 UNREACHABLE();
7882 }
7883 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007884 }
7885 catch(std::bad_alloc&)
7886 {
7887 return gl::error(GL_OUT_OF_MEMORY);
7888 }
7889}
7890
7891void __stdcall glTransformFeedbackVaryings(GLuint program, GLsizei count, const GLchar* const* varyings, GLenum bufferMode)
7892{
7893 EVENT("(GLuint program = %u, GLsizei count = %d, const GLchar* const* varyings = 0x%0.8p, GLenum bufferMode = 0x%X)",
7894 program, count, varyings, bufferMode);
7895
7896 try
7897 {
7898 gl::Context *context = gl::getNonLostContext();
7899
7900 if (context)
7901 {
7902 if (context->getClientVersion() < 3)
7903 {
7904 return gl::error(GL_INVALID_OPERATION);
7905 }
7906 }
7907
7908 UNIMPLEMENTED();
7909 }
7910 catch(std::bad_alloc&)
7911 {
7912 return gl::error(GL_OUT_OF_MEMORY);
7913 }
7914}
7915
7916void __stdcall glGetTransformFeedbackVarying(GLuint program, GLuint index, GLsizei bufSize, GLsizei* length, GLsizei* size, GLenum* type, GLchar* name)
7917{
7918 EVENT("(GLuint program = %u, GLuint index = %u, GLsizei bufSize = %d, GLsizei* length = 0x%0.8p, "
7919 "GLsizei* size = 0x%0.8p, GLenum* type = 0x%0.8p, GLchar* name = 0x%0.8p)",
7920 program, index, bufSize, length, size, type, name);
7921
7922 try
7923 {
7924 gl::Context *context = gl::getNonLostContext();
7925
7926 if (context)
7927 {
7928 if (context->getClientVersion() < 3)
7929 {
7930 return gl::error(GL_INVALID_OPERATION);
7931 }
7932 }
7933
7934 UNIMPLEMENTED();
7935 }
7936 catch(std::bad_alloc&)
7937 {
7938 return gl::error(GL_OUT_OF_MEMORY);
7939 }
7940}
7941
7942void __stdcall glVertexAttribIPointer(GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid* pointer)
7943{
7944 EVENT("(GLuint index = %u, GLint size = %d, GLenum type = 0x%X, GLsizei stride = %d, const GLvoid* pointer = 0x%0.8p)",
7945 index, size, type, stride, pointer);
7946
7947 try
7948 {
7949 gl::Context *context = gl::getNonLostContext();
7950
7951 if (context)
7952 {
7953 if (context->getClientVersion() < 3)
7954 {
7955 return gl::error(GL_INVALID_OPERATION);
7956 }
7957 }
7958
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007959 if (index >= gl::MAX_VERTEX_ATTRIBS)
7960 {
7961 return gl::error(GL_INVALID_VALUE);
7962 }
7963
7964 if (size < 1 || size > 4)
7965 {
7966 return gl::error(GL_INVALID_VALUE);
7967 }
7968
7969 switch (type)
7970 {
7971 case GL_BYTE:
7972 case GL_UNSIGNED_BYTE:
7973 case GL_SHORT:
7974 case GL_UNSIGNED_SHORT:
7975 case GL_INT:
7976 case GL_UNSIGNED_INT:
shannon.woods%transgaming.com@gtempaccount.com1ab57be2013-04-13 03:38:39 +00007977 case GL_INT_2_10_10_10_REV:
7978 case GL_UNSIGNED_INT_2_10_10_10_REV:
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007979 break;
7980 default:
7981 return gl::error(GL_INVALID_ENUM);
7982 }
7983
7984 if (stride < 0)
7985 {
7986 return gl::error(GL_INVALID_VALUE);
7987 }
7988
shannon.woods%transgaming.com@gtempaccount.com1ab57be2013-04-13 03:38:39 +00007989 if ((type == GL_INT_2_10_10_10_REV || type == GL_UNSIGNED_INT_2_10_10_10_REV) && size != 4)
7990 {
7991 return gl::error(GL_INVALID_OPERATION);
7992 }
7993
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007994 if (context)
7995 {
7996 context->setVertexAttribState(index, context->getArrayBuffer(), size, type, false, true,
7997 stride, pointer);
7998 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007999 }
8000 catch(std::bad_alloc&)
8001 {
8002 return gl::error(GL_OUT_OF_MEMORY);
8003 }
8004}
8005
8006void __stdcall glGetVertexAttribIiv(GLuint index, GLenum pname, GLint* params)
8007{
8008 EVENT("(GLuint index = %u, GLenum pname = 0x%X, GLint* params = 0x%0.8p)",
8009 index, pname, params);
8010
8011 try
8012 {
8013 gl::Context *context = gl::getNonLostContext();
8014
8015 if (context)
8016 {
8017 if (context->getClientVersion() < 3)
8018 {
8019 return gl::error(GL_INVALID_OPERATION);
8020 }
8021 }
8022
8023 UNIMPLEMENTED();
8024 }
8025 catch(std::bad_alloc&)
8026 {
8027 return gl::error(GL_OUT_OF_MEMORY);
8028 }
8029}
8030
8031void __stdcall glGetVertexAttribIuiv(GLuint index, GLenum pname, GLuint* params)
8032{
8033 EVENT("(GLuint index = %u, GLenum pname = 0x%X, GLuint* params = 0x%0.8p)",
8034 index, pname, params);
8035
8036 try
8037 {
8038 gl::Context *context = gl::getNonLostContext();
8039
8040 if (context)
8041 {
8042 if (context->getClientVersion() < 3)
8043 {
8044 return gl::error(GL_INVALID_OPERATION);
8045 }
8046 }
8047
8048 UNIMPLEMENTED();
8049 }
8050 catch(std::bad_alloc&)
8051 {
8052 return gl::error(GL_OUT_OF_MEMORY);
8053 }
8054}
8055
8056void __stdcall glVertexAttribI4i(GLuint index, GLint x, GLint y, GLint z, GLint w)
8057{
8058 EVENT("(GLuint index = %u, GLint x = %d, GLint y = %d, GLint z = %d, GLint w = %d)",
8059 index, x, y, z, w);
8060
8061 try
8062 {
8063 gl::Context *context = gl::getNonLostContext();
8064
8065 if (context)
8066 {
8067 if (context->getClientVersion() < 3)
8068 {
8069 return gl::error(GL_INVALID_OPERATION);
8070 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008071
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00008072 if (index >= gl::MAX_VERTEX_ATTRIBS)
8073 {
8074 return gl::error(GL_INVALID_VALUE);
8075 }
8076
8077 GLint vals[4] = { x, y, z, w };
8078 context->setVertexAttribi(index, vals);
8079 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008080 }
8081 catch(std::bad_alloc&)
8082 {
8083 return gl::error(GL_OUT_OF_MEMORY);
8084 }
8085}
8086
8087void __stdcall glVertexAttribI4ui(GLuint index, GLuint x, GLuint y, GLuint z, GLuint w)
8088{
8089 EVENT("(GLuint index = %u, GLuint x = %u, GLuint y = %u, GLuint z = %u, GLuint w = %u)",
8090 index, x, y, z, w);
8091
8092 try
8093 {
8094 gl::Context *context = gl::getNonLostContext();
8095
8096 if (context)
8097 {
8098 if (context->getClientVersion() < 3)
8099 {
8100 return gl::error(GL_INVALID_OPERATION);
8101 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008102
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00008103 if (index >= gl::MAX_VERTEX_ATTRIBS)
8104 {
8105 return gl::error(GL_INVALID_VALUE);
8106 }
8107
8108 GLuint vals[4] = { x, y, z, w };
8109 context->setVertexAttribu(index, vals);
8110 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008111 }
8112 catch(std::bad_alloc&)
8113 {
8114 return gl::error(GL_OUT_OF_MEMORY);
8115 }
8116}
8117
8118void __stdcall glVertexAttribI4iv(GLuint index, const GLint* v)
8119{
8120 EVENT("(GLuint index = %u, const GLint* v = 0x%0.8p)", index, v);
8121
8122 try
8123 {
8124 gl::Context *context = gl::getNonLostContext();
8125
8126 if (context)
8127 {
8128 if (context->getClientVersion() < 3)
8129 {
8130 return gl::error(GL_INVALID_OPERATION);
8131 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008132
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00008133 if (index >= gl::MAX_VERTEX_ATTRIBS)
8134 {
8135 return gl::error(GL_INVALID_VALUE);
8136 }
8137
8138 context->setVertexAttribi(index, v);
8139 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008140 }
8141 catch(std::bad_alloc&)
8142 {
8143 return gl::error(GL_OUT_OF_MEMORY);
8144 }
8145}
8146
8147void __stdcall glVertexAttribI4uiv(GLuint index, const GLuint* v)
8148{
8149 EVENT("(GLuint index = %u, const GLuint* v = 0x%0.8p)", index, v);
8150
8151 try
8152 {
8153 gl::Context *context = gl::getNonLostContext();
8154
8155 if (context)
8156 {
8157 if (context->getClientVersion() < 3)
8158 {
8159 return gl::error(GL_INVALID_OPERATION);
8160 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008161
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00008162 if (index >= gl::MAX_VERTEX_ATTRIBS)
8163 {
8164 return gl::error(GL_INVALID_VALUE);
8165 }
8166
8167 context->setVertexAttribu(index, v);
8168 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008169 }
8170 catch(std::bad_alloc&)
8171 {
8172 return gl::error(GL_OUT_OF_MEMORY);
8173 }
8174}
8175
8176void __stdcall glGetUniformuiv(GLuint program, GLint location, GLuint* params)
8177{
8178 EVENT("(GLuint program = %u, GLint location = %d, GLuint* params = 0x%0.8p)",
8179 program, location, params);
8180
8181 try
8182 {
8183 gl::Context *context = gl::getNonLostContext();
8184
8185 if (context)
8186 {
8187 if (context->getClientVersion() < 3)
8188 {
8189 return gl::error(GL_INVALID_OPERATION);
8190 }
8191 }
8192
8193 UNIMPLEMENTED();
8194 }
8195 catch(std::bad_alloc&)
8196 {
8197 return gl::error(GL_OUT_OF_MEMORY);
8198 }
8199}
8200
8201GLint __stdcall glGetFragDataLocation(GLuint program, const GLchar *name)
8202{
8203 EVENT("(GLuint program = %u, const GLchar *name = 0x%0.8p)",
8204 program, name);
8205
8206 try
8207 {
8208 gl::Context *context = gl::getNonLostContext();
8209
8210 if (context)
8211 {
8212 if (context->getClientVersion() < 3)
8213 {
8214 return gl::error(GL_INVALID_OPERATION, 0);
8215 }
8216 }
8217
8218 UNIMPLEMENTED();
8219 }
8220 catch(std::bad_alloc&)
8221 {
8222 return gl::error(GL_OUT_OF_MEMORY, 0);
8223 }
8224
8225 return 0;
8226}
8227
8228void __stdcall glUniform1ui(GLint location, GLuint v0)
8229{
8230 EVENT("(GLint location = %d, GLuint v0 = %u)",
8231 location, v0);
8232
8233 try
8234 {
8235 gl::Context *context = gl::getNonLostContext();
8236
8237 if (context)
8238 {
8239 if (context->getClientVersion() < 3)
8240 {
8241 return gl::error(GL_INVALID_OPERATION);
8242 }
8243 }
8244
8245 UNIMPLEMENTED();
8246 }
8247 catch(std::bad_alloc&)
8248 {
8249 return gl::error(GL_OUT_OF_MEMORY);
8250 }
8251}
8252
8253void __stdcall glUniform2ui(GLint location, GLuint v0, GLuint v1)
8254{
8255 EVENT("(GLint location = %d, GLuint v0 = %u, GLuint v1 = %u)",
8256 location, v0, v1);
8257
8258 try
8259 {
8260 gl::Context *context = gl::getNonLostContext();
8261
8262 if (context)
8263 {
8264 if (context->getClientVersion() < 3)
8265 {
8266 return gl::error(GL_INVALID_OPERATION);
8267 }
8268 }
8269
8270 UNIMPLEMENTED();
8271 }
8272 catch(std::bad_alloc&)
8273 {
8274 return gl::error(GL_OUT_OF_MEMORY);
8275 }
8276}
8277
8278void __stdcall glUniform3ui(GLint location, GLuint v0, GLuint v1, GLuint v2)
8279{
8280 EVENT("(GLint location = %d, GLuint v0 = %u, GLuint v1 = %u, GLuint v2 = %u)",
8281 location, v0, v1, v2);
8282
8283 try
8284 {
8285 gl::Context *context = gl::getNonLostContext();
8286
8287 if (context)
8288 {
8289 if (context->getClientVersion() < 3)
8290 {
8291 return gl::error(GL_INVALID_OPERATION);
8292 }
8293 }
8294
8295 UNIMPLEMENTED();
8296 }
8297 catch(std::bad_alloc&)
8298 {
8299 return gl::error(GL_OUT_OF_MEMORY);
8300 }
8301}
8302
8303void __stdcall glUniform4ui(GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3)
8304{
8305 EVENT("(GLint location = %d, GLuint v0 = %u, GLuint v1 = %u, GLuint v2 = %u, GLuint v3 = %u)",
8306 location, v0, v1, v2, v3);
8307
8308 try
8309 {
8310 gl::Context *context = gl::getNonLostContext();
8311
8312 if (context)
8313 {
8314 if (context->getClientVersion() < 3)
8315 {
8316 return gl::error(GL_INVALID_OPERATION);
8317 }
8318 }
8319
8320 UNIMPLEMENTED();
8321 }
8322 catch(std::bad_alloc&)
8323 {
8324 return gl::error(GL_OUT_OF_MEMORY);
8325 }
8326}
8327
8328void __stdcall glUniform1uiv(GLint location, GLsizei count, const GLuint* value)
8329{
8330 EVENT("(GLint location = %d, GLsizei count = %d, const GLuint* value = 0x%0.8p)",
8331 location, count, value);
8332
8333 try
8334 {
8335 gl::Context *context = gl::getNonLostContext();
8336
8337 if (context)
8338 {
8339 if (context->getClientVersion() < 3)
8340 {
8341 return gl::error(GL_INVALID_OPERATION);
8342 }
8343 }
8344
8345 UNIMPLEMENTED();
8346 }
8347 catch(std::bad_alloc&)
8348 {
8349 return gl::error(GL_OUT_OF_MEMORY);
8350 }
8351}
8352
8353void __stdcall glUniform2uiv(GLint location, GLsizei count, const GLuint* value)
8354{
8355 EVENT("(GLint location = %d, GLsizei count = %d, const GLuint* value = 0x%0.8p)",
8356 location, count, value);
8357
8358 try
8359 {
8360 gl::Context *context = gl::getNonLostContext();
8361
8362 if (context)
8363 {
8364 if (context->getClientVersion() < 3)
8365 {
8366 return gl::error(GL_INVALID_OPERATION);
8367 }
8368 }
8369
8370 UNIMPLEMENTED();
8371 }
8372 catch(std::bad_alloc&)
8373 {
8374 return gl::error(GL_OUT_OF_MEMORY);
8375 }
8376}
8377
8378void __stdcall glUniform3uiv(GLint location, GLsizei count, const GLuint* value)
8379{
8380 EVENT("(GLint location = %d, GLsizei count = %d, const GLuint* value)",
8381 location, count, value);
8382
8383 try
8384 {
8385 gl::Context *context = gl::getNonLostContext();
8386
8387 if (context)
8388 {
8389 if (context->getClientVersion() < 3)
8390 {
8391 return gl::error(GL_INVALID_OPERATION);
8392 }
8393 }
8394
8395 UNIMPLEMENTED();
8396 }
8397 catch(std::bad_alloc&)
8398 {
8399 return gl::error(GL_OUT_OF_MEMORY);
8400 }
8401}
8402
8403void __stdcall glUniform4uiv(GLint location, GLsizei count, const GLuint* value)
8404{
8405 EVENT("(GLint location = %d, GLsizei count = %d, const GLuint* value = 0x%0.8p)",
8406 location, count, value);
8407
8408 try
8409 {
8410 gl::Context *context = gl::getNonLostContext();
8411
8412 if (context)
8413 {
8414 if (context->getClientVersion() < 3)
8415 {
8416 return gl::error(GL_INVALID_OPERATION);
8417 }
8418 }
8419
8420 UNIMPLEMENTED();
8421 }
8422 catch(std::bad_alloc&)
8423 {
8424 return gl::error(GL_OUT_OF_MEMORY);
8425 }
8426}
8427
8428void __stdcall glClearBufferiv(GLenum buffer, GLint drawbuffer, const GLint* value)
8429{
8430 EVENT("(GLenum buffer = 0x%X, GLint drawbuffer = %d, const GLint* value = 0x%0.8p)",
8431 buffer, drawbuffer, value);
8432
8433 try
8434 {
8435 gl::Context *context = gl::getNonLostContext();
8436
8437 if (context)
8438 {
8439 if (context->getClientVersion() < 3)
8440 {
8441 return gl::error(GL_INVALID_OPERATION);
8442 }
8443 }
8444
8445 UNIMPLEMENTED();
8446 }
8447 catch(std::bad_alloc&)
8448 {
8449 return gl::error(GL_OUT_OF_MEMORY);
8450 }
8451}
8452
8453void __stdcall glClearBufferuiv(GLenum buffer, GLint drawbuffer, const GLuint* value)
8454{
8455 EVENT("(GLenum buffer = 0x%X, GLint drawbuffer = %d, const GLuint* value = 0x%0.8p)",
8456 buffer, drawbuffer, value);
8457
8458 try
8459 {
8460 gl::Context *context = gl::getNonLostContext();
8461
8462 if (context)
8463 {
8464 if (context->getClientVersion() < 3)
8465 {
8466 return gl::error(GL_INVALID_OPERATION);
8467 }
8468 }
8469
8470 UNIMPLEMENTED();
8471 }
8472 catch(std::bad_alloc&)
8473 {
8474 return gl::error(GL_OUT_OF_MEMORY);
8475 }
8476}
8477
8478void __stdcall glClearBufferfv(GLenum buffer, GLint drawbuffer, const GLfloat* value)
8479{
8480 EVENT("(GLenum buffer = 0x%X, GLint drawbuffer = %d, const GLfloat* value = 0x%0.8p)",
8481 buffer, drawbuffer, value);
8482
8483 try
8484 {
8485 gl::Context *context = gl::getNonLostContext();
8486
8487 if (context)
8488 {
8489 if (context->getClientVersion() < 3)
8490 {
8491 return gl::error(GL_INVALID_OPERATION);
8492 }
8493 }
8494
8495 UNIMPLEMENTED();
8496 }
8497 catch(std::bad_alloc&)
8498 {
8499 return gl::error(GL_OUT_OF_MEMORY);
8500 }
8501}
8502
8503void __stdcall glClearBufferfi(GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil)
8504{
8505 EVENT("(GLenum buffer = 0x%X, GLint drawbuffer = %d, GLfloat depth, GLint stencil = %d)",
8506 buffer, drawbuffer, depth, stencil);
8507
8508 try
8509 {
8510 gl::Context *context = gl::getNonLostContext();
8511
8512 if (context)
8513 {
8514 if (context->getClientVersion() < 3)
8515 {
8516 return gl::error(GL_INVALID_OPERATION);
8517 }
8518 }
8519
8520 UNIMPLEMENTED();
8521 }
8522 catch(std::bad_alloc&)
8523 {
8524 return gl::error(GL_OUT_OF_MEMORY);
8525 }
8526}
8527
8528const GLubyte* __stdcall glGetStringi(GLenum name, GLuint index)
8529{
8530 EVENT("(GLenum name = 0x%X, GLuint index = %u)", name, index);
8531
8532 try
8533 {
8534 gl::Context *context = gl::getNonLostContext();
8535
8536 if (context)
8537 {
8538 if (context->getClientVersion() < 3)
8539 {
8540 return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLubyte*>(NULL));
8541 }
8542 }
8543
8544 UNIMPLEMENTED();
8545 }
8546 catch(std::bad_alloc&)
8547 {
8548 return gl::error(GL_OUT_OF_MEMORY, reinterpret_cast<GLubyte*>(NULL));
8549 }
8550
8551 return NULL;
8552}
8553
8554void __stdcall glCopyBufferSubData(GLenum readTarget, GLenum writeTarget, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size)
8555{
8556 EVENT("(GLenum readTarget = 0x%X, GLenum writeTarget = 0x%X, GLintptr readOffset = %d, GLintptr writeOffset = %d, GLsizeiptr size = %d)",
8557 readTarget, writeTarget, readOffset, writeOffset, size);
8558
8559 try
8560 {
8561 gl::Context *context = gl::getNonLostContext();
8562
8563 if (context)
8564 {
8565 if (context->getClientVersion() < 3)
8566 {
8567 return gl::error(GL_INVALID_OPERATION);
8568 }
8569 }
8570
8571 UNIMPLEMENTED();
8572 }
8573 catch(std::bad_alloc&)
8574 {
8575 return gl::error(GL_OUT_OF_MEMORY);
8576 }
8577}
8578
8579void __stdcall glGetUniformIndices(GLuint program, GLsizei uniformCount, const GLchar* const* uniformNames, GLuint* uniformIndices)
8580{
8581 EVENT("(GLuint program = %u, GLsizei uniformCount = %d, const GLchar* const* uniformNames = 0x%0.8p, GLuint* uniformIndices = 0x%0.8p)",
8582 program, uniformCount, uniformNames, uniformIndices);
8583
8584 try
8585 {
8586 gl::Context *context = gl::getNonLostContext();
8587
8588 if (context)
8589 {
8590 if (context->getClientVersion() < 3)
8591 {
8592 return gl::error(GL_INVALID_OPERATION);
8593 }
8594 }
8595
8596 UNIMPLEMENTED();
8597 }
8598 catch(std::bad_alloc&)
8599 {
8600 return gl::error(GL_OUT_OF_MEMORY);
8601 }
8602}
8603
8604void __stdcall glGetActiveUniformsiv(GLuint program, GLsizei uniformCount, const GLuint* uniformIndices, GLenum pname, GLint* params)
8605{
8606 EVENT("(GLuint program = %u, GLsizei uniformCount = %d, const GLuint* uniformIndices = 0x%0.8p, GLenum pname = 0x%X, GLint* params = 0x%0.8p)",
8607 program, uniformCount, uniformIndices, pname, params);
8608
8609 try
8610 {
8611 gl::Context *context = gl::getNonLostContext();
8612
8613 if (context)
8614 {
8615 if (context->getClientVersion() < 3)
8616 {
8617 return gl::error(GL_INVALID_OPERATION);
8618 }
8619 }
8620
8621 UNIMPLEMENTED();
8622 }
8623 catch(std::bad_alloc&)
8624 {
8625 return gl::error(GL_OUT_OF_MEMORY);
8626 }
8627}
8628
8629GLuint __stdcall glGetUniformBlockIndex(GLuint program, const GLchar* uniformBlockName)
8630{
8631 EVENT("(GLuint program = %u, const GLchar* uniformBlockName = 0x%0.8p)", program, uniformBlockName);
8632
8633 try
8634 {
8635 gl::Context *context = gl::getNonLostContext();
8636
8637 if (context)
8638 {
8639 if (context->getClientVersion() < 3)
8640 {
8641 return gl::error(GL_INVALID_OPERATION, 0);
8642 }
8643 }
8644
8645 UNIMPLEMENTED();
8646 }
8647 catch(std::bad_alloc&)
8648 {
8649 return gl::error(GL_OUT_OF_MEMORY, 0);
8650 }
8651
8652 return 0;
8653}
8654
8655void __stdcall glGetActiveUniformBlockiv(GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint* params)
8656{
8657 EVENT("(GLuint program = %u, GLuint uniformBlockIndex = %u, GLenum pname = 0x%X, GLint* params = 0x%0.8p)",
8658 program, uniformBlockIndex, pname, params);
8659
8660 try
8661 {
8662 gl::Context *context = gl::getNonLostContext();
8663
8664 if (context)
8665 {
8666 if (context->getClientVersion() < 3)
8667 {
8668 return gl::error(GL_INVALID_OPERATION);
8669 }
8670 }
8671
8672 UNIMPLEMENTED();
8673 }
8674 catch(std::bad_alloc&)
8675 {
8676 return gl::error(GL_OUT_OF_MEMORY);
8677 }
8678}
8679
8680void __stdcall glGetActiveUniformBlockName(GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei* length, GLchar* uniformBlockName)
8681{
8682 EVENT("(GLuint program = %u, GLuint uniformBlockIndex = %u, GLsizei bufSize = %d, GLsizei* length = 0x%0.8p, GLchar* uniformBlockName = 0x%0.8p)",
8683 program, uniformBlockIndex, bufSize, length, uniformBlockName);
8684
8685 try
8686 {
8687 gl::Context *context = gl::getNonLostContext();
8688
8689 if (context)
8690 {
8691 if (context->getClientVersion() < 3)
8692 {
8693 return gl::error(GL_INVALID_OPERATION);
8694 }
8695 }
8696
8697 UNIMPLEMENTED();
8698 }
8699 catch(std::bad_alloc&)
8700 {
8701 return gl::error(GL_OUT_OF_MEMORY);
8702 }
8703}
8704
8705void __stdcall glUniformBlockBinding(GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding)
8706{
8707 EVENT("(GLuint program = %u, GLuint uniformBlockIndex = %u, GLuint uniformBlockBinding = %u)",
8708 program, uniformBlockIndex, uniformBlockBinding);
8709
8710 try
8711 {
8712 gl::Context *context = gl::getNonLostContext();
8713
8714 if (context)
8715 {
8716 if (context->getClientVersion() < 3)
8717 {
8718 return gl::error(GL_INVALID_OPERATION);
8719 }
8720 }
8721
8722 UNIMPLEMENTED();
8723 }
8724 catch(std::bad_alloc&)
8725 {
8726 return gl::error(GL_OUT_OF_MEMORY);
8727 }
8728}
8729
8730void __stdcall glDrawArraysInstanced(GLenum mode, GLint first, GLsizei count, GLsizei instanceCount)
8731{
8732 EVENT("(GLenum mode = 0x%X, GLint first = %d, GLsizei count = %d, GLsizei instanceCount = %d)",
8733 mode, first, count, instanceCount);
8734
8735 try
8736 {
8737 gl::Context *context = gl::getNonLostContext();
8738
8739 if (context)
8740 {
8741 if (context->getClientVersion() < 3)
8742 {
8743 return gl::error(GL_INVALID_OPERATION);
8744 }
8745 }
8746
8747 UNIMPLEMENTED();
8748 }
8749 catch(std::bad_alloc&)
8750 {
8751 return gl::error(GL_OUT_OF_MEMORY);
8752 }
8753}
8754
8755void __stdcall glDrawElementsInstanced(GLenum mode, GLsizei count, GLenum type, const GLvoid* indices, GLsizei instanceCount)
8756{
8757 EVENT("(GLenum mode = 0x%X, GLsizei count = %d, GLenum type = 0x%X, const GLvoid* indices = 0x%0.8p, GLsizei instanceCount = %d)",
8758 mode, count, type, indices, instanceCount);
8759
8760 try
8761 {
8762 gl::Context *context = gl::getNonLostContext();
8763
8764 if (context)
8765 {
8766 if (context->getClientVersion() < 3)
8767 {
8768 return gl::error(GL_INVALID_OPERATION);
8769 }
8770 }
8771
8772 UNIMPLEMENTED();
8773 }
8774 catch(std::bad_alloc&)
8775 {
8776 return gl::error(GL_OUT_OF_MEMORY);
8777 }
8778}
8779
8780GLsync __stdcall glFenceSync(GLenum condition, GLbitfield flags)
8781{
8782 EVENT("(GLenum condition = 0x%X, GLbitfield flags = 0x%X)", condition, flags);
8783
8784 try
8785 {
8786 gl::Context *context = gl::getNonLostContext();
8787
8788 if (context)
8789 {
8790 if (context->getClientVersion() < 3)
8791 {
8792 return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLsync>(NULL));
8793 }
8794 }
8795
8796 UNIMPLEMENTED();
8797 }
8798 catch(std::bad_alloc&)
8799 {
8800 return gl::error(GL_OUT_OF_MEMORY, reinterpret_cast<GLsync>(NULL));
8801 }
8802
8803 return NULL;
8804}
8805
8806GLboolean __stdcall glIsSync(GLsync sync)
8807{
8808 EVENT("(GLsync sync = 0x%0.8p)", sync);
8809
8810 try
8811 {
8812 gl::Context *context = gl::getNonLostContext();
8813
8814 if (context)
8815 {
8816 if (context->getClientVersion() < 3)
8817 {
8818 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
8819 }
8820 }
8821
8822 UNIMPLEMENTED();
8823 }
8824 catch(std::bad_alloc&)
8825 {
8826 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
8827 }
8828
8829 return GL_FALSE;
8830}
8831
8832void __stdcall glDeleteSync(GLsync sync)
8833{
8834 EVENT("(GLsync sync = 0x%0.8p)", sync);
8835
8836 try
8837 {
8838 gl::Context *context = gl::getNonLostContext();
8839
8840 if (context)
8841 {
8842 if (context->getClientVersion() < 3)
8843 {
8844 return gl::error(GL_INVALID_OPERATION);
8845 }
8846 }
8847
8848 UNIMPLEMENTED();
8849 }
8850 catch(std::bad_alloc&)
8851 {
8852 return gl::error(GL_OUT_OF_MEMORY);
8853 }
8854}
8855
8856GLenum __stdcall glClientWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout)
8857{
8858 EVENT("(GLsync sync = 0x%0.8p, GLbitfield flags = 0x%X, GLuint64 timeout = %llu)",
8859 sync, flags, timeout);
8860
8861 try
8862 {
8863 gl::Context *context = gl::getNonLostContext();
8864
8865 if (context)
8866 {
8867 if (context->getClientVersion() < 3)
8868 {
8869 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
8870 }
8871 }
8872
8873 UNIMPLEMENTED();
8874 }
8875 catch(std::bad_alloc&)
8876 {
8877 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
8878 }
8879
8880 return GL_FALSE;
8881}
8882
8883void __stdcall glWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout)
8884{
8885 EVENT("(GLsync sync = 0x%0.8p, GLbitfield flags = 0x%X, GLuint64 timeout = %llu)",
8886 sync, flags, timeout);
8887
8888 try
8889 {
8890 gl::Context *context = gl::getNonLostContext();
8891
8892 if (context)
8893 {
8894 if (context->getClientVersion() < 3)
8895 {
8896 return gl::error(GL_INVALID_OPERATION);
8897 }
8898 }
8899
8900 UNIMPLEMENTED();
8901 }
8902 catch(std::bad_alloc&)
8903 {
8904 return gl::error(GL_OUT_OF_MEMORY);
8905 }
8906}
8907
8908void __stdcall glGetInteger64v(GLenum pname, GLint64* params)
8909{
8910 EVENT("(GLenum pname = 0x%X, GLint64* params = 0x%0.8p)",
8911 pname, params);
8912
8913 try
8914 {
8915 gl::Context *context = gl::getNonLostContext();
8916
8917 if (context)
8918 {
8919 if (context->getClientVersion() < 3)
8920 {
8921 return gl::error(GL_INVALID_OPERATION);
8922 }
8923 }
8924
8925 UNIMPLEMENTED();
8926 }
8927 catch(std::bad_alloc&)
8928 {
8929 return gl::error(GL_OUT_OF_MEMORY);
8930 }
8931}
8932
8933void __stdcall glGetSynciv(GLsync sync, GLenum pname, GLsizei bufSize, GLsizei* length, GLint* values)
8934{
8935 EVENT("(GLsync sync = 0x%0.8p, GLenum pname = 0x%X, GLsizei bufSize = %d, GLsizei* length = 0x%0.8p, GLint* values = 0x%0.8p)",
8936 sync, pname, bufSize, length, values);
8937
8938 try
8939 {
8940 gl::Context *context = gl::getNonLostContext();
8941
8942 if (context)
8943 {
8944 if (context->getClientVersion() < 3)
8945 {
8946 return gl::error(GL_INVALID_OPERATION);
8947 }
8948 }
8949
8950 UNIMPLEMENTED();
8951 }
8952 catch(std::bad_alloc&)
8953 {
8954 return gl::error(GL_OUT_OF_MEMORY);
8955 }
8956}
8957
8958void __stdcall glGetInteger64i_v(GLenum target, GLuint index, GLint64* data)
8959{
8960 EVENT("(GLenum target = 0x%X, GLuint index = %u, GLint64* data = 0x%0.8p)",
8961 target, index, data);
8962
8963 try
8964 {
8965 gl::Context *context = gl::getNonLostContext();
8966
8967 if (context)
8968 {
8969 if (context->getClientVersion() < 3)
8970 {
8971 return gl::error(GL_INVALID_OPERATION);
8972 }
8973 }
8974
8975 UNIMPLEMENTED();
8976 }
8977 catch(std::bad_alloc&)
8978 {
8979 return gl::error(GL_OUT_OF_MEMORY);
8980 }
8981}
8982
8983void __stdcall glGetBufferParameteri64v(GLenum target, GLenum pname, GLint64* params)
8984{
8985 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLint64* params = 0x%0.8p)",
8986 target, pname, params);
8987
8988 try
8989 {
8990 gl::Context *context = gl::getNonLostContext();
8991
8992 if (context)
8993 {
8994 if (context->getClientVersion() < 3)
8995 {
8996 return gl::error(GL_INVALID_OPERATION);
8997 }
8998 }
8999
9000 UNIMPLEMENTED();
9001 }
9002 catch(std::bad_alloc&)
9003 {
9004 return gl::error(GL_OUT_OF_MEMORY);
9005 }
9006}
9007
9008void __stdcall glGenSamplers(GLsizei count, GLuint* samplers)
9009{
9010 EVENT("(GLsizei count = %d, GLuint* samplers = 0x%0.8p)", count, samplers);
9011
9012 try
9013 {
9014 gl::Context *context = gl::getNonLostContext();
9015
9016 if (context)
9017 {
9018 if (context->getClientVersion() < 3)
9019 {
9020 return gl::error(GL_INVALID_OPERATION);
9021 }
9022 }
9023
9024 UNIMPLEMENTED();
9025 }
9026 catch(std::bad_alloc&)
9027 {
9028 return gl::error(GL_OUT_OF_MEMORY);
9029 }
9030}
9031
9032void __stdcall glDeleteSamplers(GLsizei count, const GLuint* samplers)
9033{
9034 EVENT("(GLsizei count = %d, const GLuint* samplers = 0x%0.8p)", count, samplers);
9035
9036 try
9037 {
9038 gl::Context *context = gl::getNonLostContext();
9039
9040 if (context)
9041 {
9042 if (context->getClientVersion() < 3)
9043 {
9044 return gl::error(GL_INVALID_OPERATION);
9045 }
9046 }
9047
9048 UNIMPLEMENTED();
9049 }
9050 catch(std::bad_alloc&)
9051 {
9052 return gl::error(GL_OUT_OF_MEMORY);
9053 }
9054}
9055
9056GLboolean __stdcall glIsSampler(GLuint sampler)
9057{
9058 EVENT("(GLuint sampler = %u)", sampler);
9059
9060 try
9061 {
9062 gl::Context *context = gl::getNonLostContext();
9063
9064 if (context)
9065 {
9066 if (context->getClientVersion() < 3)
9067 {
9068 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
9069 }
9070 }
9071
9072 UNIMPLEMENTED();
9073 }
9074 catch(std::bad_alloc&)
9075 {
9076 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
9077 }
9078
9079 return GL_FALSE;
9080}
9081
9082void __stdcall glBindSampler(GLuint unit, GLuint sampler)
9083{
9084 EVENT("(GLuint unit = %u, GLuint sampler = %u)", unit, sampler);
9085
9086 try
9087 {
9088 gl::Context *context = gl::getNonLostContext();
9089
9090 if (context)
9091 {
9092 if (context->getClientVersion() < 3)
9093 {
9094 return gl::error(GL_INVALID_OPERATION);
9095 }
9096 }
9097
9098 UNIMPLEMENTED();
9099 }
9100 catch(std::bad_alloc&)
9101 {
9102 return gl::error(GL_OUT_OF_MEMORY);
9103 }
9104}
9105
9106void __stdcall glSamplerParameteri(GLuint sampler, GLenum pname, GLint param)
9107{
9108 EVENT("(GLuint sampler = %u, GLenum pname = 0x%X, GLint param = %d)", sampler, pname, param);
9109
9110 try
9111 {
9112 gl::Context *context = gl::getNonLostContext();
9113
9114 if (context)
9115 {
9116 if (context->getClientVersion() < 3)
9117 {
9118 return gl::error(GL_INVALID_OPERATION);
9119 }
9120 }
9121
9122 UNIMPLEMENTED();
9123 }
9124 catch(std::bad_alloc&)
9125 {
9126 return gl::error(GL_OUT_OF_MEMORY);
9127 }
9128}
9129
9130void __stdcall glSamplerParameteriv(GLuint sampler, GLenum pname, const GLint* param)
9131{
9132 EVENT("(GLuint sampler = %u, GLenum pname = 0x%X, const GLint* param = 0x%0.8p)",
9133 sampler, pname, param);
9134
9135 try
9136 {
9137 gl::Context *context = gl::getNonLostContext();
9138
9139 if (context)
9140 {
9141 if (context->getClientVersion() < 3)
9142 {
9143 return gl::error(GL_INVALID_OPERATION);
9144 }
9145 }
9146
9147 UNIMPLEMENTED();
9148 }
9149 catch(std::bad_alloc&)
9150 {
9151 return gl::error(GL_OUT_OF_MEMORY);
9152 }
9153}
9154
9155void __stdcall glSamplerParameterf(GLuint sampler, GLenum pname, GLfloat param)
9156{
9157 EVENT("(GLuint sampler = %u, GLenum pname = 0x%X, GLfloat param = %g)", sampler, pname, param);
9158
9159 try
9160 {
9161 gl::Context *context = gl::getNonLostContext();
9162
9163 if (context)
9164 {
9165 if (context->getClientVersion() < 3)
9166 {
9167 return gl::error(GL_INVALID_OPERATION);
9168 }
9169 }
9170
9171 UNIMPLEMENTED();
9172 }
9173 catch(std::bad_alloc&)
9174 {
9175 return gl::error(GL_OUT_OF_MEMORY);
9176 }
9177}
9178
9179void __stdcall glSamplerParameterfv(GLuint sampler, GLenum pname, const GLfloat* param)
9180{
9181 EVENT("(GLuint sampler = %u, GLenum pname = 0x%X, const GLfloat* param = 0x%0.8p)", sampler, pname, param);
9182
9183 try
9184 {
9185 gl::Context *context = gl::getNonLostContext();
9186
9187 if (context)
9188 {
9189 if (context->getClientVersion() < 3)
9190 {
9191 return gl::error(GL_INVALID_OPERATION);
9192 }
9193 }
9194
9195 UNIMPLEMENTED();
9196 }
9197 catch(std::bad_alloc&)
9198 {
9199 return gl::error(GL_OUT_OF_MEMORY);
9200 }
9201}
9202
9203void __stdcall glGetSamplerParameteriv(GLuint sampler, GLenum pname, GLint* params)
9204{
9205 EVENT("(GLuint sampler = %u, GLenum pname = 0x%X, GLint* params = 0x%0.8p)", sampler, pname, params);
9206
9207 try
9208 {
9209 gl::Context *context = gl::getNonLostContext();
9210
9211 if (context)
9212 {
9213 if (context->getClientVersion() < 3)
9214 {
9215 return gl::error(GL_INVALID_OPERATION);
9216 }
9217 }
9218
9219 UNIMPLEMENTED();
9220 }
9221 catch(std::bad_alloc&)
9222 {
9223 return gl::error(GL_OUT_OF_MEMORY);
9224 }
9225}
9226
9227void __stdcall glGetSamplerParameterfv(GLuint sampler, GLenum pname, GLfloat* params)
9228{
9229 EVENT("(GLuint sample = %ur, GLenum pname = 0x%X, GLfloat* params = 0x%0.8p)", sampler, pname, params);
9230
9231 try
9232 {
9233 gl::Context *context = gl::getNonLostContext();
9234
9235 if (context)
9236 {
9237 if (context->getClientVersion() < 3)
9238 {
9239 return gl::error(GL_INVALID_OPERATION);
9240 }
9241 }
9242
9243 UNIMPLEMENTED();
9244 }
9245 catch(std::bad_alloc&)
9246 {
9247 return gl::error(GL_OUT_OF_MEMORY);
9248 }
9249}
9250
9251void __stdcall glVertexAttribDivisor(GLuint index, GLuint divisor)
9252{
9253 EVENT("(GLuint index = %u, GLuint divisor = %u)", index, divisor);
9254
9255 try
9256 {
shannon.woods%transgaming.com@gtempaccount.com8736bd62013-04-13 03:35:41 +00009257 if (index >= gl::MAX_VERTEX_ATTRIBS)
9258 {
9259 return gl::error(GL_INVALID_VALUE);
9260 }
9261
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009262 gl::Context *context = gl::getNonLostContext();
9263
9264 if (context)
9265 {
9266 if (context->getClientVersion() < 3)
9267 {
9268 return gl::error(GL_INVALID_OPERATION);
9269 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009270
shannon.woods%transgaming.com@gtempaccount.com8736bd62013-04-13 03:35:41 +00009271 context->setVertexAttribDivisor(index, divisor);
9272 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009273 }
9274 catch(std::bad_alloc&)
9275 {
9276 return gl::error(GL_OUT_OF_MEMORY);
9277 }
9278}
9279
9280void __stdcall glBindTransformFeedback(GLenum target, GLuint id)
9281{
9282 EVENT("(GLenum target = 0x%X, GLuint id = %u)", target, id);
9283
9284 try
9285 {
9286 gl::Context *context = gl::getNonLostContext();
9287
9288 if (context)
9289 {
9290 if (context->getClientVersion() < 3)
9291 {
9292 return gl::error(GL_INVALID_OPERATION);
9293 }
9294 }
9295
9296 UNIMPLEMENTED();
9297 }
9298 catch(std::bad_alloc&)
9299 {
9300 return gl::error(GL_OUT_OF_MEMORY);
9301 }
9302}
9303
9304void __stdcall glDeleteTransformFeedbacks(GLsizei n, const GLuint* ids)
9305{
9306 EVENT("(GLsizei n = %d, const GLuint* ids = 0x%0.8p)", n, ids);
9307
9308 try
9309 {
9310 gl::Context *context = gl::getNonLostContext();
9311
9312 if (context)
9313 {
9314 if (context->getClientVersion() < 3)
9315 {
9316 return gl::error(GL_INVALID_OPERATION);
9317 }
9318 }
9319
9320 UNIMPLEMENTED();
9321 }
9322 catch(std::bad_alloc&)
9323 {
9324 return gl::error(GL_OUT_OF_MEMORY);
9325 }
9326}
9327
9328void __stdcall glGenTransformFeedbacks(GLsizei n, GLuint* ids)
9329{
9330 EVENT("(GLsizei n = %d, GLuint* ids = 0x%0.8p)", n, ids);
9331
9332 try
9333 {
9334 gl::Context *context = gl::getNonLostContext();
9335
9336 if (context)
9337 {
9338 if (context->getClientVersion() < 3)
9339 {
9340 return gl::error(GL_INVALID_OPERATION);
9341 }
9342 }
9343
9344 UNIMPLEMENTED();
9345 }
9346 catch(std::bad_alloc&)
9347 {
9348 return gl::error(GL_OUT_OF_MEMORY);
9349 }
9350}
9351
9352GLboolean __stdcall glIsTransformFeedback(GLuint id)
9353{
9354 EVENT("(GLuint id = %u)", id);
9355
9356 try
9357 {
9358 gl::Context *context = gl::getNonLostContext();
9359
9360 if (context)
9361 {
9362 if (context->getClientVersion() < 3)
9363 {
9364 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
9365 }
9366 }
9367
9368 UNIMPLEMENTED();
9369 }
9370 catch(std::bad_alloc&)
9371 {
9372 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
9373 }
9374
9375 return GL_FALSE;
9376}
9377
9378void __stdcall glPauseTransformFeedback(void)
9379{
9380 EVENT("(void)");
9381
9382 try
9383 {
9384 gl::Context *context = gl::getNonLostContext();
9385
9386 if (context)
9387 {
9388 if (context->getClientVersion() < 3)
9389 {
9390 return gl::error(GL_INVALID_OPERATION);
9391 }
9392 }
9393
9394 UNIMPLEMENTED();
9395 }
9396 catch(std::bad_alloc&)
9397 {
9398 return gl::error(GL_OUT_OF_MEMORY);
9399 }
9400}
9401
9402void __stdcall glResumeTransformFeedback(void)
9403{
9404 EVENT("(void)");
9405
9406 try
9407 {
9408 gl::Context *context = gl::getNonLostContext();
9409
9410 if (context)
9411 {
9412 if (context->getClientVersion() < 3)
9413 {
9414 return gl::error(GL_INVALID_OPERATION);
9415 }
9416 }
9417
9418 UNIMPLEMENTED();
9419 }
9420 catch(std::bad_alloc&)
9421 {
9422 return gl::error(GL_OUT_OF_MEMORY);
9423 }
9424}
9425
9426void __stdcall glGetProgramBinary(GLuint program, GLsizei bufSize, GLsizei* length, GLenum* binaryFormat, GLvoid* binary)
9427{
9428 EVENT("(GLuint program = %u, GLsizei bufSize = %d, GLsizei* length = 0x%0.8p, GLenum* binaryFormat = 0x%0.8p, GLvoid* binary = 0x%0.8p)",
9429 program, bufSize, length, binaryFormat, binary);
9430
9431 try
9432 {
9433 gl::Context *context = gl::getNonLostContext();
9434
9435 if (context)
9436 {
9437 if (context->getClientVersion() < 3)
9438 {
9439 return gl::error(GL_INVALID_OPERATION);
9440 }
9441 }
9442
9443 UNIMPLEMENTED();
9444 }
9445 catch(std::bad_alloc&)
9446 {
9447 return gl::error(GL_OUT_OF_MEMORY);
9448 }
9449}
9450
9451void __stdcall glProgramBinary(GLuint program, GLenum binaryFormat, const GLvoid* binary, GLsizei length)
9452{
9453 EVENT("(GLuint program = %u, GLenum binaryFormat = 0x%X, const GLvoid* binary = 0x%0.8p, GLsizei length = %d)",
9454 program, binaryFormat, binary, length);
9455
9456 try
9457 {
9458 gl::Context *context = gl::getNonLostContext();
9459
9460 if (context)
9461 {
9462 if (context->getClientVersion() < 3)
9463 {
9464 return gl::error(GL_INVALID_OPERATION);
9465 }
9466 }
9467
9468 UNIMPLEMENTED();
9469 }
9470 catch(std::bad_alloc&)
9471 {
9472 return gl::error(GL_OUT_OF_MEMORY);
9473 }
9474}
9475
9476void __stdcall glProgramParameteri(GLuint program, GLenum pname, GLint value)
9477{
9478 EVENT("(GLuint program = %u, GLenum pname = 0x%X, GLint value = %d)",
9479 program, pname, value);
9480
9481 try
9482 {
9483 gl::Context *context = gl::getNonLostContext();
9484
9485 if (context)
9486 {
9487 if (context->getClientVersion() < 3)
9488 {
9489 return gl::error(GL_INVALID_OPERATION);
9490 }
9491 }
9492
9493 UNIMPLEMENTED();
9494 }
9495 catch(std::bad_alloc&)
9496 {
9497 return gl::error(GL_OUT_OF_MEMORY);
9498 }
9499}
9500
9501void __stdcall glInvalidateFramebuffer(GLenum target, GLsizei numAttachments, const GLenum* attachments)
9502{
9503 EVENT("(GLenum target = 0x%X, GLsizei numAttachments = %d, const GLenum* attachments = 0x%0.8p)",
9504 target, numAttachments, attachments);
9505
9506 try
9507 {
9508 gl::Context *context = gl::getNonLostContext();
9509
9510 if (context)
9511 {
9512 if (context->getClientVersion() < 3)
9513 {
9514 return gl::error(GL_INVALID_OPERATION);
9515 }
9516 }
9517
9518 UNIMPLEMENTED();
9519 }
9520 catch(std::bad_alloc&)
9521 {
9522 return gl::error(GL_OUT_OF_MEMORY);
9523 }
9524}
9525
9526void __stdcall glInvalidateSubFramebuffer(GLenum target, GLsizei numAttachments, const GLenum* attachments, GLint x, GLint y, GLsizei width, GLsizei height)
9527{
9528 EVENT("(GLenum target = 0x%X, GLsizei numAttachments = %d, const GLenum* attachments = 0x%0.8p, GLint x = %d, "
9529 "GLint y = %d, GLsizei width = %d, GLsizei height = %d)",
9530 target, numAttachments, attachments, x, y, width, height);
9531
9532 try
9533 {
9534 gl::Context *context = gl::getNonLostContext();
9535
9536 if (context)
9537 {
9538 if (context->getClientVersion() < 3)
9539 {
9540 return gl::error(GL_INVALID_OPERATION);
9541 }
9542 }
9543
9544 UNIMPLEMENTED();
9545 }
9546 catch(std::bad_alloc&)
9547 {
9548 return gl::error(GL_OUT_OF_MEMORY);
9549 }
9550}
9551
9552void __stdcall glTexStorage2D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height)
9553{
9554 EVENT("(GLenum target = 0x%X, GLsizei levels = %d, GLenum internalformat = 0x%X, GLsizei width = %d, GLsizei height = %d)",
9555 target, levels, internalformat, width, height);
9556
9557 try
9558 {
9559 gl::Context *context = gl::getNonLostContext();
9560
9561 if (context)
9562 {
9563 if (context->getClientVersion() < 3)
9564 {
9565 return gl::error(GL_INVALID_OPERATION);
9566 }
9567 }
9568
9569 UNIMPLEMENTED();
9570 }
9571 catch(std::bad_alloc&)
9572 {
9573 return gl::error(GL_OUT_OF_MEMORY);
9574 }
9575}
9576
9577void __stdcall glTexStorage3D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth)
9578{
9579 EVENT("(GLenum target = 0x%X, GLsizei levels = %d, GLenum internalformat = 0x%X, GLsizei width = %d, "
9580 "GLsizei height = %d, GLsizei depth = %d)",
9581 target, levels, internalformat, width, height, depth);
9582
9583 try
9584 {
9585 gl::Context *context = gl::getNonLostContext();
9586
9587 if (context)
9588 {
9589 if (context->getClientVersion() < 3)
9590 {
9591 return gl::error(GL_INVALID_OPERATION);
9592 }
shannon.woods%transgaming.com@gtempaccount.com14eb55e2013-04-13 03:35:06 +00009593 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009594 }
9595 catch(std::bad_alloc&)
9596 {
9597 return gl::error(GL_OUT_OF_MEMORY);
9598 }
9599}
9600
9601void __stdcall glGetInternalformativ(GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize, GLint* params)
9602{
9603 EVENT("(GLenum target = 0x%X, GLenum internalformat = 0x%X, GLenum pname = 0x%X, GLsizei bufSize = %d, "
9604 "GLint* params = 0x%0.8p)",
9605 target, internalformat, pname, bufSize, params);
9606
9607 try
9608 {
9609 gl::Context *context = gl::getNonLostContext();
9610
9611 if (context)
9612 {
9613 if (context->getClientVersion() < 3)
9614 {
9615 return gl::error(GL_INVALID_OPERATION);
9616 }
9617 }
9618
9619 UNIMPLEMENTED();
9620 }
9621 catch(std::bad_alloc&)
9622 {
9623 return gl::error(GL_OUT_OF_MEMORY);
9624 }
9625}
9626
9627// Extension functions
9628
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +00009629void __stdcall glBlitFramebufferANGLE(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1,
9630 GLbitfield mask, GLenum filter)
9631{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00009632 EVENT("(GLint srcX0 = %d, GLint srcY0 = %d, GLint srcX1 = %d, GLint srcY1 = %d, "
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +00009633 "GLint dstX0 = %d, GLint dstY0 = %d, GLint dstX1 = %d, GLint dstY1 = %d, "
9634 "GLbitfield mask = 0x%X, GLenum filter = 0x%X)",
9635 srcX0, srcY0, srcX1, srcX1, dstX0, dstY0, dstX1, dstY1, mask, filter);
9636
9637 try
9638 {
9639 switch (filter)
9640 {
9641 case GL_NEAREST:
9642 break;
9643 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00009644 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +00009645 }
9646
9647 if ((mask & ~(GL_COLOR_BUFFER_BIT | GL_STENCIL_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)) != 0)
9648 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00009649 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +00009650 }
9651
9652 if (srcX1 - srcX0 != dstX1 - dstX0 || srcY1 - srcY0 != dstY1 - dstY0)
9653 {
9654 ERR("Scaling and flipping in BlitFramebufferANGLE not supported by this implementation");
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00009655 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +00009656 }
9657
daniel@transgaming.com9d788502011-11-09 17:46:55 +00009658 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +00009659
9660 if (context)
9661 {
9662 if (context->getReadFramebufferHandle() == context->getDrawFramebufferHandle())
9663 {
9664 ERR("Blits with the same source and destination framebuffer are not supported by this implementation.");
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00009665 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +00009666 }
9667
9668 context->blitFramebuffer(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask);
9669 }
9670 }
9671 catch(std::bad_alloc&)
9672 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00009673 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +00009674 }
9675}
9676
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00009677void __stdcall glTexImage3DOES(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth,
9678 GLint border, GLenum format, GLenum type, const GLvoid* pixels)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00009679{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00009680 EVENT("(GLenum target = 0x%X, GLint level = %d, GLenum internalformat = 0x%X, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00009681 "GLsizei width = %d, GLsizei height = %d, GLsizei depth = %d, GLint border = %d, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00009682 "GLenum format = 0x%X, GLenum type = 0x%x, const GLvoid* pixels = 0x%0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00009683 target, level, internalformat, width, height, depth, border, format, type, pixels);
9684
9685 try
9686 {
9687 UNIMPLEMENTED(); // FIXME
9688 }
9689 catch(std::bad_alloc&)
9690 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00009691 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00009692 }
9693}
daniel@transgaming.comce3d0f22010-05-04 03:35:14 +00009694
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00009695void __stdcall glGetProgramBinaryOES(GLuint program, GLsizei bufSize, GLsizei *length,
9696 GLenum *binaryFormat, void *binary)
9697{
apatrick@chromium.org90080e32012-07-09 22:15:33 +00009698 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 +00009699 program, bufSize, length, binaryFormat, binary);
9700
9701 try
9702 {
9703 gl::Context *context = gl::getNonLostContext();
9704
9705 if (context)
9706 {
9707 gl::Program *programObject = context->getProgram(program);
9708
daniel@transgaming.com716056c2012-07-24 18:38:59 +00009709 if (!programObject || !programObject->isLinked())
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00009710 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00009711 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00009712 }
9713
9714 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
9715
9716 if (!programBinary)
9717 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00009718 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00009719 }
9720
apatrick@chromium.org90080e32012-07-09 22:15:33 +00009721 if (!programBinary->save(binary, bufSize, length))
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00009722 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00009723 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00009724 }
apatrick@chromium.org90080e32012-07-09 22:15:33 +00009725
9726 *binaryFormat = GL_PROGRAM_BINARY_ANGLE;
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00009727 }
9728 }
9729 catch(std::bad_alloc&)
9730 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00009731 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00009732 }
9733}
9734
9735void __stdcall glProgramBinaryOES(GLuint program, GLenum binaryFormat,
9736 const void *binary, GLint length)
9737{
9738 EVENT("(GLenum program = 0x%X, binaryFormat = 0x%x, binary = 0x%0.8p, length = %d)",
9739 program, binaryFormat, binary, length);
9740
9741 try
9742 {
9743 gl::Context *context = gl::getNonLostContext();
9744
9745 if (context)
9746 {
9747 if (binaryFormat != GL_PROGRAM_BINARY_ANGLE)
9748 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00009749 return gl::error(GL_INVALID_ENUM);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00009750 }
9751
9752 gl::Program *programObject = context->getProgram(program);
9753
9754 if (!programObject)
9755 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00009756 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00009757 }
9758
daniel@transgaming.com95d29422012-07-24 18:36:10 +00009759 context->setProgramBinary(program, binary, length);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00009760 }
9761 }
9762 catch(std::bad_alloc&)
9763 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00009764 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00009765 }
9766}
9767
shannon.woods%transgaming.com@gtempaccount.com4059a382013-04-13 03:31:16 +00009768void __stdcall glDrawBuffersEXT(GLsizei n, const GLenum *bufs)
9769{
9770 EVENT("(GLenum n = %d, bufs = 0x%0.8p)", n, bufs);
9771
9772 try
9773 {
9774 gl::Context *context = gl::getNonLostContext();
9775
9776 if (context)
9777 {
9778 if (n < 0 || (unsigned int)n > context->getMaximumRenderTargets())
9779 {
9780 return gl::error(GL_INVALID_VALUE);
9781 }
9782
9783 if (context->getDrawFramebufferHandle() == 0)
9784 {
shannon.woods%transgaming.com@gtempaccount.com2fa73c52013-04-13 03:37:20 +00009785 if (n != 1)
shannon.woods%transgaming.com@gtempaccount.com4059a382013-04-13 03:31:16 +00009786 {
9787 return gl::error(GL_INVALID_OPERATION);
9788 }
9789
shannon.woods%transgaming.com@gtempaccount.com2fa73c52013-04-13 03:37:20 +00009790 if (bufs[0] != GL_NONE && bufs[0] != GL_BACK)
shannon.woods%transgaming.com@gtempaccount.com4059a382013-04-13 03:31:16 +00009791 {
shannon.woods%transgaming.com@gtempaccount.com2fa73c52013-04-13 03:37:20 +00009792 return gl::error(GL_INVALID_OPERATION);
shannon.woods%transgaming.com@gtempaccount.com4059a382013-04-13 03:31:16 +00009793 }
9794 }
9795 else
9796 {
9797 for (int colorAttachment = 0; colorAttachment < n; colorAttachment++)
9798 {
9799 const GLenum attachment = GL_COLOR_ATTACHMENT0_EXT + colorAttachment;
9800 if (bufs[colorAttachment] != GL_NONE && bufs[colorAttachment] != attachment)
9801 {
9802 return gl::error(GL_INVALID_OPERATION);
9803 }
9804 }
9805 }
9806
9807 gl::Framebuffer *framebuffer = context->getDrawFramebuffer();
9808
9809 for (int colorAttachment = 0; colorAttachment < n; colorAttachment++)
9810 {
9811 framebuffer->setDrawBufferState(colorAttachment, bufs[colorAttachment]);
9812 }
shannon.woods%transgaming.com@gtempaccount.com2fa73c52013-04-13 03:37:20 +00009813
9814 for (int colorAttachment = n; colorAttachment < (int)context->getMaximumRenderTargets(); colorAttachment++)
9815 {
9816 framebuffer->setDrawBufferState(colorAttachment, GL_NONE);
9817 }
shannon.woods%transgaming.com@gtempaccount.com4059a382013-04-13 03:31:16 +00009818 }
9819 }
9820 catch (std::bad_alloc&)
9821 {
9822 return gl::error(GL_OUT_OF_MEMORY);
9823 }
9824}
9825
daniel@transgaming.comce3d0f22010-05-04 03:35:14 +00009826__eglMustCastToProperFunctionPointerType __stdcall glGetProcAddress(const char *procname)
9827{
9828 struct Extension
9829 {
9830 const char *name;
9831 __eglMustCastToProperFunctionPointerType address;
9832 };
9833
9834 static const Extension glExtensions[] =
9835 {
9836 {"glTexImage3DOES", (__eglMustCastToProperFunctionPointerType)glTexImage3DOES},
daniel@transgaming.com01868132010-08-24 19:21:17 +00009837 {"glBlitFramebufferANGLE", (__eglMustCastToProperFunctionPointerType)glBlitFramebufferANGLE},
daniel@transgaming.com1fe96c92011-01-14 15:08:44 +00009838 {"glRenderbufferStorageMultisampleANGLE", (__eglMustCastToProperFunctionPointerType)glRenderbufferStorageMultisampleANGLE},
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00009839 {"glDeleteFencesNV", (__eglMustCastToProperFunctionPointerType)glDeleteFencesNV},
9840 {"glGenFencesNV", (__eglMustCastToProperFunctionPointerType)glGenFencesNV},
9841 {"glIsFenceNV", (__eglMustCastToProperFunctionPointerType)glIsFenceNV},
9842 {"glTestFenceNV", (__eglMustCastToProperFunctionPointerType)glTestFenceNV},
9843 {"glGetFenceivNV", (__eglMustCastToProperFunctionPointerType)glGetFenceivNV},
9844 {"glFinishFenceNV", (__eglMustCastToProperFunctionPointerType)glFinishFenceNV},
9845 {"glSetFenceNV", (__eglMustCastToProperFunctionPointerType)glSetFenceNV},
zmo@google.coma574f782011-10-03 21:45:23 +00009846 {"glGetTranslatedShaderSourceANGLE", (__eglMustCastToProperFunctionPointerType)glGetTranslatedShaderSourceANGLE},
daniel@transgaming.com0bd1f2f2011-11-11 04:19:03 +00009847 {"glTexStorage2DEXT", (__eglMustCastToProperFunctionPointerType)glTexStorage2DEXT},
daniel@transgaming.com709ed112011-11-12 03:18:10 +00009848 {"glGetGraphicsResetStatusEXT", (__eglMustCastToProperFunctionPointerType)glGetGraphicsResetStatusEXT},
9849 {"glReadnPixelsEXT", (__eglMustCastToProperFunctionPointerType)glReadnPixelsEXT},
9850 {"glGetnUniformfvEXT", (__eglMustCastToProperFunctionPointerType)glGetnUniformfvEXT},
9851 {"glGetnUniformivEXT", (__eglMustCastToProperFunctionPointerType)glGetnUniformivEXT},
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00009852 {"glGenQueriesEXT", (__eglMustCastToProperFunctionPointerType)glGenQueriesEXT},
9853 {"glDeleteQueriesEXT", (__eglMustCastToProperFunctionPointerType)glDeleteQueriesEXT},
9854 {"glIsQueryEXT", (__eglMustCastToProperFunctionPointerType)glIsQueryEXT},
9855 {"glBeginQueryEXT", (__eglMustCastToProperFunctionPointerType)glBeginQueryEXT},
9856 {"glEndQueryEXT", (__eglMustCastToProperFunctionPointerType)glEndQueryEXT},
9857 {"glGetQueryivEXT", (__eglMustCastToProperFunctionPointerType)glGetQueryivEXT},
9858 {"glGetQueryObjectuivEXT", (__eglMustCastToProperFunctionPointerType)glGetQueryObjectuivEXT},
shannon.woods%transgaming.com@gtempaccount.com77d94722013-04-13 03:34:22 +00009859 {"glDrawBuffersEXT", (__eglMustCastToProperFunctionPointerType)glDrawBuffersEXT},
daniel@transgaming.comdce02fd2012-01-27 15:39:51 +00009860 {"glVertexAttribDivisorANGLE", (__eglMustCastToProperFunctionPointerType)glVertexAttribDivisorANGLE},
9861 {"glDrawArraysInstancedANGLE", (__eglMustCastToProperFunctionPointerType)glDrawArraysInstancedANGLE},
9862 {"glDrawElementsInstancedANGLE", (__eglMustCastToProperFunctionPointerType)glDrawElementsInstancedANGLE},
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00009863 {"glGetProgramBinaryOES", (__eglMustCastToProperFunctionPointerType)glGetProgramBinaryOES},
9864 {"glProgramBinaryOES", (__eglMustCastToProperFunctionPointerType)glProgramBinaryOES}, };
daniel@transgaming.comce3d0f22010-05-04 03:35:14 +00009865
shannon.woods@transgaming.comd438fd42013-02-28 23:17:45 +00009866 for (unsigned int ext = 0; ext < ArraySize(glExtensions); ext++)
daniel@transgaming.comce3d0f22010-05-04 03:35:14 +00009867 {
9868 if (strcmp(procname, glExtensions[ext].name) == 0)
9869 {
9870 return (__eglMustCastToProperFunctionPointerType)glExtensions[ext].address;
9871 }
9872 }
9873
9874 return NULL;
9875}
9876
daniel@transgaming.com17f548c2011-11-09 17:47:02 +00009877// Non-public functions used by EGL
9878
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00009879bool __stdcall glBindTexImage(egl::Surface *surface)
jbauman@chromium.orgae345802011-03-30 22:04:25 +00009880{
9881 EVENT("(egl::Surface* surface = 0x%0.8p)",
9882 surface);
9883
9884 try
9885 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00009886 gl::Context *context = gl::getNonLostContext();
jbauman@chromium.orgae345802011-03-30 22:04:25 +00009887
9888 if (context)
9889 {
9890 gl::Texture2D *textureObject = context->getTexture2D();
9891
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00009892 if (textureObject->isImmutable())
9893 {
9894 return false;
9895 }
9896
jbauman@chromium.orgae345802011-03-30 22:04:25 +00009897 if (textureObject)
9898 {
9899 textureObject->bindTexImage(surface);
9900 }
9901 }
9902 }
9903 catch(std::bad_alloc&)
9904 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00009905 return gl::error(GL_OUT_OF_MEMORY, false);
jbauman@chromium.orgae345802011-03-30 22:04:25 +00009906 }
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00009907
9908 return true;
jbauman@chromium.orgae345802011-03-30 22:04:25 +00009909}
9910
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00009911}