blob: d01df4725deb3dfa7dd3fe9c8422331b95fe84e2 [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.com1a4e09a2013-04-13 03:33:30 +00006821 if (context && context->getClientVersion() < 3)
6822 {
6823 return gl::error(GL_INVALID_ENUM);
6824 }
6825 else
6826 {
6827 break;
6828 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006829 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006830 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006831 }
6832
6833 if (stride < 0)
6834 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006835 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006836 }
6837
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006838 if (context)
6839 {
shannon.woods%transgaming.com@gtempaccount.com8de4e6a2013-04-13 03:37:44 +00006840 context->setVertexAttribState(index, context->getArrayBuffer(), size, type,
6841 normalized == GL_TRUE, false, stride, ptr);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006842 }
6843 }
6844 catch(std::bad_alloc&)
6845 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006846 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006847 }
6848}
6849
6850void __stdcall glViewport(GLint x, GLint y, GLsizei width, GLsizei height)
6851{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006852 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 +00006853
6854 try
6855 {
6856 if (width < 0 || height < 0)
6857 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006858 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006859 }
6860
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006861 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006862
6863 if (context)
6864 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00006865 context->setViewportParams(x, y, width, height);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006866 }
6867 }
6868 catch(std::bad_alloc&)
6869 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006870 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006871 }
6872}
6873
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006874// OpenGL ES 3.0 functions
6875
6876void __stdcall glReadBuffer(GLenum mode)
6877{
6878 EVENT("(GLenum mode = 0x%X)", mode);
6879
6880 try
6881 {
6882 gl::Context *context = gl::getNonLostContext();
6883
6884 if (context)
6885 {
6886 if (context->getClientVersion() < 3)
6887 {
6888 return gl::error(GL_INVALID_OPERATION);
6889 }
6890 }
6891
6892 UNIMPLEMENTED();
6893 }
6894 catch(std::bad_alloc&)
6895 {
6896 return gl::error(GL_OUT_OF_MEMORY);
6897 }
6898}
6899
6900void __stdcall glDrawRangeElements(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid* indices)
6901{
6902 EVENT("(GLenum mode = 0x%X, GLuint start = %u, GLuint end = %u, GLsizei count = %d, GLenum type = 0x%X, "
6903 "const GLvoid* indices = 0x%0.8p)", mode, start, end, count, type, indices);
6904
6905 try
6906 {
6907 gl::Context *context = gl::getNonLostContext();
6908
6909 if (context)
6910 {
6911 if (context->getClientVersion() < 3)
6912 {
6913 return gl::error(GL_INVALID_OPERATION);
6914 }
6915 }
6916
6917 UNIMPLEMENTED();
6918 }
6919 catch(std::bad_alloc&)
6920 {
6921 return gl::error(GL_OUT_OF_MEMORY);
6922 }
6923}
6924
6925void __stdcall glTexImage3D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid* pixels)
6926{
6927 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint internalformat = %d, GLsizei width = %d, "
6928 "GLsizei height = %d, GLsizei depth = %d, GLint border = %d, GLenum format = 0x%X, "
6929 "GLenum type = 0x%X, const GLvoid* pixels = 0x%0.8p)",
6930 target, level, internalformat, width, height, depth, border, format, type, pixels);
6931
6932 try
6933 {
6934 gl::Context *context = gl::getNonLostContext();
6935
6936 if (context)
6937 {
6938 if (context->getClientVersion() < 3)
6939 {
6940 return gl::error(GL_INVALID_OPERATION);
6941 }
6942 }
6943
6944 UNIMPLEMENTED();
6945 }
6946 catch(std::bad_alloc&)
6947 {
6948 return gl::error(GL_OUT_OF_MEMORY);
6949 }
6950}
6951
6952void __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)
6953{
6954 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
6955 "GLint zoffset = %d, GLsizei width = %d, GLsizei height = %d, GLsizei depth = %d, "
6956 "GLenum format = 0x%X, GLenum type = 0x%X, const GLvoid* pixels = 0x%0.8p)",
6957 target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels);
6958
6959 try
6960 {
6961 gl::Context *context = gl::getNonLostContext();
6962
6963 if (context)
6964 {
6965 if (context->getClientVersion() < 3)
6966 {
6967 return gl::error(GL_INVALID_OPERATION);
6968 }
6969 }
6970
6971 UNIMPLEMENTED();
6972 }
6973 catch(std::bad_alloc&)
6974 {
6975 return gl::error(GL_OUT_OF_MEMORY);
6976 }
6977}
6978
6979void __stdcall glCopyTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height)
6980{
6981 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
6982 "GLint zoffset = %d, GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d)",
6983 target, level, xoffset, yoffset, zoffset, x, y, width, height);
6984
6985 try
6986 {
6987 gl::Context *context = gl::getNonLostContext();
6988
6989 if (context)
6990 {
6991 if (context->getClientVersion() < 3)
6992 {
6993 return gl::error(GL_INVALID_OPERATION);
6994 }
6995 }
6996
6997 UNIMPLEMENTED();
6998 }
6999 catch(std::bad_alloc&)
7000 {
7001 return gl::error(GL_OUT_OF_MEMORY);
7002 }
7003}
7004
7005void __stdcall glCompressedTexImage3D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid* data)
7006{
7007 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint internalformat = %d, GLsizei width = %d, "
7008 "GLsizei height = %d, GLsizei depth = %d, GLint border = %d, GLsizei imageSize = %d, "
7009 "const GLvoid* data = 0x%0.8p)",
7010 target, level, internalformat, width, height, depth, border, imageSize, data);
7011
7012 try
7013 {
7014 gl::Context *context = gl::getNonLostContext();
7015
7016 if (context)
7017 {
7018 if (context->getClientVersion() < 3)
7019 {
7020 return gl::error(GL_INVALID_OPERATION);
7021 }
7022 }
7023
7024 UNIMPLEMENTED();
7025 }
7026 catch(std::bad_alloc&)
7027 {
7028 return gl::error(GL_OUT_OF_MEMORY);
7029 }
7030}
7031
7032void __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)
7033{
7034 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
7035 "GLint zoffset = %d, GLsizei width = %d, GLsizei height = %d, GLsizei depth = %d, "
7036 "GLenum format = 0x%X, GLsizei imageSize = %d, const GLvoid* data = 0x%0.8p)",
7037 target, level, xoffset, yoffset, zoffset, width, height, depth, format, imageSize, data);
7038
7039 try
7040 {
7041 gl::Context *context = gl::getNonLostContext();
7042
7043 if (context)
7044 {
7045 if (context->getClientVersion() < 3)
7046 {
7047 return gl::error(GL_INVALID_OPERATION);
7048 }
7049 }
7050
7051 UNIMPLEMENTED();
7052 }
7053 catch(std::bad_alloc&)
7054 {
7055 return gl::error(GL_OUT_OF_MEMORY);
7056 }
7057}
7058
7059void __stdcall glGenQueries(GLsizei n, GLuint* ids)
7060{
7061 EVENT("(GLsizei n = %d, GLuint* ids = 0x%0.8p)", n, ids);
7062
7063 try
7064 {
7065 gl::Context *context = gl::getNonLostContext();
7066
7067 if (context)
7068 {
7069 if (context->getClientVersion() < 3)
7070 {
7071 return gl::error(GL_INVALID_OPERATION);
7072 }
7073 }
7074
7075 UNIMPLEMENTED();
7076 }
7077 catch(std::bad_alloc&)
7078 {
7079 return gl::error(GL_OUT_OF_MEMORY);
7080 }
7081}
7082
7083void __stdcall glDeleteQueries(GLsizei n, const GLuint* ids)
7084{
7085 EVENT("(GLsizei n = %d, GLuint* ids = 0x%0.8p)", n, ids);
7086
7087 try
7088 {
7089 gl::Context *context = gl::getNonLostContext();
7090
7091 if (context)
7092 {
7093 if (context->getClientVersion() < 3)
7094 {
7095 return gl::error(GL_INVALID_OPERATION);
7096 }
7097 }
7098
7099 UNIMPLEMENTED();
7100 }
7101 catch(std::bad_alloc&)
7102 {
7103 return gl::error(GL_OUT_OF_MEMORY);
7104 }
7105}
7106
7107GLboolean __stdcall glIsQuery(GLuint id)
7108{
7109 EVENT("(GLuint id = %u)", id);
7110
7111 try
7112 {
7113 gl::Context *context = gl::getNonLostContext();
7114
7115 if (context)
7116 {
7117 if (context->getClientVersion() < 3)
7118 {
7119 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
7120 }
7121 }
7122
7123 UNIMPLEMENTED();
7124 }
7125 catch(std::bad_alloc&)
7126 {
7127 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
7128 }
7129
7130 return GL_FALSE;
7131}
7132
7133void __stdcall glBeginQuery(GLenum target, GLuint id)
7134{
7135 EVENT("(GLenum target = 0x%X, GLuint id = %u)", target, id);
7136
7137 try
7138 {
7139 gl::Context *context = gl::getNonLostContext();
7140
7141 if (context)
7142 {
7143 if (context->getClientVersion() < 3)
7144 {
7145 return gl::error(GL_INVALID_OPERATION);
7146 }
7147 }
7148
7149 UNIMPLEMENTED();
7150 }
7151 catch(std::bad_alloc&)
7152 {
7153 return gl::error(GL_OUT_OF_MEMORY);
7154 }
7155}
7156
7157void __stdcall glEndQuery(GLenum target)
7158{
7159 EVENT("(GLenum target = 0x%X)", target);
7160
7161 try
7162 {
7163 gl::Context *context = gl::getNonLostContext();
7164
7165 if (context)
7166 {
7167 if (context->getClientVersion() < 3)
7168 {
7169 return gl::error(GL_INVALID_OPERATION);
7170 }
7171 }
7172
7173 UNIMPLEMENTED();
7174 }
7175 catch(std::bad_alloc&)
7176 {
7177 return gl::error(GL_OUT_OF_MEMORY);
7178 }
7179}
7180
7181void __stdcall glGetQueryiv(GLenum target, GLenum pname, GLint* params)
7182{
7183 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLint* params = 0x%0.8p)", target, pname, params);
7184
7185 try
7186 {
7187 gl::Context *context = gl::getNonLostContext();
7188
7189 if (context)
7190 {
7191 if (context->getClientVersion() < 3)
7192 {
7193 return gl::error(GL_INVALID_OPERATION);
7194 }
7195 }
7196
7197 UNIMPLEMENTED();
7198 }
7199 catch(std::bad_alloc&)
7200 {
7201 return gl::error(GL_OUT_OF_MEMORY);
7202 }
7203}
7204
7205void __stdcall glGetQueryObjectuiv(GLuint id, GLenum pname, GLuint* params)
7206{
7207 EVENT("(GLuint id = %u, GLenum pname = 0x%X, GLint* params = 0x%0.8p)", id, pname, params);
7208
7209 try
7210 {
7211 gl::Context *context = gl::getNonLostContext();
7212
7213 if (context)
7214 {
7215 if (context->getClientVersion() < 3)
7216 {
7217 return gl::error(GL_INVALID_OPERATION);
7218 }
7219 }
7220
7221 UNIMPLEMENTED();
7222 }
7223 catch(std::bad_alloc&)
7224 {
7225 return gl::error(GL_OUT_OF_MEMORY);
7226 }
7227}
7228
7229GLboolean __stdcall glUnmapBuffer(GLenum target)
7230{
7231 EVENT("(GLenum target = 0x%X)", target);
7232
7233 try
7234 {
7235 gl::Context *context = gl::getNonLostContext();
7236
7237 if (context)
7238 {
7239 if (context->getClientVersion() < 3)
7240 {
7241 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
7242 }
7243 }
7244
7245 UNIMPLEMENTED();
7246 }
7247 catch(std::bad_alloc&)
7248 {
7249 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
7250 }
7251
7252 return GL_FALSE;
7253}
7254
7255void __stdcall glGetBufferPointerv(GLenum target, GLenum pname, GLvoid** params)
7256{
7257 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLvoid** params = 0x%0.8p)", target, pname, params);
7258
7259 try
7260 {
7261 gl::Context *context = gl::getNonLostContext();
7262
7263 if (context)
7264 {
7265 if (context->getClientVersion() < 3)
7266 {
7267 return gl::error(GL_INVALID_OPERATION);
7268 }
7269 }
7270
7271 UNIMPLEMENTED();
7272 }
7273 catch(std::bad_alloc&)
7274 {
7275 return gl::error(GL_OUT_OF_MEMORY);
7276 }
7277}
7278
7279void __stdcall glDrawBuffers(GLsizei n, const GLenum* bufs)
7280{
7281 EVENT("(GLsizei n = %d, const GLenum* bufs = 0x%0.8p)", n, bufs);
7282
7283 try
7284 {
7285 gl::Context *context = gl::getNonLostContext();
7286
7287 if (context)
7288 {
7289 if (context->getClientVersion() < 3)
7290 {
7291 return gl::error(GL_INVALID_OPERATION);
7292 }
7293 }
7294
7295 UNIMPLEMENTED();
7296 }
7297 catch(std::bad_alloc&)
7298 {
7299 return gl::error(GL_OUT_OF_MEMORY);
7300 }
7301}
7302
7303void __stdcall glUniformMatrix2x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
7304{
7305 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
7306 location, count, transpose, value);
7307
7308 try
7309 {
7310 gl::Context *context = gl::getNonLostContext();
7311
7312 if (context)
7313 {
7314 if (context->getClientVersion() < 3)
7315 {
7316 return gl::error(GL_INVALID_OPERATION);
7317 }
7318 }
7319
7320 UNIMPLEMENTED();
7321 }
7322 catch(std::bad_alloc&)
7323 {
7324 return gl::error(GL_OUT_OF_MEMORY);
7325 }
7326}
7327
7328void __stdcall glUniformMatrix3x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
7329{
7330 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
7331 location, count, transpose, value);
7332
7333 try
7334 {
7335 gl::Context *context = gl::getNonLostContext();
7336
7337 if (context)
7338 {
7339 if (context->getClientVersion() < 3)
7340 {
7341 return gl::error(GL_INVALID_OPERATION);
7342 }
7343 }
7344
7345 UNIMPLEMENTED();
7346 }
7347 catch(std::bad_alloc&)
7348 {
7349 return gl::error(GL_OUT_OF_MEMORY);
7350 }
7351}
7352
7353void __stdcall glUniformMatrix2x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
7354{
7355 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
7356 location, count, transpose, value);
7357
7358 try
7359 {
7360 gl::Context *context = gl::getNonLostContext();
7361
7362 if (context)
7363 {
7364 if (context->getClientVersion() < 3)
7365 {
7366 return gl::error(GL_INVALID_OPERATION);
7367 }
7368 }
7369
7370 UNIMPLEMENTED();
7371 }
7372 catch(std::bad_alloc&)
7373 {
7374 return gl::error(GL_OUT_OF_MEMORY);
7375 }
7376}
7377
7378void __stdcall glUniformMatrix4x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
7379{
7380 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
7381 location, count, transpose, value);
7382
7383 try
7384 {
7385 gl::Context *context = gl::getNonLostContext();
7386
7387 if (context)
7388 {
7389 if (context->getClientVersion() < 3)
7390 {
7391 return gl::error(GL_INVALID_OPERATION);
7392 }
7393 }
7394
7395 UNIMPLEMENTED();
7396 }
7397 catch(std::bad_alloc&)
7398 {
7399 return gl::error(GL_OUT_OF_MEMORY);
7400 }
7401}
7402
7403void __stdcall glUniformMatrix3x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
7404{
7405 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
7406 location, count, transpose, value);
7407
7408 try
7409 {
7410 gl::Context *context = gl::getNonLostContext();
7411
7412 if (context)
7413 {
7414 if (context->getClientVersion() < 3)
7415 {
7416 return gl::error(GL_INVALID_OPERATION);
7417 }
7418 }
7419
7420 UNIMPLEMENTED();
7421 }
7422 catch(std::bad_alloc&)
7423 {
7424 return gl::error(GL_OUT_OF_MEMORY);
7425 }
7426}
7427
7428void __stdcall glUniformMatrix4x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
7429{
7430 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
7431 location, count, transpose, value);
7432
7433 try
7434 {
7435 gl::Context *context = gl::getNonLostContext();
7436
7437 if (context)
7438 {
7439 if (context->getClientVersion() < 3)
7440 {
7441 return gl::error(GL_INVALID_OPERATION);
7442 }
7443 }
7444
7445 UNIMPLEMENTED();
7446 }
7447 catch(std::bad_alloc&)
7448 {
7449 return gl::error(GL_OUT_OF_MEMORY);
7450 }
7451}
7452
7453void __stdcall glBlitFramebuffer(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter)
7454{
7455 EVENT("(GLint srcX0 = %d, GLint srcY0 = %d, GLint srcX1 = %d, GLint srcY1 = %d, GLint dstX0 = %d, "
7456 "GLint dstY0 = %d, GLint dstX1 = %d, GLint dstY1 = %d, GLbitfield mask = 0x%X, GLenum filter = 0x%X)",
7457 srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter);
7458
7459 try
7460 {
7461 gl::Context *context = gl::getNonLostContext();
7462
7463 if (context)
7464 {
7465 if (context->getClientVersion() < 3)
7466 {
7467 return gl::error(GL_INVALID_OPERATION);
7468 }
7469 }
7470
7471 UNIMPLEMENTED();
7472 }
7473 catch(std::bad_alloc&)
7474 {
7475 return gl::error(GL_OUT_OF_MEMORY);
7476 }
7477}
7478
7479void __stdcall glRenderbufferStorageMultisample(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height)
7480{
7481 EVENT("(GLenum target = 0x%X, GLsizei samples = %d, GLenum internalformat = 0x%X, GLsizei width = %d, GLsizei height = %d)",
7482 target, samples, internalformat, width, height);
7483
7484 try
7485 {
7486 gl::Context *context = gl::getNonLostContext();
7487
7488 if (context)
7489 {
7490 if (context->getClientVersion() < 3)
7491 {
7492 return gl::error(GL_INVALID_OPERATION);
7493 }
7494 }
7495
7496 UNIMPLEMENTED();
7497 }
7498 catch(std::bad_alloc&)
7499 {
7500 return gl::error(GL_OUT_OF_MEMORY);
7501 }
7502}
7503
7504void __stdcall glFramebufferTextureLayer(GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer)
7505{
7506 EVENT("(GLenum target = 0x%X, GLenum attachment = 0x%X, GLuint texture = %u, GLint level = %d, GLint layer = %d)",
7507 target, attachment, texture, level, layer);
7508
7509 try
7510 {
7511 gl::Context *context = gl::getNonLostContext();
7512
7513 if (context)
7514 {
7515 if (context->getClientVersion() < 3)
7516 {
7517 return gl::error(GL_INVALID_OPERATION);
7518 }
7519 }
7520
7521 UNIMPLEMENTED();
7522 }
7523 catch(std::bad_alloc&)
7524 {
7525 return gl::error(GL_OUT_OF_MEMORY);
7526 }
7527}
7528
7529GLvoid* __stdcall glMapBufferRange(GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access)
7530{
7531 EVENT("(GLenum target = 0x%X, GLintptr offset = %d, GLsizeiptr length = %d, GLbitfield access = 0x%X)",
7532 target, offset, length, access);
7533
7534 try
7535 {
7536 gl::Context *context = gl::getNonLostContext();
7537
7538 if (context)
7539 {
7540 if (context->getClientVersion() < 3)
7541 {
7542 return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLvoid*>(NULL));
7543 }
7544 }
7545
7546 UNIMPLEMENTED();
7547 }
7548 catch(std::bad_alloc&)
7549 {
7550 return gl::error(GL_OUT_OF_MEMORY, reinterpret_cast<GLvoid*>(NULL));
7551 }
7552
7553 return NULL;
7554}
7555
7556void __stdcall glFlushMappedBufferRange(GLenum target, GLintptr offset, GLsizeiptr length)
7557{
7558 EVENT("(GLenum target = 0x%X, GLintptr offset = %d, GLsizeiptr length = %d)", target, offset, length);
7559
7560 try
7561 {
7562 gl::Context *context = gl::getNonLostContext();
7563
7564 if (context)
7565 {
7566 if (context->getClientVersion() < 3)
7567 {
7568 return gl::error(GL_INVALID_OPERATION);
7569 }
7570 }
7571
7572 UNIMPLEMENTED();
7573 }
7574 catch(std::bad_alloc&)
7575 {
7576 return gl::error(GL_OUT_OF_MEMORY);
7577 }
7578}
7579
7580void __stdcall glBindVertexArray(GLuint array)
7581{
7582 EVENT("(GLuint array = %u)", array);
7583
7584 try
7585 {
7586 gl::Context *context = gl::getNonLostContext();
7587
7588 if (context)
7589 {
7590 if (context->getClientVersion() < 3)
7591 {
7592 return gl::error(GL_INVALID_OPERATION);
7593 }
7594 }
7595
7596 UNIMPLEMENTED();
7597 }
7598 catch(std::bad_alloc&)
7599 {
7600 return gl::error(GL_OUT_OF_MEMORY);
7601 }
7602}
7603
7604void __stdcall glDeleteVertexArrays(GLsizei n, const GLuint* arrays)
7605{
7606 EVENT("(GLsizei n = %d, const GLuint* arrays = 0x%0.8p)", n, arrays);
7607
7608 try
7609 {
7610 gl::Context *context = gl::getNonLostContext();
7611
7612 if (context)
7613 {
7614 if (context->getClientVersion() < 3)
7615 {
7616 return gl::error(GL_INVALID_OPERATION);
7617 }
7618 }
7619
7620 UNIMPLEMENTED();
7621 }
7622 catch(std::bad_alloc&)
7623 {
7624 return gl::error(GL_OUT_OF_MEMORY);
7625 }
7626}
7627
7628void __stdcall glGenVertexArrays(GLsizei n, GLuint* arrays)
7629{
7630 EVENT("(GLsizei n = %d, GLuint* arrays = 0x%0.8p)", n, arrays);
7631
7632 try
7633 {
7634 gl::Context *context = gl::getNonLostContext();
7635
7636 if (context)
7637 {
7638 if (context->getClientVersion() < 3)
7639 {
7640 return gl::error(GL_INVALID_OPERATION);
7641 }
7642 }
7643
7644 UNIMPLEMENTED();
7645 }
7646 catch(std::bad_alloc&)
7647 {
7648 return gl::error(GL_OUT_OF_MEMORY);
7649 }
7650}
7651
7652GLboolean __stdcall glIsVertexArray(GLuint array)
7653{
7654 EVENT("(GLuint array = %u)", array);
7655
7656 try
7657 {
7658 gl::Context *context = gl::getNonLostContext();
7659
7660 if (context)
7661 {
7662 if (context->getClientVersion() < 3)
7663 {
7664 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
7665 }
7666 }
7667
7668 UNIMPLEMENTED();
7669 }
7670 catch(std::bad_alloc&)
7671 {
7672 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
7673 }
7674
7675 return GL_FALSE;
7676}
7677
7678void __stdcall glGetIntegeri_v(GLenum target, GLuint index, GLint* data)
7679{
7680 EVENT("(GLenum target = 0x%X, GLuint index = %u, GLint* data = 0x%0.8p)",
7681 target, index, data);
7682
7683 try
7684 {
7685 gl::Context *context = gl::getNonLostContext();
7686
7687 if (context)
7688 {
7689 if (context->getClientVersion() < 3)
7690 {
7691 return gl::error(GL_INVALID_OPERATION);
7692 }
7693 }
7694
7695 UNIMPLEMENTED();
7696 }
7697 catch(std::bad_alloc&)
7698 {
7699 return gl::error(GL_OUT_OF_MEMORY);
7700 }
7701}
7702
7703void __stdcall glBeginTransformFeedback(GLenum primitiveMode)
7704{
7705 EVENT("(GLenum primitiveMode = 0x%X)", primitiveMode);
7706
7707 try
7708 {
7709 gl::Context *context = gl::getNonLostContext();
7710
7711 if (context)
7712 {
7713 if (context->getClientVersion() < 3)
7714 {
7715 return gl::error(GL_INVALID_OPERATION);
7716 }
7717 }
7718
7719 UNIMPLEMENTED();
7720 }
7721 catch(std::bad_alloc&)
7722 {
7723 return gl::error(GL_OUT_OF_MEMORY);
7724 }
7725}
7726
7727void __stdcall glEndTransformFeedback(void)
7728{
7729 EVENT("(void)");
7730
7731 try
7732 {
7733 gl::Context *context = gl::getNonLostContext();
7734
7735 if (context)
7736 {
7737 if (context->getClientVersion() < 3)
7738 {
7739 return gl::error(GL_INVALID_OPERATION);
7740 }
7741 }
7742
7743 UNIMPLEMENTED();
7744 }
7745 catch(std::bad_alloc&)
7746 {
7747 return gl::error(GL_OUT_OF_MEMORY);
7748 }
7749}
7750
7751void __stdcall glBindBufferRange(GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size)
7752{
7753 EVENT("(GLenum target = 0x%X, GLuint index = %u, GLuint buffer = %u, GLintptr offset = %d, GLsizeiptr size = %d)",
7754 target, index, buffer, offset, size);
7755
7756 try
7757 {
7758 gl::Context *context = gl::getNonLostContext();
7759
7760 if (context)
7761 {
7762 if (context->getClientVersion() < 3)
7763 {
7764 return gl::error(GL_INVALID_OPERATION);
7765 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007766
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007767 switch (target)
7768 {
7769 case GL_TRANSFORM_FEEDBACK_BUFFER:
7770 if (index > context->getMaxTransformFeedbackBufferBindings())
7771 {
7772 return gl::error(GL_INVALID_VALUE);
7773 }
7774 break;
7775
7776 case GL_UNIFORM_BUFFER:
7777 if (index >= context->getMaximumCombinedUniformBufferBindings())
7778 {
7779 return gl::error(GL_INVALID_VALUE);
7780 }
7781 break;
7782
7783 default:
7784 return gl::error(GL_INVALID_ENUM);
7785 }
7786
7787 gl::Buffer *bufferObject = context->getBuffer(buffer);
7788 if (!bufferObject)
7789 {
7790 // Buffer index must not have been valid
7791 return gl::error(GL_INVALID_VALUE);
7792 }
7793
7794 if (size <= 0 || static_cast<unsigned int>(offset + size) > bufferObject->size())
7795 {
7796 return gl::error(GL_INVALID_VALUE);
7797 }
7798
7799 switch (target)
7800 {
7801 case GL_TRANSFORM_FEEDBACK_BUFFER:
7802 context->bindTransformFeedbackBuffer(buffer, index, offset, size);
7803 break;
7804
7805 case GL_UNIFORM_BUFFER:
7806 context->bindUniformBuffer(buffer, index, offset, size);
7807 break;
7808
7809 default:
7810 UNREACHABLE();
7811 }
7812 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007813 }
7814 catch(std::bad_alloc&)
7815 {
7816 return gl::error(GL_OUT_OF_MEMORY);
7817 }
7818}
7819
7820void __stdcall glBindBufferBase(GLenum target, GLuint index, GLuint buffer)
7821{
7822 EVENT("(GLenum target = 0x%X, GLuint index = %u, GLuint buffer = %u)",
7823 target, index, buffer);
7824
7825 try
7826 {
7827 gl::Context *context = gl::getNonLostContext();
7828
7829 if (context)
7830 {
7831 if (context->getClientVersion() < 3)
7832 {
7833 return gl::error(GL_INVALID_OPERATION);
7834 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007835
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007836 switch (target)
7837 {
7838 case GL_TRANSFORM_FEEDBACK_BUFFER:
7839 if (index > context->getMaxTransformFeedbackBufferBindings())
7840 {
7841 return gl::error(GL_INVALID_VALUE);
7842 }
7843 break;
7844
7845 case GL_UNIFORM_BUFFER:
7846 if (index > context->getMaximumCombinedUniformBufferBindings())
7847 {
7848 return gl::error(GL_INVALID_VALUE);
7849 }
7850 break;
7851
7852 default:
7853 return gl::error(GL_INVALID_ENUM);
7854 }
7855
7856 gl::Buffer *bufferObject = context->getBuffer(buffer);
7857 if (!bufferObject)
7858 {
7859 // Buffer index must not have been valid
7860 return gl::error(GL_INVALID_VALUE);
7861 }
7862
7863 switch (target)
7864 {
7865 case GL_TRANSFORM_FEEDBACK_BUFFER:
7866 context->bindTransformFeedbackBuffer(buffer, index, 0, -1);
7867 break;
7868
7869 case GL_UNIFORM_BUFFER:
7870 context->bindUniformBuffer(buffer, index, 0, -1);
7871 break;
7872
7873 default:
7874 UNREACHABLE();
7875 }
7876 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007877 }
7878 catch(std::bad_alloc&)
7879 {
7880 return gl::error(GL_OUT_OF_MEMORY);
7881 }
7882}
7883
7884void __stdcall glTransformFeedbackVaryings(GLuint program, GLsizei count, const GLchar* const* varyings, GLenum bufferMode)
7885{
7886 EVENT("(GLuint program = %u, GLsizei count = %d, const GLchar* const* varyings = 0x%0.8p, GLenum bufferMode = 0x%X)",
7887 program, count, varyings, bufferMode);
7888
7889 try
7890 {
7891 gl::Context *context = gl::getNonLostContext();
7892
7893 if (context)
7894 {
7895 if (context->getClientVersion() < 3)
7896 {
7897 return gl::error(GL_INVALID_OPERATION);
7898 }
7899 }
7900
7901 UNIMPLEMENTED();
7902 }
7903 catch(std::bad_alloc&)
7904 {
7905 return gl::error(GL_OUT_OF_MEMORY);
7906 }
7907}
7908
7909void __stdcall glGetTransformFeedbackVarying(GLuint program, GLuint index, GLsizei bufSize, GLsizei* length, GLsizei* size, GLenum* type, GLchar* name)
7910{
7911 EVENT("(GLuint program = %u, GLuint index = %u, GLsizei bufSize = %d, GLsizei* length = 0x%0.8p, "
7912 "GLsizei* size = 0x%0.8p, GLenum* type = 0x%0.8p, GLchar* name = 0x%0.8p)",
7913 program, index, bufSize, length, size, type, name);
7914
7915 try
7916 {
7917 gl::Context *context = gl::getNonLostContext();
7918
7919 if (context)
7920 {
7921 if (context->getClientVersion() < 3)
7922 {
7923 return gl::error(GL_INVALID_OPERATION);
7924 }
7925 }
7926
7927 UNIMPLEMENTED();
7928 }
7929 catch(std::bad_alloc&)
7930 {
7931 return gl::error(GL_OUT_OF_MEMORY);
7932 }
7933}
7934
7935void __stdcall glVertexAttribIPointer(GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid* pointer)
7936{
7937 EVENT("(GLuint index = %u, GLint size = %d, GLenum type = 0x%X, GLsizei stride = %d, const GLvoid* pointer = 0x%0.8p)",
7938 index, size, type, stride, pointer);
7939
7940 try
7941 {
7942 gl::Context *context = gl::getNonLostContext();
7943
7944 if (context)
7945 {
7946 if (context->getClientVersion() < 3)
7947 {
7948 return gl::error(GL_INVALID_OPERATION);
7949 }
7950 }
7951
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007952 if (index >= gl::MAX_VERTEX_ATTRIBS)
7953 {
7954 return gl::error(GL_INVALID_VALUE);
7955 }
7956
7957 if (size < 1 || size > 4)
7958 {
7959 return gl::error(GL_INVALID_VALUE);
7960 }
7961
7962 switch (type)
7963 {
7964 case GL_BYTE:
7965 case GL_UNSIGNED_BYTE:
7966 case GL_SHORT:
7967 case GL_UNSIGNED_SHORT:
7968 case GL_INT:
7969 case GL_UNSIGNED_INT:
7970 break;
7971 default:
7972 return gl::error(GL_INVALID_ENUM);
7973 }
7974
7975 if (stride < 0)
7976 {
7977 return gl::error(GL_INVALID_VALUE);
7978 }
7979
7980 if (context)
7981 {
7982 context->setVertexAttribState(index, context->getArrayBuffer(), size, type, false, true,
7983 stride, pointer);
7984 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007985 }
7986 catch(std::bad_alloc&)
7987 {
7988 return gl::error(GL_OUT_OF_MEMORY);
7989 }
7990}
7991
7992void __stdcall glGetVertexAttribIiv(GLuint index, GLenum pname, GLint* params)
7993{
7994 EVENT("(GLuint index = %u, GLenum pname = 0x%X, GLint* params = 0x%0.8p)",
7995 index, pname, params);
7996
7997 try
7998 {
7999 gl::Context *context = gl::getNonLostContext();
8000
8001 if (context)
8002 {
8003 if (context->getClientVersion() < 3)
8004 {
8005 return gl::error(GL_INVALID_OPERATION);
8006 }
8007 }
8008
8009 UNIMPLEMENTED();
8010 }
8011 catch(std::bad_alloc&)
8012 {
8013 return gl::error(GL_OUT_OF_MEMORY);
8014 }
8015}
8016
8017void __stdcall glGetVertexAttribIuiv(GLuint index, GLenum pname, GLuint* params)
8018{
8019 EVENT("(GLuint index = %u, GLenum pname = 0x%X, GLuint* params = 0x%0.8p)",
8020 index, pname, params);
8021
8022 try
8023 {
8024 gl::Context *context = gl::getNonLostContext();
8025
8026 if (context)
8027 {
8028 if (context->getClientVersion() < 3)
8029 {
8030 return gl::error(GL_INVALID_OPERATION);
8031 }
8032 }
8033
8034 UNIMPLEMENTED();
8035 }
8036 catch(std::bad_alloc&)
8037 {
8038 return gl::error(GL_OUT_OF_MEMORY);
8039 }
8040}
8041
8042void __stdcall glVertexAttribI4i(GLuint index, GLint x, GLint y, GLint z, GLint w)
8043{
8044 EVENT("(GLuint index = %u, GLint x = %d, GLint y = %d, GLint z = %d, GLint w = %d)",
8045 index, x, y, z, w);
8046
8047 try
8048 {
8049 gl::Context *context = gl::getNonLostContext();
8050
8051 if (context)
8052 {
8053 if (context->getClientVersion() < 3)
8054 {
8055 return gl::error(GL_INVALID_OPERATION);
8056 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008057
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00008058 if (index >= gl::MAX_VERTEX_ATTRIBS)
8059 {
8060 return gl::error(GL_INVALID_VALUE);
8061 }
8062
8063 GLint vals[4] = { x, y, z, w };
8064 context->setVertexAttribi(index, vals);
8065 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008066 }
8067 catch(std::bad_alloc&)
8068 {
8069 return gl::error(GL_OUT_OF_MEMORY);
8070 }
8071}
8072
8073void __stdcall glVertexAttribI4ui(GLuint index, GLuint x, GLuint y, GLuint z, GLuint w)
8074{
8075 EVENT("(GLuint index = %u, GLuint x = %u, GLuint y = %u, GLuint z = %u, GLuint w = %u)",
8076 index, x, y, z, w);
8077
8078 try
8079 {
8080 gl::Context *context = gl::getNonLostContext();
8081
8082 if (context)
8083 {
8084 if (context->getClientVersion() < 3)
8085 {
8086 return gl::error(GL_INVALID_OPERATION);
8087 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008088
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00008089 if (index >= gl::MAX_VERTEX_ATTRIBS)
8090 {
8091 return gl::error(GL_INVALID_VALUE);
8092 }
8093
8094 GLuint vals[4] = { x, y, z, w };
8095 context->setVertexAttribu(index, vals);
8096 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008097 }
8098 catch(std::bad_alloc&)
8099 {
8100 return gl::error(GL_OUT_OF_MEMORY);
8101 }
8102}
8103
8104void __stdcall glVertexAttribI4iv(GLuint index, const GLint* v)
8105{
8106 EVENT("(GLuint index = %u, const GLint* v = 0x%0.8p)", index, v);
8107
8108 try
8109 {
8110 gl::Context *context = gl::getNonLostContext();
8111
8112 if (context)
8113 {
8114 if (context->getClientVersion() < 3)
8115 {
8116 return gl::error(GL_INVALID_OPERATION);
8117 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008118
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00008119 if (index >= gl::MAX_VERTEX_ATTRIBS)
8120 {
8121 return gl::error(GL_INVALID_VALUE);
8122 }
8123
8124 context->setVertexAttribi(index, v);
8125 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008126 }
8127 catch(std::bad_alloc&)
8128 {
8129 return gl::error(GL_OUT_OF_MEMORY);
8130 }
8131}
8132
8133void __stdcall glVertexAttribI4uiv(GLuint index, const GLuint* v)
8134{
8135 EVENT("(GLuint index = %u, const GLuint* v = 0x%0.8p)", index, v);
8136
8137 try
8138 {
8139 gl::Context *context = gl::getNonLostContext();
8140
8141 if (context)
8142 {
8143 if (context->getClientVersion() < 3)
8144 {
8145 return gl::error(GL_INVALID_OPERATION);
8146 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008147
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00008148 if (index >= gl::MAX_VERTEX_ATTRIBS)
8149 {
8150 return gl::error(GL_INVALID_VALUE);
8151 }
8152
8153 context->setVertexAttribu(index, v);
8154 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008155 }
8156 catch(std::bad_alloc&)
8157 {
8158 return gl::error(GL_OUT_OF_MEMORY);
8159 }
8160}
8161
8162void __stdcall glGetUniformuiv(GLuint program, GLint location, GLuint* params)
8163{
8164 EVENT("(GLuint program = %u, GLint location = %d, GLuint* params = 0x%0.8p)",
8165 program, location, params);
8166
8167 try
8168 {
8169 gl::Context *context = gl::getNonLostContext();
8170
8171 if (context)
8172 {
8173 if (context->getClientVersion() < 3)
8174 {
8175 return gl::error(GL_INVALID_OPERATION);
8176 }
8177 }
8178
8179 UNIMPLEMENTED();
8180 }
8181 catch(std::bad_alloc&)
8182 {
8183 return gl::error(GL_OUT_OF_MEMORY);
8184 }
8185}
8186
8187GLint __stdcall glGetFragDataLocation(GLuint program, const GLchar *name)
8188{
8189 EVENT("(GLuint program = %u, const GLchar *name = 0x%0.8p)",
8190 program, name);
8191
8192 try
8193 {
8194 gl::Context *context = gl::getNonLostContext();
8195
8196 if (context)
8197 {
8198 if (context->getClientVersion() < 3)
8199 {
8200 return gl::error(GL_INVALID_OPERATION, 0);
8201 }
8202 }
8203
8204 UNIMPLEMENTED();
8205 }
8206 catch(std::bad_alloc&)
8207 {
8208 return gl::error(GL_OUT_OF_MEMORY, 0);
8209 }
8210
8211 return 0;
8212}
8213
8214void __stdcall glUniform1ui(GLint location, GLuint v0)
8215{
8216 EVENT("(GLint location = %d, GLuint v0 = %u)",
8217 location, v0);
8218
8219 try
8220 {
8221 gl::Context *context = gl::getNonLostContext();
8222
8223 if (context)
8224 {
8225 if (context->getClientVersion() < 3)
8226 {
8227 return gl::error(GL_INVALID_OPERATION);
8228 }
8229 }
8230
8231 UNIMPLEMENTED();
8232 }
8233 catch(std::bad_alloc&)
8234 {
8235 return gl::error(GL_OUT_OF_MEMORY);
8236 }
8237}
8238
8239void __stdcall glUniform2ui(GLint location, GLuint v0, GLuint v1)
8240{
8241 EVENT("(GLint location = %d, GLuint v0 = %u, GLuint v1 = %u)",
8242 location, v0, v1);
8243
8244 try
8245 {
8246 gl::Context *context = gl::getNonLostContext();
8247
8248 if (context)
8249 {
8250 if (context->getClientVersion() < 3)
8251 {
8252 return gl::error(GL_INVALID_OPERATION);
8253 }
8254 }
8255
8256 UNIMPLEMENTED();
8257 }
8258 catch(std::bad_alloc&)
8259 {
8260 return gl::error(GL_OUT_OF_MEMORY);
8261 }
8262}
8263
8264void __stdcall glUniform3ui(GLint location, GLuint v0, GLuint v1, GLuint v2)
8265{
8266 EVENT("(GLint location = %d, GLuint v0 = %u, GLuint v1 = %u, GLuint v2 = %u)",
8267 location, v0, v1, v2);
8268
8269 try
8270 {
8271 gl::Context *context = gl::getNonLostContext();
8272
8273 if (context)
8274 {
8275 if (context->getClientVersion() < 3)
8276 {
8277 return gl::error(GL_INVALID_OPERATION);
8278 }
8279 }
8280
8281 UNIMPLEMENTED();
8282 }
8283 catch(std::bad_alloc&)
8284 {
8285 return gl::error(GL_OUT_OF_MEMORY);
8286 }
8287}
8288
8289void __stdcall glUniform4ui(GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3)
8290{
8291 EVENT("(GLint location = %d, GLuint v0 = %u, GLuint v1 = %u, GLuint v2 = %u, GLuint v3 = %u)",
8292 location, v0, v1, v2, v3);
8293
8294 try
8295 {
8296 gl::Context *context = gl::getNonLostContext();
8297
8298 if (context)
8299 {
8300 if (context->getClientVersion() < 3)
8301 {
8302 return gl::error(GL_INVALID_OPERATION);
8303 }
8304 }
8305
8306 UNIMPLEMENTED();
8307 }
8308 catch(std::bad_alloc&)
8309 {
8310 return gl::error(GL_OUT_OF_MEMORY);
8311 }
8312}
8313
8314void __stdcall glUniform1uiv(GLint location, GLsizei count, const GLuint* value)
8315{
8316 EVENT("(GLint location = %d, GLsizei count = %d, const GLuint* value = 0x%0.8p)",
8317 location, count, value);
8318
8319 try
8320 {
8321 gl::Context *context = gl::getNonLostContext();
8322
8323 if (context)
8324 {
8325 if (context->getClientVersion() < 3)
8326 {
8327 return gl::error(GL_INVALID_OPERATION);
8328 }
8329 }
8330
8331 UNIMPLEMENTED();
8332 }
8333 catch(std::bad_alloc&)
8334 {
8335 return gl::error(GL_OUT_OF_MEMORY);
8336 }
8337}
8338
8339void __stdcall glUniform2uiv(GLint location, GLsizei count, const GLuint* value)
8340{
8341 EVENT("(GLint location = %d, GLsizei count = %d, const GLuint* value = 0x%0.8p)",
8342 location, count, value);
8343
8344 try
8345 {
8346 gl::Context *context = gl::getNonLostContext();
8347
8348 if (context)
8349 {
8350 if (context->getClientVersion() < 3)
8351 {
8352 return gl::error(GL_INVALID_OPERATION);
8353 }
8354 }
8355
8356 UNIMPLEMENTED();
8357 }
8358 catch(std::bad_alloc&)
8359 {
8360 return gl::error(GL_OUT_OF_MEMORY);
8361 }
8362}
8363
8364void __stdcall glUniform3uiv(GLint location, GLsizei count, const GLuint* value)
8365{
8366 EVENT("(GLint location = %d, GLsizei count = %d, const GLuint* value)",
8367 location, count, value);
8368
8369 try
8370 {
8371 gl::Context *context = gl::getNonLostContext();
8372
8373 if (context)
8374 {
8375 if (context->getClientVersion() < 3)
8376 {
8377 return gl::error(GL_INVALID_OPERATION);
8378 }
8379 }
8380
8381 UNIMPLEMENTED();
8382 }
8383 catch(std::bad_alloc&)
8384 {
8385 return gl::error(GL_OUT_OF_MEMORY);
8386 }
8387}
8388
8389void __stdcall glUniform4uiv(GLint location, GLsizei count, const GLuint* value)
8390{
8391 EVENT("(GLint location = %d, GLsizei count = %d, const GLuint* value = 0x%0.8p)",
8392 location, count, value);
8393
8394 try
8395 {
8396 gl::Context *context = gl::getNonLostContext();
8397
8398 if (context)
8399 {
8400 if (context->getClientVersion() < 3)
8401 {
8402 return gl::error(GL_INVALID_OPERATION);
8403 }
8404 }
8405
8406 UNIMPLEMENTED();
8407 }
8408 catch(std::bad_alloc&)
8409 {
8410 return gl::error(GL_OUT_OF_MEMORY);
8411 }
8412}
8413
8414void __stdcall glClearBufferiv(GLenum buffer, GLint drawbuffer, const GLint* value)
8415{
8416 EVENT("(GLenum buffer = 0x%X, GLint drawbuffer = %d, const GLint* value = 0x%0.8p)",
8417 buffer, drawbuffer, value);
8418
8419 try
8420 {
8421 gl::Context *context = gl::getNonLostContext();
8422
8423 if (context)
8424 {
8425 if (context->getClientVersion() < 3)
8426 {
8427 return gl::error(GL_INVALID_OPERATION);
8428 }
8429 }
8430
8431 UNIMPLEMENTED();
8432 }
8433 catch(std::bad_alloc&)
8434 {
8435 return gl::error(GL_OUT_OF_MEMORY);
8436 }
8437}
8438
8439void __stdcall glClearBufferuiv(GLenum buffer, GLint drawbuffer, const GLuint* value)
8440{
8441 EVENT("(GLenum buffer = 0x%X, GLint drawbuffer = %d, const GLuint* value = 0x%0.8p)",
8442 buffer, drawbuffer, value);
8443
8444 try
8445 {
8446 gl::Context *context = gl::getNonLostContext();
8447
8448 if (context)
8449 {
8450 if (context->getClientVersion() < 3)
8451 {
8452 return gl::error(GL_INVALID_OPERATION);
8453 }
8454 }
8455
8456 UNIMPLEMENTED();
8457 }
8458 catch(std::bad_alloc&)
8459 {
8460 return gl::error(GL_OUT_OF_MEMORY);
8461 }
8462}
8463
8464void __stdcall glClearBufferfv(GLenum buffer, GLint drawbuffer, const GLfloat* value)
8465{
8466 EVENT("(GLenum buffer = 0x%X, GLint drawbuffer = %d, const GLfloat* value = 0x%0.8p)",
8467 buffer, drawbuffer, value);
8468
8469 try
8470 {
8471 gl::Context *context = gl::getNonLostContext();
8472
8473 if (context)
8474 {
8475 if (context->getClientVersion() < 3)
8476 {
8477 return gl::error(GL_INVALID_OPERATION);
8478 }
8479 }
8480
8481 UNIMPLEMENTED();
8482 }
8483 catch(std::bad_alloc&)
8484 {
8485 return gl::error(GL_OUT_OF_MEMORY);
8486 }
8487}
8488
8489void __stdcall glClearBufferfi(GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil)
8490{
8491 EVENT("(GLenum buffer = 0x%X, GLint drawbuffer = %d, GLfloat depth, GLint stencil = %d)",
8492 buffer, drawbuffer, depth, stencil);
8493
8494 try
8495 {
8496 gl::Context *context = gl::getNonLostContext();
8497
8498 if (context)
8499 {
8500 if (context->getClientVersion() < 3)
8501 {
8502 return gl::error(GL_INVALID_OPERATION);
8503 }
8504 }
8505
8506 UNIMPLEMENTED();
8507 }
8508 catch(std::bad_alloc&)
8509 {
8510 return gl::error(GL_OUT_OF_MEMORY);
8511 }
8512}
8513
8514const GLubyte* __stdcall glGetStringi(GLenum name, GLuint index)
8515{
8516 EVENT("(GLenum name = 0x%X, GLuint index = %u)", name, index);
8517
8518 try
8519 {
8520 gl::Context *context = gl::getNonLostContext();
8521
8522 if (context)
8523 {
8524 if (context->getClientVersion() < 3)
8525 {
8526 return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLubyte*>(NULL));
8527 }
8528 }
8529
8530 UNIMPLEMENTED();
8531 }
8532 catch(std::bad_alloc&)
8533 {
8534 return gl::error(GL_OUT_OF_MEMORY, reinterpret_cast<GLubyte*>(NULL));
8535 }
8536
8537 return NULL;
8538}
8539
8540void __stdcall glCopyBufferSubData(GLenum readTarget, GLenum writeTarget, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size)
8541{
8542 EVENT("(GLenum readTarget = 0x%X, GLenum writeTarget = 0x%X, GLintptr readOffset = %d, GLintptr writeOffset = %d, GLsizeiptr size = %d)",
8543 readTarget, writeTarget, readOffset, writeOffset, size);
8544
8545 try
8546 {
8547 gl::Context *context = gl::getNonLostContext();
8548
8549 if (context)
8550 {
8551 if (context->getClientVersion() < 3)
8552 {
8553 return gl::error(GL_INVALID_OPERATION);
8554 }
8555 }
8556
8557 UNIMPLEMENTED();
8558 }
8559 catch(std::bad_alloc&)
8560 {
8561 return gl::error(GL_OUT_OF_MEMORY);
8562 }
8563}
8564
8565void __stdcall glGetUniformIndices(GLuint program, GLsizei uniformCount, const GLchar* const* uniformNames, GLuint* uniformIndices)
8566{
8567 EVENT("(GLuint program = %u, GLsizei uniformCount = %d, const GLchar* const* uniformNames = 0x%0.8p, GLuint* uniformIndices = 0x%0.8p)",
8568 program, uniformCount, uniformNames, uniformIndices);
8569
8570 try
8571 {
8572 gl::Context *context = gl::getNonLostContext();
8573
8574 if (context)
8575 {
8576 if (context->getClientVersion() < 3)
8577 {
8578 return gl::error(GL_INVALID_OPERATION);
8579 }
8580 }
8581
8582 UNIMPLEMENTED();
8583 }
8584 catch(std::bad_alloc&)
8585 {
8586 return gl::error(GL_OUT_OF_MEMORY);
8587 }
8588}
8589
8590void __stdcall glGetActiveUniformsiv(GLuint program, GLsizei uniformCount, const GLuint* uniformIndices, GLenum pname, GLint* params)
8591{
8592 EVENT("(GLuint program = %u, GLsizei uniformCount = %d, const GLuint* uniformIndices = 0x%0.8p, GLenum pname = 0x%X, GLint* params = 0x%0.8p)",
8593 program, uniformCount, uniformIndices, pname, params);
8594
8595 try
8596 {
8597 gl::Context *context = gl::getNonLostContext();
8598
8599 if (context)
8600 {
8601 if (context->getClientVersion() < 3)
8602 {
8603 return gl::error(GL_INVALID_OPERATION);
8604 }
8605 }
8606
8607 UNIMPLEMENTED();
8608 }
8609 catch(std::bad_alloc&)
8610 {
8611 return gl::error(GL_OUT_OF_MEMORY);
8612 }
8613}
8614
8615GLuint __stdcall glGetUniformBlockIndex(GLuint program, const GLchar* uniformBlockName)
8616{
8617 EVENT("(GLuint program = %u, const GLchar* uniformBlockName = 0x%0.8p)", program, uniformBlockName);
8618
8619 try
8620 {
8621 gl::Context *context = gl::getNonLostContext();
8622
8623 if (context)
8624 {
8625 if (context->getClientVersion() < 3)
8626 {
8627 return gl::error(GL_INVALID_OPERATION, 0);
8628 }
8629 }
8630
8631 UNIMPLEMENTED();
8632 }
8633 catch(std::bad_alloc&)
8634 {
8635 return gl::error(GL_OUT_OF_MEMORY, 0);
8636 }
8637
8638 return 0;
8639}
8640
8641void __stdcall glGetActiveUniformBlockiv(GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint* params)
8642{
8643 EVENT("(GLuint program = %u, GLuint uniformBlockIndex = %u, GLenum pname = 0x%X, GLint* params = 0x%0.8p)",
8644 program, uniformBlockIndex, pname, params);
8645
8646 try
8647 {
8648 gl::Context *context = gl::getNonLostContext();
8649
8650 if (context)
8651 {
8652 if (context->getClientVersion() < 3)
8653 {
8654 return gl::error(GL_INVALID_OPERATION);
8655 }
8656 }
8657
8658 UNIMPLEMENTED();
8659 }
8660 catch(std::bad_alloc&)
8661 {
8662 return gl::error(GL_OUT_OF_MEMORY);
8663 }
8664}
8665
8666void __stdcall glGetActiveUniformBlockName(GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei* length, GLchar* uniformBlockName)
8667{
8668 EVENT("(GLuint program = %u, GLuint uniformBlockIndex = %u, GLsizei bufSize = %d, GLsizei* length = 0x%0.8p, GLchar* uniformBlockName = 0x%0.8p)",
8669 program, uniformBlockIndex, bufSize, length, uniformBlockName);
8670
8671 try
8672 {
8673 gl::Context *context = gl::getNonLostContext();
8674
8675 if (context)
8676 {
8677 if (context->getClientVersion() < 3)
8678 {
8679 return gl::error(GL_INVALID_OPERATION);
8680 }
8681 }
8682
8683 UNIMPLEMENTED();
8684 }
8685 catch(std::bad_alloc&)
8686 {
8687 return gl::error(GL_OUT_OF_MEMORY);
8688 }
8689}
8690
8691void __stdcall glUniformBlockBinding(GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding)
8692{
8693 EVENT("(GLuint program = %u, GLuint uniformBlockIndex = %u, GLuint uniformBlockBinding = %u)",
8694 program, uniformBlockIndex, uniformBlockBinding);
8695
8696 try
8697 {
8698 gl::Context *context = gl::getNonLostContext();
8699
8700 if (context)
8701 {
8702 if (context->getClientVersion() < 3)
8703 {
8704 return gl::error(GL_INVALID_OPERATION);
8705 }
8706 }
8707
8708 UNIMPLEMENTED();
8709 }
8710 catch(std::bad_alloc&)
8711 {
8712 return gl::error(GL_OUT_OF_MEMORY);
8713 }
8714}
8715
8716void __stdcall glDrawArraysInstanced(GLenum mode, GLint first, GLsizei count, GLsizei instanceCount)
8717{
8718 EVENT("(GLenum mode = 0x%X, GLint first = %d, GLsizei count = %d, GLsizei instanceCount = %d)",
8719 mode, first, count, instanceCount);
8720
8721 try
8722 {
8723 gl::Context *context = gl::getNonLostContext();
8724
8725 if (context)
8726 {
8727 if (context->getClientVersion() < 3)
8728 {
8729 return gl::error(GL_INVALID_OPERATION);
8730 }
8731 }
8732
8733 UNIMPLEMENTED();
8734 }
8735 catch(std::bad_alloc&)
8736 {
8737 return gl::error(GL_OUT_OF_MEMORY);
8738 }
8739}
8740
8741void __stdcall glDrawElementsInstanced(GLenum mode, GLsizei count, GLenum type, const GLvoid* indices, GLsizei instanceCount)
8742{
8743 EVENT("(GLenum mode = 0x%X, GLsizei count = %d, GLenum type = 0x%X, const GLvoid* indices = 0x%0.8p, GLsizei instanceCount = %d)",
8744 mode, count, type, indices, instanceCount);
8745
8746 try
8747 {
8748 gl::Context *context = gl::getNonLostContext();
8749
8750 if (context)
8751 {
8752 if (context->getClientVersion() < 3)
8753 {
8754 return gl::error(GL_INVALID_OPERATION);
8755 }
8756 }
8757
8758 UNIMPLEMENTED();
8759 }
8760 catch(std::bad_alloc&)
8761 {
8762 return gl::error(GL_OUT_OF_MEMORY);
8763 }
8764}
8765
8766GLsync __stdcall glFenceSync(GLenum condition, GLbitfield flags)
8767{
8768 EVENT("(GLenum condition = 0x%X, GLbitfield flags = 0x%X)", condition, flags);
8769
8770 try
8771 {
8772 gl::Context *context = gl::getNonLostContext();
8773
8774 if (context)
8775 {
8776 if (context->getClientVersion() < 3)
8777 {
8778 return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLsync>(NULL));
8779 }
8780 }
8781
8782 UNIMPLEMENTED();
8783 }
8784 catch(std::bad_alloc&)
8785 {
8786 return gl::error(GL_OUT_OF_MEMORY, reinterpret_cast<GLsync>(NULL));
8787 }
8788
8789 return NULL;
8790}
8791
8792GLboolean __stdcall glIsSync(GLsync sync)
8793{
8794 EVENT("(GLsync sync = 0x%0.8p)", sync);
8795
8796 try
8797 {
8798 gl::Context *context = gl::getNonLostContext();
8799
8800 if (context)
8801 {
8802 if (context->getClientVersion() < 3)
8803 {
8804 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
8805 }
8806 }
8807
8808 UNIMPLEMENTED();
8809 }
8810 catch(std::bad_alloc&)
8811 {
8812 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
8813 }
8814
8815 return GL_FALSE;
8816}
8817
8818void __stdcall glDeleteSync(GLsync sync)
8819{
8820 EVENT("(GLsync sync = 0x%0.8p)", sync);
8821
8822 try
8823 {
8824 gl::Context *context = gl::getNonLostContext();
8825
8826 if (context)
8827 {
8828 if (context->getClientVersion() < 3)
8829 {
8830 return gl::error(GL_INVALID_OPERATION);
8831 }
8832 }
8833
8834 UNIMPLEMENTED();
8835 }
8836 catch(std::bad_alloc&)
8837 {
8838 return gl::error(GL_OUT_OF_MEMORY);
8839 }
8840}
8841
8842GLenum __stdcall glClientWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout)
8843{
8844 EVENT("(GLsync sync = 0x%0.8p, GLbitfield flags = 0x%X, GLuint64 timeout = %llu)",
8845 sync, flags, timeout);
8846
8847 try
8848 {
8849 gl::Context *context = gl::getNonLostContext();
8850
8851 if (context)
8852 {
8853 if (context->getClientVersion() < 3)
8854 {
8855 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
8856 }
8857 }
8858
8859 UNIMPLEMENTED();
8860 }
8861 catch(std::bad_alloc&)
8862 {
8863 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
8864 }
8865
8866 return GL_FALSE;
8867}
8868
8869void __stdcall glWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout)
8870{
8871 EVENT("(GLsync sync = 0x%0.8p, GLbitfield flags = 0x%X, GLuint64 timeout = %llu)",
8872 sync, flags, timeout);
8873
8874 try
8875 {
8876 gl::Context *context = gl::getNonLostContext();
8877
8878 if (context)
8879 {
8880 if (context->getClientVersion() < 3)
8881 {
8882 return gl::error(GL_INVALID_OPERATION);
8883 }
8884 }
8885
8886 UNIMPLEMENTED();
8887 }
8888 catch(std::bad_alloc&)
8889 {
8890 return gl::error(GL_OUT_OF_MEMORY);
8891 }
8892}
8893
8894void __stdcall glGetInteger64v(GLenum pname, GLint64* params)
8895{
8896 EVENT("(GLenum pname = 0x%X, GLint64* params = 0x%0.8p)",
8897 pname, params);
8898
8899 try
8900 {
8901 gl::Context *context = gl::getNonLostContext();
8902
8903 if (context)
8904 {
8905 if (context->getClientVersion() < 3)
8906 {
8907 return gl::error(GL_INVALID_OPERATION);
8908 }
8909 }
8910
8911 UNIMPLEMENTED();
8912 }
8913 catch(std::bad_alloc&)
8914 {
8915 return gl::error(GL_OUT_OF_MEMORY);
8916 }
8917}
8918
8919void __stdcall glGetSynciv(GLsync sync, GLenum pname, GLsizei bufSize, GLsizei* length, GLint* values)
8920{
8921 EVENT("(GLsync sync = 0x%0.8p, GLenum pname = 0x%X, GLsizei bufSize = %d, GLsizei* length = 0x%0.8p, GLint* values = 0x%0.8p)",
8922 sync, pname, bufSize, length, values);
8923
8924 try
8925 {
8926 gl::Context *context = gl::getNonLostContext();
8927
8928 if (context)
8929 {
8930 if (context->getClientVersion() < 3)
8931 {
8932 return gl::error(GL_INVALID_OPERATION);
8933 }
8934 }
8935
8936 UNIMPLEMENTED();
8937 }
8938 catch(std::bad_alloc&)
8939 {
8940 return gl::error(GL_OUT_OF_MEMORY);
8941 }
8942}
8943
8944void __stdcall glGetInteger64i_v(GLenum target, GLuint index, GLint64* data)
8945{
8946 EVENT("(GLenum target = 0x%X, GLuint index = %u, GLint64* data = 0x%0.8p)",
8947 target, index, data);
8948
8949 try
8950 {
8951 gl::Context *context = gl::getNonLostContext();
8952
8953 if (context)
8954 {
8955 if (context->getClientVersion() < 3)
8956 {
8957 return gl::error(GL_INVALID_OPERATION);
8958 }
8959 }
8960
8961 UNIMPLEMENTED();
8962 }
8963 catch(std::bad_alloc&)
8964 {
8965 return gl::error(GL_OUT_OF_MEMORY);
8966 }
8967}
8968
8969void __stdcall glGetBufferParameteri64v(GLenum target, GLenum pname, GLint64* params)
8970{
8971 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLint64* params = 0x%0.8p)",
8972 target, pname, params);
8973
8974 try
8975 {
8976 gl::Context *context = gl::getNonLostContext();
8977
8978 if (context)
8979 {
8980 if (context->getClientVersion() < 3)
8981 {
8982 return gl::error(GL_INVALID_OPERATION);
8983 }
8984 }
8985
8986 UNIMPLEMENTED();
8987 }
8988 catch(std::bad_alloc&)
8989 {
8990 return gl::error(GL_OUT_OF_MEMORY);
8991 }
8992}
8993
8994void __stdcall glGenSamplers(GLsizei count, GLuint* samplers)
8995{
8996 EVENT("(GLsizei count = %d, GLuint* samplers = 0x%0.8p)", count, samplers);
8997
8998 try
8999 {
9000 gl::Context *context = gl::getNonLostContext();
9001
9002 if (context)
9003 {
9004 if (context->getClientVersion() < 3)
9005 {
9006 return gl::error(GL_INVALID_OPERATION);
9007 }
9008 }
9009
9010 UNIMPLEMENTED();
9011 }
9012 catch(std::bad_alloc&)
9013 {
9014 return gl::error(GL_OUT_OF_MEMORY);
9015 }
9016}
9017
9018void __stdcall glDeleteSamplers(GLsizei count, const GLuint* samplers)
9019{
9020 EVENT("(GLsizei count = %d, const GLuint* samplers = 0x%0.8p)", count, samplers);
9021
9022 try
9023 {
9024 gl::Context *context = gl::getNonLostContext();
9025
9026 if (context)
9027 {
9028 if (context->getClientVersion() < 3)
9029 {
9030 return gl::error(GL_INVALID_OPERATION);
9031 }
9032 }
9033
9034 UNIMPLEMENTED();
9035 }
9036 catch(std::bad_alloc&)
9037 {
9038 return gl::error(GL_OUT_OF_MEMORY);
9039 }
9040}
9041
9042GLboolean __stdcall glIsSampler(GLuint sampler)
9043{
9044 EVENT("(GLuint sampler = %u)", sampler);
9045
9046 try
9047 {
9048 gl::Context *context = gl::getNonLostContext();
9049
9050 if (context)
9051 {
9052 if (context->getClientVersion() < 3)
9053 {
9054 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
9055 }
9056 }
9057
9058 UNIMPLEMENTED();
9059 }
9060 catch(std::bad_alloc&)
9061 {
9062 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
9063 }
9064
9065 return GL_FALSE;
9066}
9067
9068void __stdcall glBindSampler(GLuint unit, GLuint sampler)
9069{
9070 EVENT("(GLuint unit = %u, GLuint sampler = %u)", unit, sampler);
9071
9072 try
9073 {
9074 gl::Context *context = gl::getNonLostContext();
9075
9076 if (context)
9077 {
9078 if (context->getClientVersion() < 3)
9079 {
9080 return gl::error(GL_INVALID_OPERATION);
9081 }
9082 }
9083
9084 UNIMPLEMENTED();
9085 }
9086 catch(std::bad_alloc&)
9087 {
9088 return gl::error(GL_OUT_OF_MEMORY);
9089 }
9090}
9091
9092void __stdcall glSamplerParameteri(GLuint sampler, GLenum pname, GLint param)
9093{
9094 EVENT("(GLuint sampler = %u, GLenum pname = 0x%X, GLint param = %d)", sampler, pname, param);
9095
9096 try
9097 {
9098 gl::Context *context = gl::getNonLostContext();
9099
9100 if (context)
9101 {
9102 if (context->getClientVersion() < 3)
9103 {
9104 return gl::error(GL_INVALID_OPERATION);
9105 }
9106 }
9107
9108 UNIMPLEMENTED();
9109 }
9110 catch(std::bad_alloc&)
9111 {
9112 return gl::error(GL_OUT_OF_MEMORY);
9113 }
9114}
9115
9116void __stdcall glSamplerParameteriv(GLuint sampler, GLenum pname, const GLint* param)
9117{
9118 EVENT("(GLuint sampler = %u, GLenum pname = 0x%X, const GLint* param = 0x%0.8p)",
9119 sampler, pname, param);
9120
9121 try
9122 {
9123 gl::Context *context = gl::getNonLostContext();
9124
9125 if (context)
9126 {
9127 if (context->getClientVersion() < 3)
9128 {
9129 return gl::error(GL_INVALID_OPERATION);
9130 }
9131 }
9132
9133 UNIMPLEMENTED();
9134 }
9135 catch(std::bad_alloc&)
9136 {
9137 return gl::error(GL_OUT_OF_MEMORY);
9138 }
9139}
9140
9141void __stdcall glSamplerParameterf(GLuint sampler, GLenum pname, GLfloat param)
9142{
9143 EVENT("(GLuint sampler = %u, GLenum pname = 0x%X, GLfloat param = %g)", sampler, pname, param);
9144
9145 try
9146 {
9147 gl::Context *context = gl::getNonLostContext();
9148
9149 if (context)
9150 {
9151 if (context->getClientVersion() < 3)
9152 {
9153 return gl::error(GL_INVALID_OPERATION);
9154 }
9155 }
9156
9157 UNIMPLEMENTED();
9158 }
9159 catch(std::bad_alloc&)
9160 {
9161 return gl::error(GL_OUT_OF_MEMORY);
9162 }
9163}
9164
9165void __stdcall glSamplerParameterfv(GLuint sampler, GLenum pname, const GLfloat* param)
9166{
9167 EVENT("(GLuint sampler = %u, GLenum pname = 0x%X, const GLfloat* param = 0x%0.8p)", sampler, pname, param);
9168
9169 try
9170 {
9171 gl::Context *context = gl::getNonLostContext();
9172
9173 if (context)
9174 {
9175 if (context->getClientVersion() < 3)
9176 {
9177 return gl::error(GL_INVALID_OPERATION);
9178 }
9179 }
9180
9181 UNIMPLEMENTED();
9182 }
9183 catch(std::bad_alloc&)
9184 {
9185 return gl::error(GL_OUT_OF_MEMORY);
9186 }
9187}
9188
9189void __stdcall glGetSamplerParameteriv(GLuint sampler, GLenum pname, GLint* params)
9190{
9191 EVENT("(GLuint sampler = %u, GLenum pname = 0x%X, GLint* params = 0x%0.8p)", sampler, pname, params);
9192
9193 try
9194 {
9195 gl::Context *context = gl::getNonLostContext();
9196
9197 if (context)
9198 {
9199 if (context->getClientVersion() < 3)
9200 {
9201 return gl::error(GL_INVALID_OPERATION);
9202 }
9203 }
9204
9205 UNIMPLEMENTED();
9206 }
9207 catch(std::bad_alloc&)
9208 {
9209 return gl::error(GL_OUT_OF_MEMORY);
9210 }
9211}
9212
9213void __stdcall glGetSamplerParameterfv(GLuint sampler, GLenum pname, GLfloat* params)
9214{
9215 EVENT("(GLuint sample = %ur, GLenum pname = 0x%X, GLfloat* params = 0x%0.8p)", sampler, pname, params);
9216
9217 try
9218 {
9219 gl::Context *context = gl::getNonLostContext();
9220
9221 if (context)
9222 {
9223 if (context->getClientVersion() < 3)
9224 {
9225 return gl::error(GL_INVALID_OPERATION);
9226 }
9227 }
9228
9229 UNIMPLEMENTED();
9230 }
9231 catch(std::bad_alloc&)
9232 {
9233 return gl::error(GL_OUT_OF_MEMORY);
9234 }
9235}
9236
9237void __stdcall glVertexAttribDivisor(GLuint index, GLuint divisor)
9238{
9239 EVENT("(GLuint index = %u, GLuint divisor = %u)", index, divisor);
9240
9241 try
9242 {
shannon.woods%transgaming.com@gtempaccount.com8736bd62013-04-13 03:35:41 +00009243 if (index >= gl::MAX_VERTEX_ATTRIBS)
9244 {
9245 return gl::error(GL_INVALID_VALUE);
9246 }
9247
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009248 gl::Context *context = gl::getNonLostContext();
9249
9250 if (context)
9251 {
9252 if (context->getClientVersion() < 3)
9253 {
9254 return gl::error(GL_INVALID_OPERATION);
9255 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009256
shannon.woods%transgaming.com@gtempaccount.com8736bd62013-04-13 03:35:41 +00009257 context->setVertexAttribDivisor(index, divisor);
9258 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009259 }
9260 catch(std::bad_alloc&)
9261 {
9262 return gl::error(GL_OUT_OF_MEMORY);
9263 }
9264}
9265
9266void __stdcall glBindTransformFeedback(GLenum target, GLuint id)
9267{
9268 EVENT("(GLenum target = 0x%X, GLuint id = %u)", target, id);
9269
9270 try
9271 {
9272 gl::Context *context = gl::getNonLostContext();
9273
9274 if (context)
9275 {
9276 if (context->getClientVersion() < 3)
9277 {
9278 return gl::error(GL_INVALID_OPERATION);
9279 }
9280 }
9281
9282 UNIMPLEMENTED();
9283 }
9284 catch(std::bad_alloc&)
9285 {
9286 return gl::error(GL_OUT_OF_MEMORY);
9287 }
9288}
9289
9290void __stdcall glDeleteTransformFeedbacks(GLsizei n, const GLuint* ids)
9291{
9292 EVENT("(GLsizei n = %d, const GLuint* ids = 0x%0.8p)", n, ids);
9293
9294 try
9295 {
9296 gl::Context *context = gl::getNonLostContext();
9297
9298 if (context)
9299 {
9300 if (context->getClientVersion() < 3)
9301 {
9302 return gl::error(GL_INVALID_OPERATION);
9303 }
9304 }
9305
9306 UNIMPLEMENTED();
9307 }
9308 catch(std::bad_alloc&)
9309 {
9310 return gl::error(GL_OUT_OF_MEMORY);
9311 }
9312}
9313
9314void __stdcall glGenTransformFeedbacks(GLsizei n, GLuint* ids)
9315{
9316 EVENT("(GLsizei n = %d, GLuint* ids = 0x%0.8p)", n, ids);
9317
9318 try
9319 {
9320 gl::Context *context = gl::getNonLostContext();
9321
9322 if (context)
9323 {
9324 if (context->getClientVersion() < 3)
9325 {
9326 return gl::error(GL_INVALID_OPERATION);
9327 }
9328 }
9329
9330 UNIMPLEMENTED();
9331 }
9332 catch(std::bad_alloc&)
9333 {
9334 return gl::error(GL_OUT_OF_MEMORY);
9335 }
9336}
9337
9338GLboolean __stdcall glIsTransformFeedback(GLuint id)
9339{
9340 EVENT("(GLuint id = %u)", id);
9341
9342 try
9343 {
9344 gl::Context *context = gl::getNonLostContext();
9345
9346 if (context)
9347 {
9348 if (context->getClientVersion() < 3)
9349 {
9350 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
9351 }
9352 }
9353
9354 UNIMPLEMENTED();
9355 }
9356 catch(std::bad_alloc&)
9357 {
9358 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
9359 }
9360
9361 return GL_FALSE;
9362}
9363
9364void __stdcall glPauseTransformFeedback(void)
9365{
9366 EVENT("(void)");
9367
9368 try
9369 {
9370 gl::Context *context = gl::getNonLostContext();
9371
9372 if (context)
9373 {
9374 if (context->getClientVersion() < 3)
9375 {
9376 return gl::error(GL_INVALID_OPERATION);
9377 }
9378 }
9379
9380 UNIMPLEMENTED();
9381 }
9382 catch(std::bad_alloc&)
9383 {
9384 return gl::error(GL_OUT_OF_MEMORY);
9385 }
9386}
9387
9388void __stdcall glResumeTransformFeedback(void)
9389{
9390 EVENT("(void)");
9391
9392 try
9393 {
9394 gl::Context *context = gl::getNonLostContext();
9395
9396 if (context)
9397 {
9398 if (context->getClientVersion() < 3)
9399 {
9400 return gl::error(GL_INVALID_OPERATION);
9401 }
9402 }
9403
9404 UNIMPLEMENTED();
9405 }
9406 catch(std::bad_alloc&)
9407 {
9408 return gl::error(GL_OUT_OF_MEMORY);
9409 }
9410}
9411
9412void __stdcall glGetProgramBinary(GLuint program, GLsizei bufSize, GLsizei* length, GLenum* binaryFormat, GLvoid* binary)
9413{
9414 EVENT("(GLuint program = %u, GLsizei bufSize = %d, GLsizei* length = 0x%0.8p, GLenum* binaryFormat = 0x%0.8p, GLvoid* binary = 0x%0.8p)",
9415 program, bufSize, length, binaryFormat, binary);
9416
9417 try
9418 {
9419 gl::Context *context = gl::getNonLostContext();
9420
9421 if (context)
9422 {
9423 if (context->getClientVersion() < 3)
9424 {
9425 return gl::error(GL_INVALID_OPERATION);
9426 }
9427 }
9428
9429 UNIMPLEMENTED();
9430 }
9431 catch(std::bad_alloc&)
9432 {
9433 return gl::error(GL_OUT_OF_MEMORY);
9434 }
9435}
9436
9437void __stdcall glProgramBinary(GLuint program, GLenum binaryFormat, const GLvoid* binary, GLsizei length)
9438{
9439 EVENT("(GLuint program = %u, GLenum binaryFormat = 0x%X, const GLvoid* binary = 0x%0.8p, GLsizei length = %d)",
9440 program, binaryFormat, binary, length);
9441
9442 try
9443 {
9444 gl::Context *context = gl::getNonLostContext();
9445
9446 if (context)
9447 {
9448 if (context->getClientVersion() < 3)
9449 {
9450 return gl::error(GL_INVALID_OPERATION);
9451 }
9452 }
9453
9454 UNIMPLEMENTED();
9455 }
9456 catch(std::bad_alloc&)
9457 {
9458 return gl::error(GL_OUT_OF_MEMORY);
9459 }
9460}
9461
9462void __stdcall glProgramParameteri(GLuint program, GLenum pname, GLint value)
9463{
9464 EVENT("(GLuint program = %u, GLenum pname = 0x%X, GLint value = %d)",
9465 program, pname, value);
9466
9467 try
9468 {
9469 gl::Context *context = gl::getNonLostContext();
9470
9471 if (context)
9472 {
9473 if (context->getClientVersion() < 3)
9474 {
9475 return gl::error(GL_INVALID_OPERATION);
9476 }
9477 }
9478
9479 UNIMPLEMENTED();
9480 }
9481 catch(std::bad_alloc&)
9482 {
9483 return gl::error(GL_OUT_OF_MEMORY);
9484 }
9485}
9486
9487void __stdcall glInvalidateFramebuffer(GLenum target, GLsizei numAttachments, const GLenum* attachments)
9488{
9489 EVENT("(GLenum target = 0x%X, GLsizei numAttachments = %d, const GLenum* attachments = 0x%0.8p)",
9490 target, numAttachments, attachments);
9491
9492 try
9493 {
9494 gl::Context *context = gl::getNonLostContext();
9495
9496 if (context)
9497 {
9498 if (context->getClientVersion() < 3)
9499 {
9500 return gl::error(GL_INVALID_OPERATION);
9501 }
9502 }
9503
9504 UNIMPLEMENTED();
9505 }
9506 catch(std::bad_alloc&)
9507 {
9508 return gl::error(GL_OUT_OF_MEMORY);
9509 }
9510}
9511
9512void __stdcall glInvalidateSubFramebuffer(GLenum target, GLsizei numAttachments, const GLenum* attachments, GLint x, GLint y, GLsizei width, GLsizei height)
9513{
9514 EVENT("(GLenum target = 0x%X, GLsizei numAttachments = %d, const GLenum* attachments = 0x%0.8p, GLint x = %d, "
9515 "GLint y = %d, GLsizei width = %d, GLsizei height = %d)",
9516 target, numAttachments, attachments, x, y, width, height);
9517
9518 try
9519 {
9520 gl::Context *context = gl::getNonLostContext();
9521
9522 if (context)
9523 {
9524 if (context->getClientVersion() < 3)
9525 {
9526 return gl::error(GL_INVALID_OPERATION);
9527 }
9528 }
9529
9530 UNIMPLEMENTED();
9531 }
9532 catch(std::bad_alloc&)
9533 {
9534 return gl::error(GL_OUT_OF_MEMORY);
9535 }
9536}
9537
9538void __stdcall glTexStorage2D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height)
9539{
9540 EVENT("(GLenum target = 0x%X, GLsizei levels = %d, GLenum internalformat = 0x%X, GLsizei width = %d, GLsizei height = %d)",
9541 target, levels, internalformat, width, height);
9542
9543 try
9544 {
9545 gl::Context *context = gl::getNonLostContext();
9546
9547 if (context)
9548 {
9549 if (context->getClientVersion() < 3)
9550 {
9551 return gl::error(GL_INVALID_OPERATION);
9552 }
9553 }
9554
9555 UNIMPLEMENTED();
9556 }
9557 catch(std::bad_alloc&)
9558 {
9559 return gl::error(GL_OUT_OF_MEMORY);
9560 }
9561}
9562
9563void __stdcall glTexStorage3D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth)
9564{
9565 EVENT("(GLenum target = 0x%X, GLsizei levels = %d, GLenum internalformat = 0x%X, GLsizei width = %d, "
9566 "GLsizei height = %d, GLsizei depth = %d)",
9567 target, levels, internalformat, width, height, depth);
9568
9569 try
9570 {
9571 gl::Context *context = gl::getNonLostContext();
9572
9573 if (context)
9574 {
9575 if (context->getClientVersion() < 3)
9576 {
9577 return gl::error(GL_INVALID_OPERATION);
9578 }
shannon.woods%transgaming.com@gtempaccount.com14eb55e2013-04-13 03:35:06 +00009579 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009580 }
9581 catch(std::bad_alloc&)
9582 {
9583 return gl::error(GL_OUT_OF_MEMORY);
9584 }
9585}
9586
9587void __stdcall glGetInternalformativ(GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize, GLint* params)
9588{
9589 EVENT("(GLenum target = 0x%X, GLenum internalformat = 0x%X, GLenum pname = 0x%X, GLsizei bufSize = %d, "
9590 "GLint* params = 0x%0.8p)",
9591 target, internalformat, pname, bufSize, params);
9592
9593 try
9594 {
9595 gl::Context *context = gl::getNonLostContext();
9596
9597 if (context)
9598 {
9599 if (context->getClientVersion() < 3)
9600 {
9601 return gl::error(GL_INVALID_OPERATION);
9602 }
9603 }
9604
9605 UNIMPLEMENTED();
9606 }
9607 catch(std::bad_alloc&)
9608 {
9609 return gl::error(GL_OUT_OF_MEMORY);
9610 }
9611}
9612
9613// Extension functions
9614
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +00009615void __stdcall glBlitFramebufferANGLE(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1,
9616 GLbitfield mask, GLenum filter)
9617{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00009618 EVENT("(GLint srcX0 = %d, GLint srcY0 = %d, GLint srcX1 = %d, GLint srcY1 = %d, "
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +00009619 "GLint dstX0 = %d, GLint dstY0 = %d, GLint dstX1 = %d, GLint dstY1 = %d, "
9620 "GLbitfield mask = 0x%X, GLenum filter = 0x%X)",
9621 srcX0, srcY0, srcX1, srcX1, dstX0, dstY0, dstX1, dstY1, mask, filter);
9622
9623 try
9624 {
9625 switch (filter)
9626 {
9627 case GL_NEAREST:
9628 break;
9629 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00009630 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +00009631 }
9632
9633 if ((mask & ~(GL_COLOR_BUFFER_BIT | GL_STENCIL_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)) != 0)
9634 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00009635 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +00009636 }
9637
9638 if (srcX1 - srcX0 != dstX1 - dstX0 || srcY1 - srcY0 != dstY1 - dstY0)
9639 {
9640 ERR("Scaling and flipping in BlitFramebufferANGLE not supported by this implementation");
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00009641 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +00009642 }
9643
daniel@transgaming.com9d788502011-11-09 17:46:55 +00009644 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +00009645
9646 if (context)
9647 {
9648 if (context->getReadFramebufferHandle() == context->getDrawFramebufferHandle())
9649 {
9650 ERR("Blits with the same source and destination framebuffer are not supported by this implementation.");
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00009651 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +00009652 }
9653
9654 context->blitFramebuffer(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask);
9655 }
9656 }
9657 catch(std::bad_alloc&)
9658 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00009659 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +00009660 }
9661}
9662
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00009663void __stdcall glTexImage3DOES(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth,
9664 GLint border, GLenum format, GLenum type, const GLvoid* pixels)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00009665{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00009666 EVENT("(GLenum target = 0x%X, GLint level = %d, GLenum internalformat = 0x%X, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00009667 "GLsizei width = %d, GLsizei height = %d, GLsizei depth = %d, GLint border = %d, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00009668 "GLenum format = 0x%X, GLenum type = 0x%x, const GLvoid* pixels = 0x%0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00009669 target, level, internalformat, width, height, depth, border, format, type, pixels);
9670
9671 try
9672 {
9673 UNIMPLEMENTED(); // FIXME
9674 }
9675 catch(std::bad_alloc&)
9676 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00009677 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00009678 }
9679}
daniel@transgaming.comce3d0f22010-05-04 03:35:14 +00009680
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00009681void __stdcall glGetProgramBinaryOES(GLuint program, GLsizei bufSize, GLsizei *length,
9682 GLenum *binaryFormat, void *binary)
9683{
apatrick@chromium.org90080e32012-07-09 22:15:33 +00009684 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 +00009685 program, bufSize, length, binaryFormat, binary);
9686
9687 try
9688 {
9689 gl::Context *context = gl::getNonLostContext();
9690
9691 if (context)
9692 {
9693 gl::Program *programObject = context->getProgram(program);
9694
daniel@transgaming.com716056c2012-07-24 18:38:59 +00009695 if (!programObject || !programObject->isLinked())
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00009696 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00009697 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00009698 }
9699
9700 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
9701
9702 if (!programBinary)
9703 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00009704 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00009705 }
9706
apatrick@chromium.org90080e32012-07-09 22:15:33 +00009707 if (!programBinary->save(binary, bufSize, length))
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00009708 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00009709 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00009710 }
apatrick@chromium.org90080e32012-07-09 22:15:33 +00009711
9712 *binaryFormat = GL_PROGRAM_BINARY_ANGLE;
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00009713 }
9714 }
9715 catch(std::bad_alloc&)
9716 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00009717 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00009718 }
9719}
9720
9721void __stdcall glProgramBinaryOES(GLuint program, GLenum binaryFormat,
9722 const void *binary, GLint length)
9723{
9724 EVENT("(GLenum program = 0x%X, binaryFormat = 0x%x, binary = 0x%0.8p, length = %d)",
9725 program, binaryFormat, binary, length);
9726
9727 try
9728 {
9729 gl::Context *context = gl::getNonLostContext();
9730
9731 if (context)
9732 {
9733 if (binaryFormat != GL_PROGRAM_BINARY_ANGLE)
9734 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00009735 return gl::error(GL_INVALID_ENUM);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00009736 }
9737
9738 gl::Program *programObject = context->getProgram(program);
9739
9740 if (!programObject)
9741 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00009742 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00009743 }
9744
daniel@transgaming.com95d29422012-07-24 18:36:10 +00009745 context->setProgramBinary(program, binary, length);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00009746 }
9747 }
9748 catch(std::bad_alloc&)
9749 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00009750 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00009751 }
9752}
9753
shannon.woods%transgaming.com@gtempaccount.com4059a382013-04-13 03:31:16 +00009754void __stdcall glDrawBuffersEXT(GLsizei n, const GLenum *bufs)
9755{
9756 EVENT("(GLenum n = %d, bufs = 0x%0.8p)", n, bufs);
9757
9758 try
9759 {
9760 gl::Context *context = gl::getNonLostContext();
9761
9762 if (context)
9763 {
9764 if (n < 0 || (unsigned int)n > context->getMaximumRenderTargets())
9765 {
9766 return gl::error(GL_INVALID_VALUE);
9767 }
9768
9769 if (context->getDrawFramebufferHandle() == 0)
9770 {
shannon.woods%transgaming.com@gtempaccount.com2fa73c52013-04-13 03:37:20 +00009771 if (n != 1)
shannon.woods%transgaming.com@gtempaccount.com4059a382013-04-13 03:31:16 +00009772 {
9773 return gl::error(GL_INVALID_OPERATION);
9774 }
9775
shannon.woods%transgaming.com@gtempaccount.com2fa73c52013-04-13 03:37:20 +00009776 if (bufs[0] != GL_NONE && bufs[0] != GL_BACK)
shannon.woods%transgaming.com@gtempaccount.com4059a382013-04-13 03:31:16 +00009777 {
shannon.woods%transgaming.com@gtempaccount.com2fa73c52013-04-13 03:37:20 +00009778 return gl::error(GL_INVALID_OPERATION);
shannon.woods%transgaming.com@gtempaccount.com4059a382013-04-13 03:31:16 +00009779 }
9780 }
9781 else
9782 {
9783 for (int colorAttachment = 0; colorAttachment < n; colorAttachment++)
9784 {
9785 const GLenum attachment = GL_COLOR_ATTACHMENT0_EXT + colorAttachment;
9786 if (bufs[colorAttachment] != GL_NONE && bufs[colorAttachment] != attachment)
9787 {
9788 return gl::error(GL_INVALID_OPERATION);
9789 }
9790 }
9791 }
9792
9793 gl::Framebuffer *framebuffer = context->getDrawFramebuffer();
9794
9795 for (int colorAttachment = 0; colorAttachment < n; colorAttachment++)
9796 {
9797 framebuffer->setDrawBufferState(colorAttachment, bufs[colorAttachment]);
9798 }
shannon.woods%transgaming.com@gtempaccount.com2fa73c52013-04-13 03:37:20 +00009799
9800 for (int colorAttachment = n; colorAttachment < (int)context->getMaximumRenderTargets(); colorAttachment++)
9801 {
9802 framebuffer->setDrawBufferState(colorAttachment, GL_NONE);
9803 }
shannon.woods%transgaming.com@gtempaccount.com4059a382013-04-13 03:31:16 +00009804 }
9805 }
9806 catch (std::bad_alloc&)
9807 {
9808 return gl::error(GL_OUT_OF_MEMORY);
9809 }
9810}
9811
daniel@transgaming.comce3d0f22010-05-04 03:35:14 +00009812__eglMustCastToProperFunctionPointerType __stdcall glGetProcAddress(const char *procname)
9813{
9814 struct Extension
9815 {
9816 const char *name;
9817 __eglMustCastToProperFunctionPointerType address;
9818 };
9819
9820 static const Extension glExtensions[] =
9821 {
9822 {"glTexImage3DOES", (__eglMustCastToProperFunctionPointerType)glTexImage3DOES},
daniel@transgaming.com01868132010-08-24 19:21:17 +00009823 {"glBlitFramebufferANGLE", (__eglMustCastToProperFunctionPointerType)glBlitFramebufferANGLE},
daniel@transgaming.com1fe96c92011-01-14 15:08:44 +00009824 {"glRenderbufferStorageMultisampleANGLE", (__eglMustCastToProperFunctionPointerType)glRenderbufferStorageMultisampleANGLE},
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00009825 {"glDeleteFencesNV", (__eglMustCastToProperFunctionPointerType)glDeleteFencesNV},
9826 {"glGenFencesNV", (__eglMustCastToProperFunctionPointerType)glGenFencesNV},
9827 {"glIsFenceNV", (__eglMustCastToProperFunctionPointerType)glIsFenceNV},
9828 {"glTestFenceNV", (__eglMustCastToProperFunctionPointerType)glTestFenceNV},
9829 {"glGetFenceivNV", (__eglMustCastToProperFunctionPointerType)glGetFenceivNV},
9830 {"glFinishFenceNV", (__eglMustCastToProperFunctionPointerType)glFinishFenceNV},
9831 {"glSetFenceNV", (__eglMustCastToProperFunctionPointerType)glSetFenceNV},
zmo@google.coma574f782011-10-03 21:45:23 +00009832 {"glGetTranslatedShaderSourceANGLE", (__eglMustCastToProperFunctionPointerType)glGetTranslatedShaderSourceANGLE},
daniel@transgaming.com0bd1f2f2011-11-11 04:19:03 +00009833 {"glTexStorage2DEXT", (__eglMustCastToProperFunctionPointerType)glTexStorage2DEXT},
daniel@transgaming.com709ed112011-11-12 03:18:10 +00009834 {"glGetGraphicsResetStatusEXT", (__eglMustCastToProperFunctionPointerType)glGetGraphicsResetStatusEXT},
9835 {"glReadnPixelsEXT", (__eglMustCastToProperFunctionPointerType)glReadnPixelsEXT},
9836 {"glGetnUniformfvEXT", (__eglMustCastToProperFunctionPointerType)glGetnUniformfvEXT},
9837 {"glGetnUniformivEXT", (__eglMustCastToProperFunctionPointerType)glGetnUniformivEXT},
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00009838 {"glGenQueriesEXT", (__eglMustCastToProperFunctionPointerType)glGenQueriesEXT},
9839 {"glDeleteQueriesEXT", (__eglMustCastToProperFunctionPointerType)glDeleteQueriesEXT},
9840 {"glIsQueryEXT", (__eglMustCastToProperFunctionPointerType)glIsQueryEXT},
9841 {"glBeginQueryEXT", (__eglMustCastToProperFunctionPointerType)glBeginQueryEXT},
9842 {"glEndQueryEXT", (__eglMustCastToProperFunctionPointerType)glEndQueryEXT},
9843 {"glGetQueryivEXT", (__eglMustCastToProperFunctionPointerType)glGetQueryivEXT},
9844 {"glGetQueryObjectuivEXT", (__eglMustCastToProperFunctionPointerType)glGetQueryObjectuivEXT},
shannon.woods%transgaming.com@gtempaccount.com77d94722013-04-13 03:34:22 +00009845 {"glDrawBuffersEXT", (__eglMustCastToProperFunctionPointerType)glDrawBuffersEXT},
daniel@transgaming.comdce02fd2012-01-27 15:39:51 +00009846 {"glVertexAttribDivisorANGLE", (__eglMustCastToProperFunctionPointerType)glVertexAttribDivisorANGLE},
9847 {"glDrawArraysInstancedANGLE", (__eglMustCastToProperFunctionPointerType)glDrawArraysInstancedANGLE},
9848 {"glDrawElementsInstancedANGLE", (__eglMustCastToProperFunctionPointerType)glDrawElementsInstancedANGLE},
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00009849 {"glGetProgramBinaryOES", (__eglMustCastToProperFunctionPointerType)glGetProgramBinaryOES},
9850 {"glProgramBinaryOES", (__eglMustCastToProperFunctionPointerType)glProgramBinaryOES}, };
daniel@transgaming.comce3d0f22010-05-04 03:35:14 +00009851
shannon.woods@transgaming.comd438fd42013-02-28 23:17:45 +00009852 for (unsigned int ext = 0; ext < ArraySize(glExtensions); ext++)
daniel@transgaming.comce3d0f22010-05-04 03:35:14 +00009853 {
9854 if (strcmp(procname, glExtensions[ext].name) == 0)
9855 {
9856 return (__eglMustCastToProperFunctionPointerType)glExtensions[ext].address;
9857 }
9858 }
9859
9860 return NULL;
9861}
9862
daniel@transgaming.com17f548c2011-11-09 17:47:02 +00009863// Non-public functions used by EGL
9864
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00009865bool __stdcall glBindTexImage(egl::Surface *surface)
jbauman@chromium.orgae345802011-03-30 22:04:25 +00009866{
9867 EVENT("(egl::Surface* surface = 0x%0.8p)",
9868 surface);
9869
9870 try
9871 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00009872 gl::Context *context = gl::getNonLostContext();
jbauman@chromium.orgae345802011-03-30 22:04:25 +00009873
9874 if (context)
9875 {
9876 gl::Texture2D *textureObject = context->getTexture2D();
9877
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00009878 if (textureObject->isImmutable())
9879 {
9880 return false;
9881 }
9882
jbauman@chromium.orgae345802011-03-30 22:04:25 +00009883 if (textureObject)
9884 {
9885 textureObject->bindTexImage(surface);
9886 }
9887 }
9888 }
9889 catch(std::bad_alloc&)
9890 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00009891 return gl::error(GL_OUT_OF_MEMORY, false);
jbauman@chromium.orgae345802011-03-30 22:04:25 +00009892 }
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00009893
9894 return true;
jbauman@chromium.orgae345802011-03-30 22:04:25 +00009895}
9896
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00009897}