blob: 8eb8e91213ee433b3bc56079c2732c13edc0f0cc [file] [log] [blame]
shannon.woods@transgaming.combdf2d802013-02-28 23:16:20 +00001#include "precompiled.h"
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002//
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00003// Copyright (c) 2002-2012 The ANGLE Project Authors. All rights reserved.
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004// Use of this source code is governed by a BSD-style license that can be
5// found in the LICENSE file.
6//
7
8// libGLESv2.cpp: Implements the exported OpenGL ES 2.0 functions.
9
daniel@transgaming.coma0ce7e62011-01-25 14:47:16 +000010#include "common/version.h"
daniel@transgaming.combbf56f72010-04-20 18:52:13 +000011
12#include "libGLESv2/main.h"
daniel@transgaming.combbf56f72010-04-20 18:52:13 +000013#include "libGLESv2/utilities.h"
14#include "libGLESv2/Buffer.h"
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +000015#include "libGLESv2/Fence.h"
daniel@transgaming.combbf56f72010-04-20 18:52:13 +000016#include "libGLESv2/Framebuffer.h"
shannon.woods@transgaming.com486d9e92013-02-28 23:15:41 +000017#include "libGLESv2/Renderbuffer.h"
daniel@transgaming.combbf56f72010-04-20 18:52:13 +000018#include "libGLESv2/Program.h"
apatrick@chromium.orgea09f9b2012-06-08 00:45:32 +000019#include "libGLESv2/ProgramBinary.h"
daniel@transgaming.combbf56f72010-04-20 18:52:13 +000020#include "libGLESv2/Texture.h"
daniel@transgaming.com86bdb822012-01-20 18:24:39 +000021#include "libGLESv2/Query.h"
shannon.woods@transgaming.com486d9e92013-02-28 23:15:41 +000022#include "libGLESv2/Context.h"
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000023
daniel@transgaming.com4f9ef0d2011-05-30 23:51:19 +000024bool validImageSize(GLint level, GLsizei width, GLsizei height)
25{
26 if (level < 0 || width < 0 || height < 0)
27 {
28 return false;
29 }
30
31 if (gl::getContext() && gl::getContext()->supportsNonPower2Texture())
32 {
33 return true;
34 }
35
36 if (level == 0)
37 {
38 return true;
39 }
40
41 if (gl::isPow2(width) && gl::isPow2(height))
42 {
43 return true;
44 }
45
46 return false;
47}
48
daniel@transgaming.com8833dd22012-06-05 19:49:58 +000049// Verify that format/type are one of the combinations from table 3.4.
50bool checkTextureFormatType(GLenum format, GLenum type)
51{
52 // validate <format> by itself (used as secondary key below)
53 switch (format)
54 {
55 case GL_RGBA:
56 case GL_BGRA_EXT:
57 case GL_RGB:
58 case GL_ALPHA:
59 case GL_LUMINANCE:
60 case GL_LUMINANCE_ALPHA:
61 case GL_DEPTH_COMPONENT:
62 case GL_DEPTH_STENCIL_OES:
63 break;
64 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000065 return gl::error(GL_INVALID_ENUM, false);
daniel@transgaming.com8833dd22012-06-05 19:49:58 +000066 }
67
68 // invalid <type> -> sets INVALID_ENUM
69 // invalid <format>+<type> combination -> sets INVALID_OPERATION
70 switch (type)
71 {
72 case GL_UNSIGNED_BYTE:
73 switch (format)
74 {
75 case GL_RGBA:
76 case GL_BGRA_EXT:
77 case GL_RGB:
78 case GL_ALPHA:
79 case GL_LUMINANCE:
80 case GL_LUMINANCE_ALPHA:
81 return true;
82 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000083 return gl::error(GL_INVALID_OPERATION, false);
daniel@transgaming.com8833dd22012-06-05 19:49:58 +000084 }
85
86 case GL_FLOAT:
87 case GL_HALF_FLOAT_OES:
88 switch (format)
89 {
90 case GL_RGBA:
91 case GL_RGB:
92 case GL_ALPHA:
93 case GL_LUMINANCE:
94 case GL_LUMINANCE_ALPHA:
95 return true;
96 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000097 return gl::error(GL_INVALID_OPERATION, false);
daniel@transgaming.com8833dd22012-06-05 19:49:58 +000098 }
99
100 case GL_UNSIGNED_SHORT_4_4_4_4:
101 case GL_UNSIGNED_SHORT_5_5_5_1:
102 switch (format)
103 {
104 case GL_RGBA:
105 return true;
106 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000107 return gl::error(GL_INVALID_OPERATION, false);
daniel@transgaming.com8833dd22012-06-05 19:49:58 +0000108 }
109
110 case GL_UNSIGNED_SHORT_5_6_5:
111 switch (format)
112 {
113 case GL_RGB:
114 return true;
115 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000116 return gl::error(GL_INVALID_OPERATION, false);
daniel@transgaming.com8833dd22012-06-05 19:49:58 +0000117 }
118
119 case GL_UNSIGNED_SHORT:
120 case GL_UNSIGNED_INT:
121 switch (format)
122 {
123 case GL_DEPTH_COMPONENT:
124 return true;
125 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000126 return gl::error(GL_INVALID_OPERATION, false);
daniel@transgaming.com8833dd22012-06-05 19:49:58 +0000127 }
128
129 case GL_UNSIGNED_INT_24_8_OES:
130 switch (format)
131 {
132 case GL_DEPTH_STENCIL_OES:
133 return true;
134 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000135 return gl::error(GL_INVALID_OPERATION, false);
daniel@transgaming.com8833dd22012-06-05 19:49:58 +0000136 }
137
138 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000139 return gl::error(GL_INVALID_ENUM, false);
daniel@transgaming.com8833dd22012-06-05 19:49:58 +0000140 }
141}
daniel@transgaming.com6452adf2012-10-17 18:22:35 +0000142
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +0000143bool validateSubImageParams2D(bool compressed, GLsizei width, GLsizei height,
daniel@transgaming.com6452adf2012-10-17 18:22:35 +0000144 GLint xoffset, GLint yoffset, GLint level, GLenum format, GLenum type,
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +0000145 gl::Texture2D *texture)
daniel@transgaming.com343373a2011-11-29 19:42:32 +0000146{
147 if (!texture)
148 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000149 return gl::error(GL_INVALID_OPERATION, false);
daniel@transgaming.com343373a2011-11-29 19:42:32 +0000150 }
151
daniel@transgaming.com92f49922012-05-09 15:49:19 +0000152 if (compressed != texture->isCompressed(level))
daniel@transgaming.com343373a2011-11-29 19:42:32 +0000153 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000154 return gl::error(GL_INVALID_OPERATION, false);
daniel@transgaming.com343373a2011-11-29 19:42:32 +0000155 }
156
daniel@transgaming.com6452adf2012-10-17 18:22:35 +0000157 if (format != GL_NONE)
daniel@transgaming.com343373a2011-11-29 19:42:32 +0000158 {
daniel@transgaming.com6452adf2012-10-17 18:22:35 +0000159 GLenum internalformat = gl::ConvertSizedInternalFormat(format, type);
160 if (internalformat != texture->getInternalFormat(level))
161 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000162 return gl::error(GL_INVALID_OPERATION, false);
daniel@transgaming.com6452adf2012-10-17 18:22:35 +0000163 }
daniel@transgaming.com343373a2011-11-29 19:42:32 +0000164 }
165
166 if (compressed)
167 {
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +0000168 if ((width % 4 != 0 && width != texture->getWidth(0)) ||
169 (height % 4 != 0 && height != texture->getHeight(0)))
170 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000171 return gl::error(GL_INVALID_OPERATION, false);
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +0000172 }
173 }
174
175 if (xoffset + width > texture->getWidth(level) ||
176 yoffset + height > texture->getHeight(level))
177 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000178 return gl::error(GL_INVALID_VALUE, false);
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +0000179 }
180
181 return true;
182}
183
184bool validateSubImageParamsCube(bool compressed, GLsizei width, GLsizei height,
daniel@transgaming.com6452adf2012-10-17 18:22:35 +0000185 GLint xoffset, GLint yoffset, GLenum target, GLint level, GLenum format, GLenum type,
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +0000186 gl::TextureCubeMap *texture)
187{
188 if (!texture)
189 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000190 return gl::error(GL_INVALID_OPERATION, false);
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +0000191 }
192
daniel@transgaming.com4df88e82012-05-09 15:49:24 +0000193 if (compressed != texture->isCompressed(target, level))
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +0000194 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000195 return gl::error(GL_INVALID_OPERATION, false);
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +0000196 }
197
daniel@transgaming.com6452adf2012-10-17 18:22:35 +0000198 if (format != GL_NONE)
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +0000199 {
daniel@transgaming.com6452adf2012-10-17 18:22:35 +0000200 GLenum internalformat = gl::ConvertSizedInternalFormat(format, type);
201 if (internalformat != texture->getInternalFormat(target, level))
202 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000203 return gl::error(GL_INVALID_OPERATION, false);
daniel@transgaming.com6452adf2012-10-17 18:22:35 +0000204 }
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +0000205 }
206
207 if (compressed)
208 {
daniel@transgaming.com4df88e82012-05-09 15:49:24 +0000209 if ((width % 4 != 0 && width != texture->getWidth(target, 0)) ||
210 (height % 4 != 0 && height != texture->getHeight(target, 0)))
daniel@transgaming.com343373a2011-11-29 19:42:32 +0000211 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000212 return gl::error(GL_INVALID_OPERATION, false);
daniel@transgaming.com343373a2011-11-29 19:42:32 +0000213 }
214 }
215
daniel@transgaming.com4df88e82012-05-09 15:49:24 +0000216 if (xoffset + width > texture->getWidth(target, level) ||
217 yoffset + height > texture->getHeight(target, level))
daniel@transgaming.com343373a2011-11-29 19:42:32 +0000218 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000219 return gl::error(GL_INVALID_VALUE, false);
daniel@transgaming.com343373a2011-11-29 19:42:32 +0000220 }
221
222 return true;
223}
224
daniel@transgaming.comb7915a52011-11-12 03:14:20 +0000225// check for combinations of format and type that are valid for ReadPixels
226bool validReadFormatType(GLenum format, GLenum type)
227{
228 switch (format)
229 {
230 case GL_RGBA:
231 switch (type)
232 {
233 case GL_UNSIGNED_BYTE:
234 break;
235 default:
236 return false;
237 }
238 break;
239 case GL_BGRA_EXT:
240 switch (type)
241 {
242 case GL_UNSIGNED_BYTE:
243 case GL_UNSIGNED_SHORT_4_4_4_4_REV_EXT:
244 case GL_UNSIGNED_SHORT_1_5_5_5_REV_EXT:
245 break;
246 default:
247 return false;
248 }
249 break;
daniel@transgaming.comb7915a52011-11-12 03:14:20 +0000250 default:
251 return false;
252 }
253 return true;
254}
255
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000256extern "C"
257{
258
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +0000259// OpenGL ES 2.0 functions
260
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000261void __stdcall glActiveTexture(GLenum texture)
262{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000263 EVENT("(GLenum texture = 0x%X)", texture);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000264
265 try
266 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000267 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000268
269 if (context)
270 {
daniel@transgaming.com3f74c7a2011-05-11 15:36:51 +0000271 if (texture < GL_TEXTURE0 || texture > GL_TEXTURE0 + context->getMaximumCombinedTextureImageUnits() - 1)
272 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000273 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com3f74c7a2011-05-11 15:36:51 +0000274 }
275
daniel@transgaming.com428d1582010-05-04 03:35:25 +0000276 context->setActiveSampler(texture - GL_TEXTURE0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000277 }
278 }
279 catch(std::bad_alloc&)
280 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000281 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000282 }
283}
284
285void __stdcall glAttachShader(GLuint program, GLuint shader)
286{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000287 EVENT("(GLuint program = %d, GLuint shader = %d)", program, shader);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000288
289 try
290 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000291 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000292
293 if (context)
294 {
295 gl::Program *programObject = context->getProgram(program);
296 gl::Shader *shaderObject = context->getShader(shader);
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +0000297
daniel@transgaming.come9d6ed02010-04-13 03:26:23 +0000298 if (!programObject)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000299 {
daniel@transgaming.come9d6ed02010-04-13 03:26:23 +0000300 if (context->getShader(program))
301 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000302 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.come9d6ed02010-04-13 03:26:23 +0000303 }
304 else
305 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000306 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.come9d6ed02010-04-13 03:26:23 +0000307 }
308 }
309
310 if (!shaderObject)
311 {
312 if (context->getProgram(shader))
313 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000314 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.come9d6ed02010-04-13 03:26:23 +0000315 }
316 else
317 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000318 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.come9d6ed02010-04-13 03:26:23 +0000319 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000320 }
321
322 if (!programObject->attachShader(shaderObject))
323 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000324 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000325 }
326 }
327 }
328 catch(std::bad_alloc&)
329 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000330 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000331 }
332}
333
daniel@transgaming.com86bdb822012-01-20 18:24:39 +0000334void __stdcall glBeginQueryEXT(GLenum target, GLuint id)
335{
336 EVENT("(GLenum target = 0x%X, GLuint %d)", target, id);
337
338 try
339 {
340 switch (target)
341 {
342 case GL_ANY_SAMPLES_PASSED_EXT:
343 case GL_ANY_SAMPLES_PASSED_CONSERVATIVE_EXT:
344 break;
345 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000346 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +0000347 }
348
349 if (id == 0)
350 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000351 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +0000352 }
353
354 gl::Context *context = gl::getNonLostContext();
355
356 if (context)
357 {
358 context->beginQuery(target, id);
359 }
360 }
361 catch(std::bad_alloc&)
362 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000363 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +0000364 }
365}
366
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +0000367void __stdcall glBindAttribLocation(GLuint program, GLuint index, const GLchar* name)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000368{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000369 EVENT("(GLuint program = %d, GLuint index = %d, const GLchar* name = 0x%0.8p)", program, index, name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000370
371 try
372 {
373 if (index >= gl::MAX_VERTEX_ATTRIBS)
374 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000375 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000376 }
377
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000378 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000379
380 if (context)
381 {
382 gl::Program *programObject = context->getProgram(program);
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +0000383
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000384 if (!programObject)
385 {
daniel@transgaming.com98079832010-04-13 03:26:29 +0000386 if (context->getShader(program))
387 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000388 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com98079832010-04-13 03:26:29 +0000389 }
390 else
391 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000392 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com98079832010-04-13 03:26:29 +0000393 }
394 }
395
396 if (strncmp(name, "gl_", 3) == 0)
397 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000398 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000399 }
400
401 programObject->bindAttributeLocation(index, name);
402 }
403 }
404 catch(std::bad_alloc&)
405 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000406 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000407 }
408}
409
410void __stdcall glBindBuffer(GLenum target, GLuint buffer)
411{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000412 EVENT("(GLenum target = 0x%X, GLuint buffer = %d)", target, buffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000413
414 try
415 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000416 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000417
418 if (context)
419 {
420 switch (target)
421 {
422 case GL_ARRAY_BUFFER:
423 context->bindArrayBuffer(buffer);
424 return;
425 case GL_ELEMENT_ARRAY_BUFFER:
426 context->bindElementArrayBuffer(buffer);
427 return;
428 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000429 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000430 }
431 }
432 }
433 catch(std::bad_alloc&)
434 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000435 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000436 }
437}
438
439void __stdcall glBindFramebuffer(GLenum target, GLuint framebuffer)
440{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000441 EVENT("(GLenum target = 0x%X, GLuint framebuffer = %d)", target, framebuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000442
443 try
444 {
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +0000445 if (target != GL_FRAMEBUFFER && target != GL_DRAW_FRAMEBUFFER_ANGLE && target != GL_READ_FRAMEBUFFER_ANGLE)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000446 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000447 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000448 }
449
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000450 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000451
452 if (context)
453 {
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +0000454 if (target == GL_READ_FRAMEBUFFER_ANGLE || target == GL_FRAMEBUFFER)
455 {
456 context->bindReadFramebuffer(framebuffer);
457 }
458
459 if (target == GL_DRAW_FRAMEBUFFER_ANGLE || target == GL_FRAMEBUFFER)
460 {
461 context->bindDrawFramebuffer(framebuffer);
462 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000463 }
464 }
465 catch(std::bad_alloc&)
466 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000467 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000468 }
469}
470
471void __stdcall glBindRenderbuffer(GLenum target, GLuint renderbuffer)
472{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000473 EVENT("(GLenum target = 0x%X, GLuint renderbuffer = %d)", target, renderbuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000474
475 try
476 {
477 if (target != GL_RENDERBUFFER)
478 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000479 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000480 }
481
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000482 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000483
484 if (context)
485 {
486 context->bindRenderbuffer(renderbuffer);
487 }
488 }
489 catch(std::bad_alloc&)
490 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000491 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000492 }
493}
494
495void __stdcall glBindTexture(GLenum target, GLuint texture)
496{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000497 EVENT("(GLenum target = 0x%X, GLuint texture = %d)", target, texture);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000498
499 try
500 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000501 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000502
503 if (context)
504 {
505 gl::Texture *textureObject = context->getTexture(texture);
506
507 if (textureObject && textureObject->getTarget() != target && texture != 0)
508 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000509 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000510 }
511
512 switch (target)
513 {
514 case GL_TEXTURE_2D:
515 context->bindTexture2D(texture);
516 return;
517 case GL_TEXTURE_CUBE_MAP:
518 context->bindTextureCubeMap(texture);
519 return;
520 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000521 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000522 }
523 }
524 }
525 catch(std::bad_alloc&)
526 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000527 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000528 }
529}
530
531void __stdcall glBlendColor(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha)
532{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000533 EVENT("(GLclampf red = %f, GLclampf green = %f, GLclampf blue = %f, GLclampf alpha = %f)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +0000534 red, green, blue, alpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000535
536 try
537 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000538 gl::Context* context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000539
540 if (context)
541 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +0000542 context->setBlendColor(gl::clamp01(red), gl::clamp01(green), gl::clamp01(blue), gl::clamp01(alpha));
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000543 }
544 }
545 catch(std::bad_alloc&)
546 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000547 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000548 }
549}
550
551void __stdcall glBlendEquation(GLenum mode)
552{
553 glBlendEquationSeparate(mode, mode);
554}
555
556void __stdcall glBlendEquationSeparate(GLenum modeRGB, GLenum modeAlpha)
557{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000558 EVENT("(GLenum modeRGB = 0x%X, GLenum modeAlpha = 0x%X)", modeRGB, modeAlpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000559
560 try
561 {
shannon.woods%transgaming.com@gtempaccount.com00b6a0e2013-04-13 03:38:00 +0000562 gl::Context *context = gl::getNonLostContext();
563
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000564 switch (modeRGB)
565 {
566 case GL_FUNC_ADD:
567 case GL_FUNC_SUBTRACT:
568 case GL_FUNC_REVERSE_SUBTRACT:
569 break;
shannon.woods%transgaming.com@gtempaccount.com00b6a0e2013-04-13 03:38:00 +0000570
571 case GL_MIN:
572 case GL_MAX:
573 if (context && context->getClientVersion() < 3)
574 {
575 return gl::error(GL_INVALID_ENUM);
576 }
577 break;
578
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000579 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000580 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000581 }
582
583 switch (modeAlpha)
584 {
585 case GL_FUNC_ADD:
586 case GL_FUNC_SUBTRACT:
587 case GL_FUNC_REVERSE_SUBTRACT:
588 break;
shannon.woods%transgaming.com@gtempaccount.com00b6a0e2013-04-13 03:38:00 +0000589
590 case GL_MIN:
591 case GL_MAX:
592 if (context && context->getClientVersion() < 3)
593 {
594 return gl::error(GL_INVALID_ENUM);
595 }
596 break;
597
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000598 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000599 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000600 }
601
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000602 if (context)
603 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +0000604 context->setBlendEquation(modeRGB, modeAlpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000605 }
606 }
607 catch(std::bad_alloc&)
608 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000609 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000610 }
611}
612
613void __stdcall glBlendFunc(GLenum sfactor, GLenum dfactor)
614{
615 glBlendFuncSeparate(sfactor, dfactor, sfactor, dfactor);
616}
617
618void __stdcall glBlendFuncSeparate(GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha)
619{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000620 EVENT("(GLenum srcRGB = 0x%X, GLenum dstRGB = 0x%X, GLenum srcAlpha = 0x%X, GLenum dstAlpha = 0x%X)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +0000621 srcRGB, dstRGB, srcAlpha, dstAlpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000622
623 try
624 {
625 switch (srcRGB)
626 {
627 case GL_ZERO:
628 case GL_ONE:
629 case GL_SRC_COLOR:
630 case GL_ONE_MINUS_SRC_COLOR:
631 case GL_DST_COLOR:
632 case GL_ONE_MINUS_DST_COLOR:
633 case GL_SRC_ALPHA:
634 case GL_ONE_MINUS_SRC_ALPHA:
635 case GL_DST_ALPHA:
636 case GL_ONE_MINUS_DST_ALPHA:
637 case GL_CONSTANT_COLOR:
638 case GL_ONE_MINUS_CONSTANT_COLOR:
639 case GL_CONSTANT_ALPHA:
640 case GL_ONE_MINUS_CONSTANT_ALPHA:
641 case GL_SRC_ALPHA_SATURATE:
642 break;
643 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000644 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000645 }
646
647 switch (dstRGB)
648 {
649 case GL_ZERO:
650 case GL_ONE:
651 case GL_SRC_COLOR:
652 case GL_ONE_MINUS_SRC_COLOR:
653 case GL_DST_COLOR:
654 case GL_ONE_MINUS_DST_COLOR:
655 case GL_SRC_ALPHA:
656 case GL_ONE_MINUS_SRC_ALPHA:
657 case GL_DST_ALPHA:
658 case GL_ONE_MINUS_DST_ALPHA:
659 case GL_CONSTANT_COLOR:
660 case GL_ONE_MINUS_CONSTANT_COLOR:
661 case GL_CONSTANT_ALPHA:
662 case GL_ONE_MINUS_CONSTANT_ALPHA:
663 break;
664 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000665 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000666 }
667
668 switch (srcAlpha)
669 {
670 case GL_ZERO:
671 case GL_ONE:
672 case GL_SRC_COLOR:
673 case GL_ONE_MINUS_SRC_COLOR:
674 case GL_DST_COLOR:
675 case GL_ONE_MINUS_DST_COLOR:
676 case GL_SRC_ALPHA:
677 case GL_ONE_MINUS_SRC_ALPHA:
678 case GL_DST_ALPHA:
679 case GL_ONE_MINUS_DST_ALPHA:
680 case GL_CONSTANT_COLOR:
681 case GL_ONE_MINUS_CONSTANT_COLOR:
682 case GL_CONSTANT_ALPHA:
683 case GL_ONE_MINUS_CONSTANT_ALPHA:
684 case GL_SRC_ALPHA_SATURATE:
685 break;
686 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000687 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000688 }
689
690 switch (dstAlpha)
691 {
692 case GL_ZERO:
693 case GL_ONE:
694 case GL_SRC_COLOR:
695 case GL_ONE_MINUS_SRC_COLOR:
696 case GL_DST_COLOR:
697 case GL_ONE_MINUS_DST_COLOR:
698 case GL_SRC_ALPHA:
699 case GL_ONE_MINUS_SRC_ALPHA:
700 case GL_DST_ALPHA:
701 case GL_ONE_MINUS_DST_ALPHA:
702 case GL_CONSTANT_COLOR:
703 case GL_ONE_MINUS_CONSTANT_COLOR:
704 case GL_CONSTANT_ALPHA:
705 case GL_ONE_MINUS_CONSTANT_ALPHA:
706 break;
707 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000708 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000709 }
710
daniel@transgaming.comfe453652010-03-16 06:23:28 +0000711 bool constantColorUsed = (srcRGB == GL_CONSTANT_COLOR || srcRGB == GL_ONE_MINUS_CONSTANT_COLOR ||
712 dstRGB == GL_CONSTANT_COLOR || dstRGB == GL_ONE_MINUS_CONSTANT_COLOR);
713
714 bool constantAlphaUsed = (srcRGB == GL_CONSTANT_ALPHA || srcRGB == GL_ONE_MINUS_CONSTANT_ALPHA ||
715 dstRGB == GL_CONSTANT_ALPHA || dstRGB == GL_ONE_MINUS_CONSTANT_ALPHA);
716
717 if (constantColorUsed && constantAlphaUsed)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000718 {
daniel@transgaming.comfe453652010-03-16 06:23:28 +0000719 ERR("Simultaneous use of GL_CONSTANT_ALPHA/GL_ONE_MINUS_CONSTANT_ALPHA and GL_CONSTANT_COLOR/GL_ONE_MINUS_CONSTANT_COLOR invalid under WebGL");
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000720 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000721 }
722
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000723 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000724
725 if (context)
726 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +0000727 context->setBlendFactors(srcRGB, dstRGB, srcAlpha, dstAlpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000728 }
729 }
730 catch(std::bad_alloc&)
731 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000732 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000733 }
734}
735
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +0000736void __stdcall glBufferData(GLenum target, GLsizeiptr size, const GLvoid* data, GLenum usage)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000737{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000738 EVENT("(GLenum target = 0x%X, GLsizeiptr size = %d, const GLvoid* data = 0x%0.8p, GLenum usage = %d)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +0000739 target, size, data, usage);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000740
741 try
742 {
743 if (size < 0)
744 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000745 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000746 }
747
shannon.woods%transgaming.com@gtempaccount.comf2db40b2013-04-13 03:37:09 +0000748 gl::Context *context = gl::getNonLostContext();
749
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000750 switch (usage)
751 {
752 case GL_STREAM_DRAW:
753 case GL_STATIC_DRAW:
754 case GL_DYNAMIC_DRAW:
755 break;
shannon.woods%transgaming.com@gtempaccount.comf2db40b2013-04-13 03:37:09 +0000756
757 case GL_STREAM_READ:
758 case GL_STREAM_COPY:
759 case GL_STATIC_READ:
760 case GL_STATIC_COPY:
761 case GL_DYNAMIC_READ:
762 case GL_DYNAMIC_COPY:
763 if (context && context->getClientVersion() < 3)
764 {
765 return gl::error(GL_INVALID_ENUM);
766 }
767 break;
768
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000769 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000770 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000771 }
772
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000773 if (context)
774 {
775 gl::Buffer *buffer;
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +0000776
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000777 switch (target)
778 {
779 case GL_ARRAY_BUFFER:
780 buffer = context->getArrayBuffer();
781 break;
782 case GL_ELEMENT_ARRAY_BUFFER:
783 buffer = context->getElementArrayBuffer();
784 break;
785 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000786 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000787 }
788
789 if (!buffer)
790 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000791 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000792 }
793
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +0000794 buffer->bufferData(data, size, usage);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000795 }
796 }
797 catch(std::bad_alloc&)
798 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000799 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000800 }
801}
802
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +0000803void __stdcall glBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid* data)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000804{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000805 EVENT("(GLenum target = 0x%X, GLintptr offset = %d, GLsizeiptr size = %d, const GLvoid* data = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +0000806 target, offset, size, data);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000807
808 try
809 {
daniel@transgaming.comdefa1c32010-05-18 18:51:45 +0000810 if (size < 0 || offset < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000811 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000812 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000813 }
814
daniel@transgaming.comd4620a32010-03-21 04:31:28 +0000815 if (data == NULL)
816 {
817 return;
818 }
819
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000820 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +0000821
822 if (context)
823 {
824 gl::Buffer *buffer;
825
826 switch (target)
827 {
828 case GL_ARRAY_BUFFER:
829 buffer = context->getArrayBuffer();
830 break;
831 case GL_ELEMENT_ARRAY_BUFFER:
832 buffer = context->getElementArrayBuffer();
833 break;
834 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000835 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +0000836 }
837
838 if (!buffer)
839 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000840 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +0000841 }
842
daniel@transgaming.comdefa1c32010-05-18 18:51:45 +0000843 if ((size_t)size + offset > buffer->size())
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +0000844 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000845 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +0000846 }
daniel@transgaming.comdefa1c32010-05-18 18:51:45 +0000847
848 buffer->bufferSubData(data, size, offset);
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +0000849 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000850 }
851 catch(std::bad_alloc&)
852 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000853 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000854 }
855}
856
857GLenum __stdcall glCheckFramebufferStatus(GLenum target)
858{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000859 EVENT("(GLenum target = 0x%X)", target);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000860
861 try
862 {
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +0000863 if (target != GL_FRAMEBUFFER && target != GL_DRAW_FRAMEBUFFER_ANGLE && target != GL_READ_FRAMEBUFFER_ANGLE)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000864 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000865 return gl::error(GL_INVALID_ENUM, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000866 }
867
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000868 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000869
870 if (context)
871 {
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +0000872 gl::Framebuffer *framebuffer = NULL;
873 if (target == GL_READ_FRAMEBUFFER_ANGLE)
874 {
875 framebuffer = context->getReadFramebuffer();
876 }
877 else
878 {
879 framebuffer = context->getDrawFramebuffer();
880 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000881
882 return framebuffer->completeness();
883 }
884 }
885 catch(std::bad_alloc&)
886 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000887 return gl::error(GL_OUT_OF_MEMORY, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000888 }
889
890 return 0;
891}
892
893void __stdcall glClear(GLbitfield mask)
894{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +0000895 EVENT("(GLbitfield mask = 0x%X)", mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000896
897 try
898 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000899 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000900
901 if (context)
902 {
903 context->clear(mask);
904 }
905 }
906 catch(std::bad_alloc&)
907 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000908 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000909 }
910}
911
912void __stdcall glClearColor(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha)
913{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000914 EVENT("(GLclampf red = %f, GLclampf green = %f, GLclampf blue = %f, GLclampf alpha = %f)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +0000915 red, green, blue, alpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000916
917 try
918 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000919 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000920
921 if (context)
922 {
923 context->setClearColor(red, green, blue, alpha);
924 }
925 }
926 catch(std::bad_alloc&)
927 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000928 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000929 }
930}
931
932void __stdcall glClearDepthf(GLclampf depth)
933{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000934 EVENT("(GLclampf depth = %f)", depth);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000935
936 try
937 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000938 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000939
940 if (context)
941 {
942 context->setClearDepth(depth);
943 }
944 }
945 catch(std::bad_alloc&)
946 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000947 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000948 }
949}
950
951void __stdcall glClearStencil(GLint s)
952{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000953 EVENT("(GLint s = %d)", s);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000954
955 try
956 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000957 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000958
959 if (context)
960 {
961 context->setClearStencil(s);
962 }
963 }
964 catch(std::bad_alloc&)
965 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000966 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000967 }
968}
969
970void __stdcall glColorMask(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha)
971{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +0000972 EVENT("(GLboolean red = %d, GLboolean green = %u, GLboolean blue = %u, GLboolean alpha = %u)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +0000973 red, green, blue, alpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000974
975 try
976 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000977 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000978
979 if (context)
980 {
daniel@transgaming.coma36f98e2010-05-18 18:51:09 +0000981 context->setColorMask(red == GL_TRUE, green == GL_TRUE, blue == GL_TRUE, alpha == GL_TRUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000982 }
983 }
984 catch(std::bad_alloc&)
985 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000986 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000987 }
988}
989
990void __stdcall glCompileShader(GLuint shader)
991{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000992 EVENT("(GLuint shader = %d)", shader);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000993
994 try
995 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000996 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000997
998 if (context)
999 {
1000 gl::Shader *shaderObject = context->getShader(shader);
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00001001
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001002 if (!shaderObject)
1003 {
daniel@transgaming.com0cefaf42010-04-13 03:26:36 +00001004 if (context->getProgram(shader))
1005 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001006 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com0cefaf42010-04-13 03:26:36 +00001007 }
1008 else
1009 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001010 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com0cefaf42010-04-13 03:26:36 +00001011 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001012 }
1013
1014 shaderObject->compile();
1015 }
1016 }
1017 catch(std::bad_alloc&)
1018 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001019 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001020 }
1021}
1022
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00001023void __stdcall glCompressedTexImage2D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height,
1024 GLint border, GLsizei imageSize, const GLvoid* data)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001025{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001026 EVENT("(GLenum target = 0x%X, GLint level = %d, GLenum internalformat = 0x%X, GLsizei width = %d, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00001027 "GLsizei height = %d, GLint border = %d, GLsizei imageSize = %d, const GLvoid* data = 0x%0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001028 target, level, internalformat, width, height, border, imageSize, data);
1029
1030 try
1031 {
daniel@transgaming.com4f9ef0d2011-05-30 23:51:19 +00001032 if (!validImageSize(level, width, height) || border != 0 || imageSize < 0)
daniel@transgaming.com41430492010-03-11 20:36:18 +00001033 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001034 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com41430492010-03-11 20:36:18 +00001035 }
1036
daniel@transgaming.com01868132010-08-24 19:21:17 +00001037 switch (internalformat)
1038 {
1039 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
1040 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
gman@chromium.org50c526d2011-08-10 05:19:44 +00001041 case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
1042 case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
daniel@transgaming.com01868132010-08-24 19:21:17 +00001043 break;
1044 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001045 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com01868132010-08-24 19:21:17 +00001046 }
1047
1048 if (border != 0)
1049 {
shannon.woods@transgaming.com0efef902013-02-28 23:21:09 +00001050 return gl::error(GL_INVALID_OPERATION);
1051 }
1052
1053 if (width != 1 && width != 2 && width % 4 != 0)
1054 {
1055 return gl::error(GL_INVALID_OPERATION);
1056 }
1057
1058 if (height != 1 && height != 2 && height % 4 != 0)
1059 {
1060 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com01868132010-08-24 19:21:17 +00001061 }
1062
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001063 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com01868132010-08-24 19:21:17 +00001064
1065 if (context)
1066 {
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001067 if (level > context->getMaximumTextureLevel())
1068 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001069 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001070 }
1071
1072 switch (target)
1073 {
1074 case GL_TEXTURE_2D:
1075 if (width > (context->getMaximumTextureDimension() >> level) ||
1076 height > (context->getMaximumTextureDimension() >> level))
1077 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001078 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001079 }
1080 break;
1081 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
1082 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
1083 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
1084 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
1085 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
1086 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
1087 if (width != height)
1088 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001089 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001090 }
1091
1092 if (width > (context->getMaximumCubeTextureDimension() >> level) ||
1093 height > (context->getMaximumCubeTextureDimension() >> level))
1094 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001095 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001096 }
1097 break;
1098 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001099 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001100 }
1101
gman@chromium.org50c526d2011-08-10 05:19:44 +00001102 switch (internalformat) {
1103 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
1104 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
1105 if (!context->supportsDXT1Textures())
1106 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001107 return gl::error(GL_INVALID_ENUM); // in this case, it's as though the internal format switch failed
gman@chromium.org50c526d2011-08-10 05:19:44 +00001108 }
1109 break;
1110 case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
1111 if (!context->supportsDXT3Textures())
1112 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001113 return gl::error(GL_INVALID_ENUM); // in this case, it's as though the internal format switch failed
gman@chromium.org50c526d2011-08-10 05:19:44 +00001114 }
1115 break;
1116 case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
1117 if (!context->supportsDXT5Textures())
1118 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001119 return gl::error(GL_INVALID_ENUM); // in this case, it's as though the internal format switch failed
gman@chromium.org50c526d2011-08-10 05:19:44 +00001120 }
1121 break;
1122 default: UNREACHABLE();
daniel@transgaming.com01868132010-08-24 19:21:17 +00001123 }
1124
1125 if (imageSize != gl::ComputeCompressedSize(width, height, internalformat))
1126 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001127 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com01868132010-08-24 19:21:17 +00001128 }
1129
1130 if (target == GL_TEXTURE_2D)
1131 {
1132 gl::Texture2D *texture = context->getTexture2D();
1133
1134 if (!texture)
1135 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001136 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com01868132010-08-24 19:21:17 +00001137 }
1138
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00001139 if (texture->isImmutable())
1140 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001141 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00001142 }
1143
daniel@transgaming.com01868132010-08-24 19:21:17 +00001144 texture->setCompressedImage(level, internalformat, width, height, imageSize, data);
1145 }
1146 else
1147 {
1148 gl::TextureCubeMap *texture = context->getTextureCubeMap();
1149
1150 if (!texture)
1151 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001152 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com01868132010-08-24 19:21:17 +00001153 }
1154
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00001155 if (texture->isImmutable())
1156 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001157 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00001158 }
1159
daniel@transgaming.com01868132010-08-24 19:21:17 +00001160 switch (target)
1161 {
1162 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
1163 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
1164 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
1165 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
1166 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
1167 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
1168 texture->setCompressedImage(target, level, internalformat, width, height, imageSize, data);
1169 break;
1170 default: UNREACHABLE();
1171 }
1172 }
1173 }
1174
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001175 }
1176 catch(std::bad_alloc&)
1177 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001178 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001179 }
1180}
1181
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00001182void __stdcall glCompressedTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height,
1183 GLenum format, GLsizei imageSize, const GLvoid* data)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001184{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001185 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001186 "GLsizei width = %d, GLsizei height = %d, GLenum format = 0x%X, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00001187 "GLsizei imageSize = %d, const GLvoid* data = 0x%0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001188 target, level, xoffset, yoffset, width, height, format, imageSize, data);
1189
1190 try
1191 {
apatrick@chromium.org551022e2012-01-23 19:56:54 +00001192 if (!gl::IsInternalTextureTarget(target))
daniel@transgaming.com41430492010-03-11 20:36:18 +00001193 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001194 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com41430492010-03-11 20:36:18 +00001195 }
1196
daniel@transgaming.com4f9ef0d2011-05-30 23:51:19 +00001197 if (xoffset < 0 || yoffset < 0 || !validImageSize(level, width, height) || imageSize < 0)
daniel@transgaming.com41430492010-03-11 20:36:18 +00001198 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001199 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com41430492010-03-11 20:36:18 +00001200 }
1201
daniel@transgaming.com01868132010-08-24 19:21:17 +00001202 switch (format)
daniel@transgaming.com41430492010-03-11 20:36:18 +00001203 {
daniel@transgaming.com01868132010-08-24 19:21:17 +00001204 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
1205 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
gman@chromium.org50c526d2011-08-10 05:19:44 +00001206 case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
1207 case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
daniel@transgaming.com01868132010-08-24 19:21:17 +00001208 break;
1209 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001210 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com41430492010-03-11 20:36:18 +00001211 }
1212
daniel@transgaming.com01868132010-08-24 19:21:17 +00001213 if (width == 0 || height == 0 || data == NULL)
1214 {
1215 return;
1216 }
1217
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001218 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com01868132010-08-24 19:21:17 +00001219
1220 if (context)
1221 {
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001222 if (level > context->getMaximumTextureLevel())
1223 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001224 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001225 }
1226
gman@chromium.org50c526d2011-08-10 05:19:44 +00001227 switch (format) {
1228 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
1229 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
1230 if (!context->supportsDXT1Textures())
1231 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001232 return gl::error(GL_INVALID_ENUM); // in this case, it's as though the internal format switch failed
gman@chromium.org50c526d2011-08-10 05:19:44 +00001233 }
1234 break;
1235 case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
1236 if (!context->supportsDXT3Textures())
1237 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001238 return gl::error(GL_INVALID_ENUM); // in this case, it's as though the internal format switch failed
gman@chromium.org50c526d2011-08-10 05:19:44 +00001239 }
1240 break;
1241 case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
1242 if (!context->supportsDXT5Textures())
1243 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001244 return gl::error(GL_INVALID_ENUM); // in this case, it's as though the internal format switch failed
gman@chromium.org50c526d2011-08-10 05:19:44 +00001245 }
1246 break;
1247 default: UNREACHABLE();
daniel@transgaming.com01868132010-08-24 19:21:17 +00001248 }
1249
1250 if (imageSize != gl::ComputeCompressedSize(width, height, format))
1251 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001252 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com01868132010-08-24 19:21:17 +00001253 }
1254
1255 if (xoffset % 4 != 0 || yoffset % 4 != 0)
1256 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001257 return gl::error(GL_INVALID_OPERATION); // we wait to check the offsets until this point, because the multiple-of-four restriction
gman@chromium.org50c526d2011-08-10 05:19:44 +00001258 // does not exist unless DXT textures are supported.
daniel@transgaming.com01868132010-08-24 19:21:17 +00001259 }
1260
1261 if (target == GL_TEXTURE_2D)
1262 {
1263 gl::Texture2D *texture = context->getTexture2D();
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00001264 if (validateSubImageParams2D(true, width, height, xoffset, yoffset, level, format, GL_NONE, texture))
daniel@transgaming.com01868132010-08-24 19:21:17 +00001265 {
daniel@transgaming.com343373a2011-11-29 19:42:32 +00001266 texture->subImageCompressed(level, xoffset, yoffset, width, height, format, imageSize, data);
daniel@transgaming.com01868132010-08-24 19:21:17 +00001267 }
daniel@transgaming.com01868132010-08-24 19:21:17 +00001268 }
1269 else if (gl::IsCubemapTextureTarget(target))
1270 {
1271 gl::TextureCubeMap *texture = context->getTextureCubeMap();
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00001272 if (validateSubImageParamsCube(true, width, height, xoffset, yoffset, target, level, format, GL_NONE, texture))
daniel@transgaming.com01868132010-08-24 19:21:17 +00001273 {
daniel@transgaming.com343373a2011-11-29 19:42:32 +00001274 texture->subImageCompressed(target, level, xoffset, yoffset, width, height, format, imageSize, data);
daniel@transgaming.com01868132010-08-24 19:21:17 +00001275 }
daniel@transgaming.com01868132010-08-24 19:21:17 +00001276 }
1277 else
1278 {
1279 UNREACHABLE();
1280 }
1281 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001282 }
1283 catch(std::bad_alloc&)
1284 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001285 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001286 }
1287}
1288
1289void __stdcall glCopyTexImage2D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border)
1290{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001291 EVENT("(GLenum target = 0x%X, GLint level = %d, GLenum internalformat = 0x%X, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001292 "GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d, GLint border = %d)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001293 target, level, internalformat, x, y, width, height, border);
1294
1295 try
1296 {
daniel@transgaming.com4f9ef0d2011-05-30 23:51:19 +00001297 if (!validImageSize(level, width, height))
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001298 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001299 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001300 }
1301
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001302 if (border != 0)
1303 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001304 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001305 }
1306
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001307 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001308
1309 if (context)
1310 {
daniel@transgaming.com32b11442011-11-19 02:42:48 +00001311 if (level > context->getMaximumTextureLevel())
1312 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001313 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com32b11442011-11-19 02:42:48 +00001314 }
1315
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001316 switch (target)
1317 {
1318 case GL_TEXTURE_2D:
1319 if (width > (context->getMaximumTextureDimension() >> level) ||
1320 height > (context->getMaximumTextureDimension() >> level))
1321 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001322 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001323 }
1324 break;
1325 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
1326 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
1327 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
1328 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
1329 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
1330 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
1331 if (width != height)
1332 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001333 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001334 }
1335
1336 if (width > (context->getMaximumCubeTextureDimension() >> level) ||
1337 height > (context->getMaximumCubeTextureDimension() >> level))
1338 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001339 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001340 }
1341 break;
1342 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001343 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001344 }
1345
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00001346 gl::Framebuffer *framebuffer = context->getReadFramebuffer();
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001347
daniel@transgaming.combbc57792010-07-28 19:21:05 +00001348 if (framebuffer->completeness() != GL_FRAMEBUFFER_COMPLETE)
1349 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001350 return gl::error(GL_INVALID_FRAMEBUFFER_OPERATION);
daniel@transgaming.combbc57792010-07-28 19:21:05 +00001351 }
1352
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00001353 if (context->getReadFramebufferHandle() != 0 && framebuffer->getSamples() != 0)
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00001354 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001355 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00001356 }
1357
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00001358 gl::Renderbuffer *source = framebuffer->getReadColorbuffer();
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +00001359 GLenum colorbufferFormat = source->getInternalFormat();
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001360
1361 // [OpenGL ES 2.0.24] table 3.9
1362 switch (internalformat)
1363 {
1364 case GL_ALPHA:
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00001365 if (colorbufferFormat != GL_ALPHA8_EXT &&
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001366 colorbufferFormat != GL_RGBA4 &&
1367 colorbufferFormat != GL_RGB5_A1 &&
shannon.woods@transgaming.com28e7ba02013-02-28 23:09:28 +00001368 colorbufferFormat != GL_BGRA8_EXT &&
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001369 colorbufferFormat != GL_RGBA8_OES)
1370 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001371 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001372 }
1373 break;
1374 case GL_LUMINANCE:
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00001375 case GL_RGB:
1376 if (colorbufferFormat != GL_RGB565 &&
1377 colorbufferFormat != GL_RGB8_OES &&
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001378 colorbufferFormat != GL_RGBA4 &&
1379 colorbufferFormat != GL_RGB5_A1 &&
shannon.woods@transgaming.com28e7ba02013-02-28 23:09:28 +00001380 colorbufferFormat != GL_BGRA8_EXT &&
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001381 colorbufferFormat != GL_RGBA8_OES)
1382 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001383 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001384 }
1385 break;
1386 case GL_LUMINANCE_ALPHA:
1387 case GL_RGBA:
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00001388 if (colorbufferFormat != GL_RGBA4 &&
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001389 colorbufferFormat != GL_RGB5_A1 &&
shannon.woods@transgaming.com28e7ba02013-02-28 23:09:28 +00001390 colorbufferFormat != GL_BGRA8_EXT &&
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001391 colorbufferFormat != GL_RGBA8_OES)
1392 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001393 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001394 }
1395 break;
1396 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
1397 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
gman@chromium.org50c526d2011-08-10 05:19:44 +00001398 if (context->supportsDXT1Textures())
1399 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001400 return gl::error(GL_INVALID_OPERATION);
gman@chromium.org50c526d2011-08-10 05:19:44 +00001401 }
1402 else
1403 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001404 return gl::error(GL_INVALID_ENUM);
gman@chromium.org50c526d2011-08-10 05:19:44 +00001405 }
1406 break;
1407 case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
1408 if (context->supportsDXT3Textures())
1409 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001410 return gl::error(GL_INVALID_OPERATION);
gman@chromium.org50c526d2011-08-10 05:19:44 +00001411 }
1412 else
1413 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001414 return gl::error(GL_INVALID_ENUM);
gman@chromium.org50c526d2011-08-10 05:19:44 +00001415 }
1416 break;
1417 case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
1418 if (context->supportsDXT5Textures())
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001419 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001420 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001421 }
1422 else
1423 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001424 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001425 }
1426 break;
daniel@transgaming.com0c854682012-05-31 01:14:11 +00001427 case GL_DEPTH_COMPONENT:
1428 case GL_DEPTH_COMPONENT16:
1429 case GL_DEPTH_COMPONENT32_OES:
1430 case GL_DEPTH_STENCIL_OES:
1431 case GL_DEPTH24_STENCIL8_OES:
1432 if (context->supportsDepthTextures())
1433 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001434 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com0c854682012-05-31 01:14:11 +00001435 }
1436 else
1437 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001438 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com0c854682012-05-31 01:14:11 +00001439 }
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001440 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001441 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001442 }
1443
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001444 if (target == GL_TEXTURE_2D)
1445 {
1446 gl::Texture2D *texture = context->getTexture2D();
1447
1448 if (!texture)
1449 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001450 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001451 }
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00001452
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00001453 if (texture->isImmutable())
1454 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001455 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00001456 }
1457
apatrick@chromium.orgb31f5322011-01-19 19:02:52 +00001458 texture->copyImage(level, internalformat, x, y, width, height, framebuffer);
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001459 }
daniel@transgaming.com19ffc242010-05-04 03:35:21 +00001460 else if (gl::IsCubemapTextureTarget(target))
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001461 {
1462 gl::TextureCubeMap *texture = context->getTextureCubeMap();
1463
1464 if (!texture)
1465 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001466 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001467 }
1468
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00001469 if (texture->isImmutable())
1470 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001471 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00001472 }
1473
apatrick@chromium.orgb31f5322011-01-19 19:02:52 +00001474 texture->copyImage(target, level, internalformat, x, y, width, height, framebuffer);
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001475 }
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001476 else UNREACHABLE();
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001477 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001478 }
1479 catch(std::bad_alloc&)
1480 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001481 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001482 }
1483}
1484
1485void __stdcall glCopyTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height)
1486{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001487 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001488 "GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001489 target, level, xoffset, yoffset, x, y, width, height);
1490
1491 try
1492 {
apatrick@chromium.org551022e2012-01-23 19:56:54 +00001493 if (!gl::IsInternalTextureTarget(target))
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001494 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001495 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001496 }
1497
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001498 if (level < 0 || xoffset < 0 || yoffset < 0 || width < 0 || height < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001499 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001500 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001501 }
1502
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001503 if (std::numeric_limits<GLsizei>::max() - xoffset < width || std::numeric_limits<GLsizei>::max() - yoffset < height)
1504 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001505 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001506 }
1507
1508 if (width == 0 || height == 0)
1509 {
1510 return;
1511 }
1512
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001513 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001514
1515 if (context)
1516 {
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001517 if (level > context->getMaximumTextureLevel())
1518 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001519 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001520 }
1521
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00001522 gl::Framebuffer *framebuffer = context->getReadFramebuffer();
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001523
daniel@transgaming.combbc57792010-07-28 19:21:05 +00001524 if (framebuffer->completeness() != GL_FRAMEBUFFER_COMPLETE)
1525 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001526 return gl::error(GL_INVALID_FRAMEBUFFER_OPERATION);
daniel@transgaming.combbc57792010-07-28 19:21:05 +00001527 }
1528
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00001529 if (context->getReadFramebufferHandle() != 0 && framebuffer->getSamples() != 0)
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00001530 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001531 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00001532 }
1533
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00001534 gl::Renderbuffer *source = framebuffer->getReadColorbuffer();
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +00001535 GLenum colorbufferFormat = source->getInternalFormat();
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001536 gl::Texture *texture = NULL;
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +00001537 GLenum textureFormat = GL_RGBA;
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001538
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001539 if (target == GL_TEXTURE_2D)
1540 {
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +00001541 gl::Texture2D *tex2d = context->getTexture2D();
1542
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00001543 if (!validateSubImageParams2D(false, width, height, xoffset, yoffset, level, GL_NONE, GL_NONE, tex2d))
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +00001544 {
1545 return; // error already registered by validateSubImageParams
1546 }
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00001547 textureFormat = gl::ExtractFormat(tex2d->getInternalFormat(level));
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +00001548 texture = tex2d;
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001549 }
daniel@transgaming.com19ffc242010-05-04 03:35:21 +00001550 else if (gl::IsCubemapTextureTarget(target))
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001551 {
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +00001552 gl::TextureCubeMap *texcube = context->getTextureCubeMap();
1553
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00001554 if (!validateSubImageParamsCube(false, width, height, xoffset, yoffset, target, level, GL_NONE, GL_NONE, texcube))
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +00001555 {
1556 return; // error already registered by validateSubImageParams
1557 }
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00001558 textureFormat = gl::ExtractFormat(texcube->getInternalFormat(target, level));
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +00001559 texture = texcube;
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001560 }
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001561 else UNREACHABLE();
1562
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001563 // [OpenGL ES 2.0.24] table 3.9
1564 switch (textureFormat)
1565 {
1566 case GL_ALPHA:
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00001567 if (colorbufferFormat != GL_ALPHA8_EXT &&
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001568 colorbufferFormat != GL_RGBA4 &&
1569 colorbufferFormat != GL_RGB5_A1 &&
1570 colorbufferFormat != GL_RGBA8_OES)
1571 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001572 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001573 }
1574 break;
1575 case GL_LUMINANCE:
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00001576 case GL_RGB:
1577 if (colorbufferFormat != GL_RGB565 &&
1578 colorbufferFormat != GL_RGB8_OES &&
1579 colorbufferFormat != GL_RGBA4 &&
1580 colorbufferFormat != GL_RGB5_A1 &&
1581 colorbufferFormat != GL_RGBA8_OES)
1582 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001583 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00001584 }
1585 break;
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001586 case GL_LUMINANCE_ALPHA:
1587 case GL_RGBA:
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00001588 if (colorbufferFormat != GL_RGBA4 &&
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001589 colorbufferFormat != GL_RGB5_A1 &&
1590 colorbufferFormat != GL_RGBA8_OES)
1591 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001592 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001593 }
1594 break;
1595 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
1596 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
gman@chromium.org50c526d2011-08-10 05:19:44 +00001597 case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
1598 case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001599 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com0c854682012-05-31 01:14:11 +00001600 case GL_DEPTH_COMPONENT:
1601 case GL_DEPTH_STENCIL_OES:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001602 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001603 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001604 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001605 }
1606
apatrick@chromium.orgb31f5322011-01-19 19:02:52 +00001607 texture->copySubImage(target, level, xoffset, yoffset, x, y, width, height, framebuffer);
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001608 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001609 }
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001610
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001611 catch(std::bad_alloc&)
1612 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001613 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001614 }
1615}
1616
1617GLuint __stdcall glCreateProgram(void)
1618{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001619 EVENT("()");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001620
1621 try
1622 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001623 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001624
1625 if (context)
1626 {
1627 return context->createProgram();
1628 }
1629 }
1630 catch(std::bad_alloc&)
1631 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001632 return gl::error(GL_OUT_OF_MEMORY, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001633 }
1634
1635 return 0;
1636}
1637
1638GLuint __stdcall glCreateShader(GLenum type)
1639{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001640 EVENT("(GLenum type = 0x%X)", type);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001641
1642 try
1643 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001644 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001645
1646 if (context)
1647 {
1648 switch (type)
1649 {
1650 case GL_FRAGMENT_SHADER:
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00001651 case GL_VERTEX_SHADER:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001652 return context->createShader(type);
1653 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001654 return gl::error(GL_INVALID_ENUM, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001655 }
1656 }
1657 }
1658 catch(std::bad_alloc&)
1659 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001660 return gl::error(GL_OUT_OF_MEMORY, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001661 }
1662
1663 return 0;
1664}
1665
1666void __stdcall glCullFace(GLenum mode)
1667{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001668 EVENT("(GLenum mode = 0x%X)", mode);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001669
1670 try
1671 {
1672 switch (mode)
1673 {
1674 case GL_FRONT:
1675 case GL_BACK:
1676 case GL_FRONT_AND_BACK:
1677 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001678 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001679
1680 if (context)
1681 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00001682 context->setCullMode(mode);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001683 }
1684 }
1685 break;
1686 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001687 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001688 }
1689 }
1690 catch(std::bad_alloc&)
1691 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001692 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001693 }
1694}
1695
1696void __stdcall glDeleteBuffers(GLsizei n, const GLuint* buffers)
1697{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001698 EVENT("(GLsizei n = %d, const GLuint* buffers = 0x%0.8p)", n, buffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001699
1700 try
1701 {
1702 if (n < 0)
1703 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001704 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001705 }
1706
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001707 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001708
1709 if (context)
1710 {
1711 for (int i = 0; i < n; i++)
1712 {
1713 context->deleteBuffer(buffers[i]);
1714 }
1715 }
1716 }
1717 catch(std::bad_alloc&)
1718 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001719 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001720 }
1721}
1722
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001723void __stdcall glDeleteFencesNV(GLsizei n, const GLuint* fences)
1724{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001725 EVENT("(GLsizei n = %d, const GLuint* fences = 0x%0.8p)", n, fences);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001726
1727 try
1728 {
1729 if (n < 0)
1730 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001731 return gl::error(GL_INVALID_VALUE);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001732 }
1733
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001734 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001735
1736 if (context)
1737 {
1738 for (int i = 0; i < n; i++)
1739 {
1740 context->deleteFence(fences[i]);
1741 }
1742 }
1743 }
1744 catch(std::bad_alloc&)
1745 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001746 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001747 }
1748}
1749
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001750void __stdcall glDeleteFramebuffers(GLsizei n, const GLuint* framebuffers)
1751{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001752 EVENT("(GLsizei n = %d, const GLuint* framebuffers = 0x%0.8p)", n, framebuffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001753
1754 try
1755 {
1756 if (n < 0)
1757 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001758 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001759 }
1760
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001761 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001762
1763 if (context)
1764 {
1765 for (int i = 0; i < n; i++)
1766 {
1767 if (framebuffers[i] != 0)
1768 {
1769 context->deleteFramebuffer(framebuffers[i]);
1770 }
1771 }
1772 }
1773 }
1774 catch(std::bad_alloc&)
1775 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001776 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001777 }
1778}
1779
1780void __stdcall glDeleteProgram(GLuint program)
1781{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001782 EVENT("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001783
1784 try
1785 {
daniel@transgaming.com75401e62010-04-13 03:26:39 +00001786 if (program == 0)
1787 {
1788 return;
1789 }
1790
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001791 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001792
1793 if (context)
1794 {
daniel@transgaming.com75401e62010-04-13 03:26:39 +00001795 if (!context->getProgram(program))
1796 {
1797 if(context->getShader(program))
1798 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001799 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com75401e62010-04-13 03:26:39 +00001800 }
1801 else
1802 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001803 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com75401e62010-04-13 03:26:39 +00001804 }
1805 }
1806
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001807 context->deleteProgram(program);
1808 }
1809 }
1810 catch(std::bad_alloc&)
1811 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001812 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001813 }
1814}
1815
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00001816void __stdcall glDeleteQueriesEXT(GLsizei n, const GLuint *ids)
1817{
1818 EVENT("(GLsizei n = %d, const GLuint *ids = 0x%0.8p)", n, ids);
1819
1820 try
1821 {
1822 if (n < 0)
1823 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001824 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00001825 }
1826
1827 gl::Context *context = gl::getNonLostContext();
1828
1829 if (context)
1830 {
1831 for (int i = 0; i < n; i++)
1832 {
1833 context->deleteQuery(ids[i]);
1834 }
1835 }
1836 }
1837 catch(std::bad_alloc&)
1838 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001839 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00001840 }
1841}
1842
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001843void __stdcall glDeleteRenderbuffers(GLsizei n, const GLuint* renderbuffers)
1844{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001845 EVENT("(GLsizei n = %d, const GLuint* renderbuffers = 0x%0.8p)", n, renderbuffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001846
1847 try
1848 {
1849 if (n < 0)
1850 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001851 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001852 }
1853
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001854 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001855
1856 if (context)
1857 {
daniel@transgaming.come2b22122010-03-11 19:22:14 +00001858 for (int i = 0; i < n; i++)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001859 {
1860 context->deleteRenderbuffer(renderbuffers[i]);
1861 }
1862 }
1863 }
1864 catch(std::bad_alloc&)
1865 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001866 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001867 }
1868}
1869
1870void __stdcall glDeleteShader(GLuint shader)
1871{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001872 EVENT("(GLuint shader = %d)", shader);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001873
1874 try
1875 {
daniel@transgaming.com75401e62010-04-13 03:26:39 +00001876 if (shader == 0)
1877 {
1878 return;
1879 }
1880
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001881 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001882
1883 if (context)
1884 {
daniel@transgaming.com75401e62010-04-13 03:26:39 +00001885 if (!context->getShader(shader))
1886 {
1887 if(context->getProgram(shader))
1888 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001889 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com75401e62010-04-13 03:26:39 +00001890 }
1891 else
1892 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001893 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com75401e62010-04-13 03:26:39 +00001894 }
1895 }
1896
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001897 context->deleteShader(shader);
1898 }
1899 }
1900 catch(std::bad_alloc&)
1901 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001902 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001903 }
1904}
1905
1906void __stdcall glDeleteTextures(GLsizei n, const GLuint* textures)
1907{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001908 EVENT("(GLsizei n = %d, const GLuint* textures = 0x%0.8p)", n, textures);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001909
1910 try
1911 {
1912 if (n < 0)
1913 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001914 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001915 }
1916
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001917 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001918
1919 if (context)
1920 {
1921 for (int i = 0; i < n; i++)
1922 {
1923 if (textures[i] != 0)
1924 {
1925 context->deleteTexture(textures[i]);
1926 }
1927 }
1928 }
1929 }
1930 catch(std::bad_alloc&)
1931 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001932 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001933 }
1934}
1935
1936void __stdcall glDepthFunc(GLenum func)
1937{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001938 EVENT("(GLenum func = 0x%X)", func);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001939
1940 try
1941 {
1942 switch (func)
1943 {
1944 case GL_NEVER:
1945 case GL_ALWAYS:
1946 case GL_LESS:
1947 case GL_LEQUAL:
1948 case GL_EQUAL:
1949 case GL_GREATER:
1950 case GL_GEQUAL:
1951 case GL_NOTEQUAL:
1952 break;
1953 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001954 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001955 }
1956
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001957 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001958
1959 if (context)
1960 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00001961 context->setDepthFunc(func);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001962 }
1963 }
1964 catch(std::bad_alloc&)
1965 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001966 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001967 }
1968}
1969
1970void __stdcall glDepthMask(GLboolean flag)
1971{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00001972 EVENT("(GLboolean flag = %u)", flag);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001973
1974 try
1975 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001976 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001977
1978 if (context)
1979 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00001980 context->setDepthMask(flag != GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001981 }
1982 }
1983 catch(std::bad_alloc&)
1984 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001985 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001986 }
1987}
1988
1989void __stdcall glDepthRangef(GLclampf zNear, GLclampf zFar)
1990{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001991 EVENT("(GLclampf zNear = %f, GLclampf zFar = %f)", zNear, zFar);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001992
1993 try
1994 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001995 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001996
1997 if (context)
1998 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00001999 context->setDepthRange(zNear, zFar);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002000 }
2001 }
2002 catch(std::bad_alloc&)
2003 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002004 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002005 }
2006}
2007
2008void __stdcall glDetachShader(GLuint program, GLuint shader)
2009{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002010 EVENT("(GLuint program = %d, GLuint shader = %d)", program, shader);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002011
2012 try
2013 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002014 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002015
2016 if (context)
2017 {
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00002018
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002019 gl::Program *programObject = context->getProgram(program);
2020 gl::Shader *shaderObject = context->getShader(shader);
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00002021
2022 if (!programObject)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002023 {
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00002024 gl::Shader *shaderByProgramHandle;
2025 shaderByProgramHandle = context->getShader(program);
2026 if (!shaderByProgramHandle)
2027 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002028 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00002029 }
2030 else
2031 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002032 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00002033 }
2034 }
2035
2036 if (!shaderObject)
2037 {
2038 gl::Program *programByShaderHandle = context->getProgram(shader);
2039 if (!programByShaderHandle)
2040 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002041 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00002042 }
2043 else
2044 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002045 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00002046 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002047 }
2048
2049 if (!programObject->detachShader(shaderObject))
2050 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002051 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002052 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002053 }
2054 }
2055 catch(std::bad_alloc&)
2056 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002057 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002058 }
2059}
2060
2061void __stdcall glDisable(GLenum cap)
2062{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002063 EVENT("(GLenum cap = 0x%X)", cap);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002064
2065 try
2066 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002067 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002068
2069 if (context)
2070 {
2071 switch (cap)
2072 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00002073 case GL_CULL_FACE: context->setCullFace(false); break;
2074 case GL_POLYGON_OFFSET_FILL: context->setPolygonOffsetFill(false); break;
2075 case GL_SAMPLE_ALPHA_TO_COVERAGE: context->setSampleAlphaToCoverage(false); break;
2076 case GL_SAMPLE_COVERAGE: context->setSampleCoverage(false); break;
2077 case GL_SCISSOR_TEST: context->setScissorTest(false); break;
2078 case GL_STENCIL_TEST: context->setStencilTest(false); break;
2079 case GL_DEPTH_TEST: context->setDepthTest(false); break;
2080 case GL_BLEND: context->setBlend(false); break;
2081 case GL_DITHER: context->setDither(false); break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002082 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002083 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002084 }
2085 }
2086 }
2087 catch(std::bad_alloc&)
2088 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002089 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002090 }
2091}
2092
2093void __stdcall glDisableVertexAttribArray(GLuint index)
2094{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002095 EVENT("(GLuint index = %d)", index);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002096
2097 try
2098 {
2099 if (index >= gl::MAX_VERTEX_ATTRIBS)
2100 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002101 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002102 }
2103
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002104 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002105
2106 if (context)
2107 {
daniel@transgaming.com83921382011-01-08 05:46:00 +00002108 context->setEnableVertexAttribArray(index, false);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002109 }
2110 }
2111 catch(std::bad_alloc&)
2112 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002113 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002114 }
2115}
2116
2117void __stdcall glDrawArrays(GLenum mode, GLint first, GLsizei count)
2118{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002119 EVENT("(GLenum mode = 0x%X, GLint first = %d, GLsizei count = %d)", mode, first, count);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002120
2121 try
2122 {
2123 if (count < 0 || first < 0)
2124 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002125 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002126 }
2127
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002128 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002129
2130 if (context)
2131 {
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00002132 context->drawArrays(mode, first, count, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002133 }
2134 }
2135 catch(std::bad_alloc&)
2136 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002137 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002138 }
2139}
2140
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002141void __stdcall glDrawArraysInstancedANGLE(GLenum mode, GLint first, GLsizei count, GLsizei primcount)
2142{
2143 EVENT("(GLenum mode = 0x%X, GLint first = %d, GLsizei count = %d, GLsizei primcount = %d)", mode, first, count, primcount);
2144
2145 try
2146 {
2147 if (count < 0 || first < 0 || primcount < 0)
2148 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002149 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002150 }
2151
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00002152 if (primcount > 0)
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002153 {
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00002154 gl::Context *context = gl::getNonLostContext();
2155
2156 if (context)
2157 {
2158 context->drawArrays(mode, first, count, primcount);
2159 }
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002160 }
2161 }
2162 catch(std::bad_alloc&)
2163 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002164 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002165 }
2166}
2167
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00002168void __stdcall glDrawElements(GLenum mode, GLsizei count, GLenum type, const GLvoid* indices)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002169{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002170 EVENT("(GLenum mode = 0x%X, GLsizei count = %d, GLenum type = 0x%X, const GLvoid* indices = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00002171 mode, count, type, indices);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002172
2173 try
2174 {
2175 if (count < 0)
2176 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002177 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002178 }
2179
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002180 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002181
2182 if (context)
2183 {
daniel@transgaming.com83921382011-01-08 05:46:00 +00002184 switch (type)
2185 {
2186 case GL_UNSIGNED_BYTE:
2187 case GL_UNSIGNED_SHORT:
2188 break;
2189 case GL_UNSIGNED_INT:
2190 if (!context->supports32bitIndices())
2191 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002192 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com83921382011-01-08 05:46:00 +00002193 }
2194 break;
2195 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002196 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com83921382011-01-08 05:46:00 +00002197 }
2198
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00002199 context->drawElements(mode, count, type, indices, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002200 }
2201 }
2202 catch(std::bad_alloc&)
2203 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002204 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002205 }
2206}
2207
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002208void __stdcall glDrawElementsInstancedANGLE(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLsizei primcount)
2209{
2210 EVENT("(GLenum mode = 0x%X, GLsizei count = %d, GLenum type = 0x%X, const GLvoid* indices = 0x%0.8p, GLsizei primcount = %d)",
2211 mode, count, type, indices, primcount);
2212
2213 try
2214 {
2215 if (count < 0 || primcount < 0)
2216 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002217 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002218 }
2219
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00002220 if (primcount > 0)
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002221 {
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00002222 gl::Context *context = gl::getNonLostContext();
2223
2224 if (context)
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002225 {
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00002226 switch (type)
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002227 {
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00002228 case GL_UNSIGNED_BYTE:
2229 case GL_UNSIGNED_SHORT:
2230 break;
2231 case GL_UNSIGNED_INT:
2232 if (!context->supports32bitIndices())
2233 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002234 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00002235 }
2236 break;
2237 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002238 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002239 }
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00002240
2241 context->drawElements(mode, count, type, indices, primcount);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002242 }
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002243 }
2244 }
2245 catch(std::bad_alloc&)
2246 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002247 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002248 }
2249}
2250
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002251void __stdcall glEnable(GLenum cap)
2252{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002253 EVENT("(GLenum cap = 0x%X)", cap);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002254
2255 try
2256 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002257 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002258
2259 if (context)
2260 {
2261 switch (cap)
2262 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00002263 case GL_CULL_FACE: context->setCullFace(true); break;
2264 case GL_POLYGON_OFFSET_FILL: context->setPolygonOffsetFill(true); break;
2265 case GL_SAMPLE_ALPHA_TO_COVERAGE: context->setSampleAlphaToCoverage(true); break;
2266 case GL_SAMPLE_COVERAGE: context->setSampleCoverage(true); break;
2267 case GL_SCISSOR_TEST: context->setScissorTest(true); break;
2268 case GL_STENCIL_TEST: context->setStencilTest(true); break;
2269 case GL_DEPTH_TEST: context->setDepthTest(true); break;
2270 case GL_BLEND: context->setBlend(true); break;
2271 case GL_DITHER: context->setDither(true); break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002272 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002273 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002274 }
2275 }
2276 }
2277 catch(std::bad_alloc&)
2278 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002279 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002280 }
2281}
2282
2283void __stdcall glEnableVertexAttribArray(GLuint index)
2284{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002285 EVENT("(GLuint index = %d)", index);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002286
2287 try
2288 {
2289 if (index >= gl::MAX_VERTEX_ATTRIBS)
2290 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002291 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002292 }
2293
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002294 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002295
2296 if (context)
2297 {
daniel@transgaming.com83921382011-01-08 05:46:00 +00002298 context->setEnableVertexAttribArray(index, true);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002299 }
2300 }
2301 catch(std::bad_alloc&)
2302 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002303 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002304 }
2305}
2306
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00002307void __stdcall glEndQueryEXT(GLenum target)
2308{
2309 EVENT("GLenum target = 0x%X)", target);
2310
2311 try
2312 {
2313 switch (target)
2314 {
2315 case GL_ANY_SAMPLES_PASSED_EXT:
2316 case GL_ANY_SAMPLES_PASSED_CONSERVATIVE_EXT:
2317 break;
2318 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002319 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00002320 }
2321
2322 gl::Context *context = gl::getNonLostContext();
2323
2324 if (context)
2325 {
2326 context->endQuery(target);
2327 }
2328 }
2329 catch(std::bad_alloc&)
2330 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002331 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00002332 }
2333}
2334
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002335void __stdcall glFinishFenceNV(GLuint fence)
2336{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002337 EVENT("(GLuint fence = %d)", fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002338
2339 try
2340 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002341 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002342
2343 if (context)
2344 {
2345 gl::Fence* fenceObject = context->getFence(fence);
2346
2347 if (fenceObject == NULL)
2348 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002349 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002350 }
2351
2352 fenceObject->finishFence();
2353 }
2354 }
2355 catch(std::bad_alloc&)
2356 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002357 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002358 }
2359}
2360
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002361void __stdcall glFinish(void)
2362{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002363 EVENT("()");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002364
2365 try
2366 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002367 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002368
2369 if (context)
2370 {
daniel@transgaming.com0d86aa72011-10-26 02:35:10 +00002371 context->sync(true);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002372 }
2373 }
2374 catch(std::bad_alloc&)
2375 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002376 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002377 }
2378}
2379
2380void __stdcall glFlush(void)
2381{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002382 EVENT("()");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002383
2384 try
2385 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002386 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002387
2388 if (context)
2389 {
daniel@transgaming.com0d86aa72011-10-26 02:35:10 +00002390 context->sync(false);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002391 }
2392 }
2393 catch(std::bad_alloc&)
2394 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002395 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002396 }
2397}
2398
2399void __stdcall glFramebufferRenderbuffer(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer)
2400{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002401 EVENT("(GLenum target = 0x%X, GLenum attachment = 0x%X, GLenum renderbuffertarget = 0x%X, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00002402 "GLuint renderbuffer = %d)", target, attachment, renderbuffertarget, renderbuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002403
2404 try
2405 {
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002406 if ((target != GL_FRAMEBUFFER && target != GL_DRAW_FRAMEBUFFER_ANGLE && target != GL_READ_FRAMEBUFFER_ANGLE)
daniel@transgaming.com2fa45512011-10-04 18:43:18 +00002407 || (renderbuffertarget != GL_RENDERBUFFER && renderbuffer != 0))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002408 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002409 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002410 }
2411
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002412 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002413
2414 if (context)
2415 {
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002416 gl::Framebuffer *framebuffer = NULL;
2417 GLuint framebufferHandle = 0;
2418 if (target == GL_READ_FRAMEBUFFER_ANGLE)
2419 {
2420 framebuffer = context->getReadFramebuffer();
2421 framebufferHandle = context->getReadFramebufferHandle();
2422 }
daniel@transgaming.com2fa45512011-10-04 18:43:18 +00002423 else
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002424 {
2425 framebuffer = context->getDrawFramebuffer();
2426 framebufferHandle = context->getDrawFramebufferHandle();
2427 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002428
daniel@transgaming.com2fa45512011-10-04 18:43:18 +00002429 if (!framebuffer || (framebufferHandle == 0 && renderbuffer != 0))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002430 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002431 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002432 }
2433
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002434 if (attachment >= GL_COLOR_ATTACHMENT0_EXT && attachment <= GL_COLOR_ATTACHMENT15_EXT)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002435 {
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002436 const unsigned int colorAttachment = (attachment - GL_COLOR_ATTACHMENT0_EXT);
2437
2438 if (colorAttachment >= context->getMaximumRenderTargets())
2439 {
2440 return gl::error(GL_INVALID_VALUE);
2441 }
2442
2443 framebuffer->setColorbuffer(colorAttachment, GL_RENDERBUFFER, renderbuffer);
2444 }
2445 else
2446 {
2447 switch (attachment)
2448 {
2449 case GL_DEPTH_ATTACHMENT:
2450 framebuffer->setDepthbuffer(GL_RENDERBUFFER, renderbuffer);
2451 break;
2452 case GL_STENCIL_ATTACHMENT:
2453 framebuffer->setStencilbuffer(GL_RENDERBUFFER, renderbuffer);
2454 break;
2455 default:
2456 return gl::error(GL_INVALID_ENUM);
2457 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002458 }
2459 }
2460 }
2461 catch(std::bad_alloc&)
2462 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002463 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002464 }
2465}
2466
2467void __stdcall glFramebufferTexture2D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level)
2468{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002469 EVENT("(GLenum target = 0x%X, GLenum attachment = 0x%X, GLenum textarget = 0x%X, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00002470 "GLuint texture = %d, GLint level = %d)", target, attachment, textarget, texture, level);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002471
2472 try
2473 {
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002474 if (target != GL_FRAMEBUFFER && target != GL_DRAW_FRAMEBUFFER_ANGLE && target != GL_READ_FRAMEBUFFER_ANGLE)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002475 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002476 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002477 }
2478
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002479 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002480
2481 if (context)
2482 {
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002483 if (attachment >= GL_COLOR_ATTACHMENT0_EXT && attachment <= GL_COLOR_ATTACHMENT15_EXT)
2484 {
2485 const unsigned int colorAttachment = (attachment - GL_COLOR_ATTACHMENT0_EXT);
2486
2487 if (colorAttachment >= context->getMaximumRenderTargets())
2488 {
2489 return gl::error(GL_INVALID_VALUE);
2490 }
2491 }
2492 else
2493 {
2494 switch (attachment)
2495 {
2496 case GL_DEPTH_ATTACHMENT:
2497 case GL_STENCIL_ATTACHMENT:
2498 break;
2499 default:
2500 return gl::error(GL_INVALID_ENUM);
2501 }
2502 }
2503
daniel@transgaming.com93a81472010-04-20 18:52:58 +00002504 if (texture == 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002505 {
daniel@transgaming.com93a81472010-04-20 18:52:58 +00002506 textarget = GL_NONE;
2507 }
2508 else
2509 {
2510 gl::Texture *tex = context->getTexture(texture);
2511
2512 if (tex == NULL)
2513 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002514 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com93a81472010-04-20 18:52:58 +00002515 }
2516
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002517 switch (textarget)
2518 {
2519 case GL_TEXTURE_2D:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002520 {
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00002521 if (tex->getTarget() != GL_TEXTURE_2D)
2522 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002523 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00002524 }
2525 gl::Texture2D *tex2d = static_cast<gl::Texture2D *>(tex);
daniel@transgaming.com92f49922012-05-09 15:49:19 +00002526 if (tex2d->isCompressed(0))
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00002527 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002528 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00002529 }
2530 break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002531 }
daniel@transgaming.com93a81472010-04-20 18:52:58 +00002532
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002533 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002534 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002535 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002536 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002537 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002538 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
daniel@transgaming.com93a81472010-04-20 18:52:58 +00002539 {
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00002540 if (tex->getTarget() != GL_TEXTURE_CUBE_MAP)
2541 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002542 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00002543 }
2544 gl::TextureCubeMap *texcube = static_cast<gl::TextureCubeMap *>(tex);
daniel@transgaming.com4df88e82012-05-09 15:49:24 +00002545 if (texcube->isCompressed(textarget, level))
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00002546 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002547 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00002548 }
2549 break;
daniel@transgaming.com93a81472010-04-20 18:52:58 +00002550 }
daniel@transgaming.com93a81472010-04-20 18:52:58 +00002551
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002552 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002553 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002554 }
2555
2556 if (level != 0)
2557 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002558 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002559 }
2560 }
2561
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002562 gl::Framebuffer *framebuffer = NULL;
2563 GLuint framebufferHandle = 0;
2564 if (target == GL_READ_FRAMEBUFFER_ANGLE)
2565 {
2566 framebuffer = context->getReadFramebuffer();
2567 framebufferHandle = context->getReadFramebufferHandle();
2568 }
2569 else
2570 {
2571 framebuffer = context->getDrawFramebuffer();
2572 framebufferHandle = context->getDrawFramebufferHandle();
2573 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002574
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002575 if (framebufferHandle == 0 || !framebuffer)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002576 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002577 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002578 }
2579
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002580 if (attachment >= GL_COLOR_ATTACHMENT0_EXT && attachment <= GL_COLOR_ATTACHMENT15_EXT)
daniel@transgaming.comfbc09532010-04-26 15:33:41 +00002581 {
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002582 const unsigned int colorAttachment = (attachment - GL_COLOR_ATTACHMENT0_EXT);
2583
2584 if (colorAttachment >= context->getMaximumRenderTargets())
2585 {
2586 return gl::error(GL_INVALID_VALUE);
2587 }
2588
2589 framebuffer->setColorbuffer(colorAttachment, textarget, texture);
2590 }
2591 else
2592 {
2593 switch (attachment)
2594 {
2595 case GL_DEPTH_ATTACHMENT: framebuffer->setDepthbuffer(textarget, texture); break;
2596 case GL_STENCIL_ATTACHMENT: framebuffer->setStencilbuffer(textarget, texture); break;
2597 }
daniel@transgaming.comfbc09532010-04-26 15:33:41 +00002598 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002599 }
2600 }
2601 catch(std::bad_alloc&)
2602 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002603 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002604 }
2605}
2606
2607void __stdcall glFrontFace(GLenum mode)
2608{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002609 EVENT("(GLenum mode = 0x%X)", mode);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002610
2611 try
2612 {
2613 switch (mode)
2614 {
2615 case GL_CW:
2616 case GL_CCW:
2617 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002618 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002619
2620 if (context)
2621 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00002622 context->setFrontFace(mode);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002623 }
2624 }
2625 break;
2626 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002627 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002628 }
2629 }
2630 catch(std::bad_alloc&)
2631 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002632 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002633 }
2634}
2635
2636void __stdcall glGenBuffers(GLsizei n, GLuint* buffers)
2637{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002638 EVENT("(GLsizei n = %d, GLuint* buffers = 0x%0.8p)", n, buffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002639
2640 try
2641 {
2642 if (n < 0)
2643 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002644 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002645 }
2646
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002647 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002648
2649 if (context)
2650 {
2651 for (int i = 0; i < n; i++)
2652 {
2653 buffers[i] = context->createBuffer();
2654 }
2655 }
2656 }
2657 catch(std::bad_alloc&)
2658 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002659 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002660 }
2661}
2662
2663void __stdcall glGenerateMipmap(GLenum target)
2664{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002665 EVENT("(GLenum target = 0x%X)", target);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002666
2667 try
2668 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002669 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com8fd99e22010-04-20 18:52:00 +00002670
2671 if (context)
2672 {
daniel@transgaming.com8fd99e22010-04-20 18:52:00 +00002673 switch (target)
2674 {
2675 case GL_TEXTURE_2D:
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00002676 {
2677 gl::Texture2D *tex2d = context->getTexture2D();
2678
daniel@transgaming.com92f49922012-05-09 15:49:19 +00002679 if (tex2d->isCompressed(0))
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00002680 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002681 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00002682 }
daniel@transgaming.com0c854682012-05-31 01:14:11 +00002683 if (tex2d->isDepth(0))
2684 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002685 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com0c854682012-05-31 01:14:11 +00002686 }
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00002687
2688 tex2d->generateMipmaps();
2689 break;
2690 }
daniel@transgaming.com8fd99e22010-04-20 18:52:00 +00002691
2692 case GL_TEXTURE_CUBE_MAP:
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00002693 {
2694 gl::TextureCubeMap *texcube = context->getTextureCubeMap();
2695
daniel@transgaming.com4df88e82012-05-09 15:49:24 +00002696 if (texcube->isCompressed(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0))
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00002697 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002698 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00002699 }
2700
2701 texcube->generateMipmaps();
2702 break;
2703 }
daniel@transgaming.com8fd99e22010-04-20 18:52:00 +00002704
2705 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002706 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com8fd99e22010-04-20 18:52:00 +00002707 }
daniel@transgaming.com8fd99e22010-04-20 18:52:00 +00002708 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002709 }
2710 catch(std::bad_alloc&)
2711 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002712 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002713 }
2714}
2715
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002716void __stdcall glGenFencesNV(GLsizei n, GLuint* fences)
2717{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002718 EVENT("(GLsizei n = %d, GLuint* fences = 0x%0.8p)", n, fences);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002719
2720 try
2721 {
2722 if (n < 0)
2723 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002724 return gl::error(GL_INVALID_VALUE);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002725 }
2726
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002727 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002728
2729 if (context)
2730 {
2731 for (int i = 0; i < n; i++)
2732 {
2733 fences[i] = context->createFence();
2734 }
2735 }
2736 }
2737 catch(std::bad_alloc&)
2738 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002739 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002740 }
2741}
2742
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002743void __stdcall glGenFramebuffers(GLsizei n, GLuint* framebuffers)
2744{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002745 EVENT("(GLsizei n = %d, GLuint* framebuffers = 0x%0.8p)", n, framebuffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002746
2747 try
2748 {
2749 if (n < 0)
2750 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002751 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002752 }
2753
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002754 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002755
2756 if (context)
2757 {
2758 for (int i = 0; i < n; i++)
2759 {
2760 framebuffers[i] = context->createFramebuffer();
2761 }
2762 }
2763 }
2764 catch(std::bad_alloc&)
2765 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002766 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002767 }
2768}
2769
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00002770void __stdcall glGenQueriesEXT(GLsizei n, GLuint* ids)
2771{
2772 EVENT("(GLsizei n = %d, GLuint* ids = 0x%0.8p)", n, ids);
2773
2774 try
2775 {
2776 if (n < 0)
2777 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002778 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00002779 }
2780
2781 gl::Context *context = gl::getNonLostContext();
2782
2783 if (context)
2784 {
2785 for (int i = 0; i < n; i++)
2786 {
2787 ids[i] = context->createQuery();
2788 }
2789 }
2790 }
2791 catch(std::bad_alloc&)
2792 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002793 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00002794 }
2795}
2796
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002797void __stdcall glGenRenderbuffers(GLsizei n, GLuint* renderbuffers)
2798{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002799 EVENT("(GLsizei n = %d, GLuint* renderbuffers = 0x%0.8p)", n, renderbuffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002800
2801 try
2802 {
2803 if (n < 0)
2804 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002805 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002806 }
2807
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002808 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002809
2810 if (context)
2811 {
2812 for (int i = 0; i < n; i++)
2813 {
2814 renderbuffers[i] = context->createRenderbuffer();
2815 }
2816 }
2817 }
2818 catch(std::bad_alloc&)
2819 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002820 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002821 }
2822}
2823
2824void __stdcall glGenTextures(GLsizei n, GLuint* textures)
2825{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002826 EVENT("(GLsizei n = %d, GLuint* textures = 0x%0.8p)", n, textures);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002827
2828 try
2829 {
2830 if (n < 0)
2831 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002832 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002833 }
2834
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002835 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002836
2837 if (context)
2838 {
2839 for (int i = 0; i < n; i++)
2840 {
2841 textures[i] = context->createTexture();
2842 }
2843 }
2844 }
2845 catch(std::bad_alloc&)
2846 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002847 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002848 }
2849}
2850
daniel@transgaming.com85423182010-04-22 13:35:27 +00002851void __stdcall glGetActiveAttrib(GLuint program, GLuint index, GLsizei bufsize, GLsizei *length, GLint *size, GLenum *type, GLchar *name)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002852{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002853 EVENT("(GLuint program = %d, GLuint index = %d, GLsizei bufsize = %d, GLsizei *length = 0x%0.8p, "
daniel@transgaming.com85423182010-04-22 13:35:27 +00002854 "GLint *size = 0x%0.8p, GLenum *type = %0.8p, GLchar *name = %0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002855 program, index, bufsize, length, size, type, name);
2856
2857 try
2858 {
2859 if (bufsize < 0)
2860 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002861 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002862 }
2863
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002864 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com85423182010-04-22 13:35:27 +00002865
2866 if (context)
2867 {
2868 gl::Program *programObject = context->getProgram(program);
2869
2870 if (!programObject)
2871 {
2872 if (context->getShader(program))
2873 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002874 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com85423182010-04-22 13:35:27 +00002875 }
2876 else
2877 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002878 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com85423182010-04-22 13:35:27 +00002879 }
2880 }
2881
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00002882 if (index >= (GLuint)programObject->getActiveAttributeCount())
daniel@transgaming.com85423182010-04-22 13:35:27 +00002883 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002884 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com85423182010-04-22 13:35:27 +00002885 }
2886
2887 programObject->getActiveAttribute(index, bufsize, length, size, type, name);
2888 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002889 }
2890 catch(std::bad_alloc&)
2891 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002892 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002893 }
2894}
2895
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00002896void __stdcall glGetActiveUniform(GLuint program, GLuint index, GLsizei bufsize, GLsizei* length, GLint* size, GLenum* type, GLchar* name)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002897{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002898 EVENT("(GLuint program = %d, GLuint index = %d, GLsizei bufsize = %d, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00002899 "GLsizei* length = 0x%0.8p, GLint* size = 0x%0.8p, GLenum* type = 0x%0.8p, GLchar* name = 0x%0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002900 program, index, bufsize, length, size, type, name);
2901
2902 try
2903 {
2904 if (bufsize < 0)
2905 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002906 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002907 }
2908
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002909 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00002910
2911 if (context)
2912 {
2913 gl::Program *programObject = context->getProgram(program);
2914
2915 if (!programObject)
2916 {
2917 if (context->getShader(program))
2918 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002919 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00002920 }
2921 else
2922 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002923 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00002924 }
2925 }
2926
2927 if (index >= (GLuint)programObject->getActiveUniformCount())
2928 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002929 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00002930 }
2931
2932 programObject->getActiveUniform(index, bufsize, length, size, type, name);
2933 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002934 }
2935 catch(std::bad_alloc&)
2936 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002937 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002938 }
2939}
2940
2941void __stdcall glGetAttachedShaders(GLuint program, GLsizei maxcount, GLsizei* count, GLuint* shaders)
2942{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002943 EVENT("(GLuint program = %d, GLsizei maxcount = %d, GLsizei* count = 0x%0.8p, GLuint* shaders = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00002944 program, maxcount, count, shaders);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002945
2946 try
2947 {
2948 if (maxcount < 0)
2949 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002950 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002951 }
2952
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002953 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com6c785212010-03-30 03:36:17 +00002954
2955 if (context)
2956 {
2957 gl::Program *programObject = context->getProgram(program);
2958
2959 if (!programObject)
2960 {
daniel@transgaming.com23953e32010-04-13 19:53:31 +00002961 if (context->getShader(program))
2962 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002963 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com23953e32010-04-13 19:53:31 +00002964 }
2965 else
2966 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002967 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com23953e32010-04-13 19:53:31 +00002968 }
daniel@transgaming.com6c785212010-03-30 03:36:17 +00002969 }
2970
2971 return programObject->getAttachedShaders(maxcount, count, shaders);
2972 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002973 }
2974 catch(std::bad_alloc&)
2975 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002976 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002977 }
2978}
2979
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00002980int __stdcall glGetAttribLocation(GLuint program, const GLchar* name)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002981{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002982 EVENT("(GLuint program = %d, const GLchar* name = %s)", program, name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002983
2984 try
2985 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002986 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002987
2988 if (context)
2989 {
daniel@transgaming.combb274c32010-04-13 03:26:21 +00002990
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002991 gl::Program *programObject = context->getProgram(program);
2992
2993 if (!programObject)
2994 {
daniel@transgaming.combb274c32010-04-13 03:26:21 +00002995 if (context->getShader(program))
2996 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002997 return gl::error(GL_INVALID_OPERATION, -1);
daniel@transgaming.combb274c32010-04-13 03:26:21 +00002998 }
2999 else
3000 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003001 return gl::error(GL_INVALID_VALUE, -1);
daniel@transgaming.combb274c32010-04-13 03:26:21 +00003002 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003003 }
3004
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003005 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
daniel@transgaming.com716056c2012-07-24 18:38:59 +00003006 if (!programObject->isLinked() || !programBinary)
daniel@transgaming.comcf4aa872010-04-13 03:26:27 +00003007 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003008 return gl::error(GL_INVALID_OPERATION, -1);
daniel@transgaming.comcf4aa872010-04-13 03:26:27 +00003009 }
3010
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003011 return programBinary->getAttributeLocation(name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003012 }
3013 }
3014 catch(std::bad_alloc&)
3015 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003016 return gl::error(GL_OUT_OF_MEMORY, -1);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003017 }
3018
3019 return -1;
3020}
3021
3022void __stdcall glGetBooleanv(GLenum pname, GLboolean* params)
3023{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003024 EVENT("(GLenum pname = 0x%X, GLboolean* params = 0x%0.8p)", pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003025
3026 try
3027 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003028 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003029
3030 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003031 {
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003032 if (!(context->getBooleanv(pname, params)))
3033 {
3034 GLenum nativeType;
3035 unsigned int numParams = 0;
3036 if (!context->getQueryParameterInfo(pname, &nativeType, &numParams))
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003037 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003038
3039 if (numParams == 0)
3040 return; // it is known that the pname is valid, but there are no parameters to return
3041
3042 if (nativeType == GL_FLOAT)
3043 {
3044 GLfloat *floatParams = NULL;
3045 floatParams = new GLfloat[numParams];
3046
3047 context->getFloatv(pname, floatParams);
3048
3049 for (unsigned int i = 0; i < numParams; ++i)
3050 {
3051 if (floatParams[i] == 0.0f)
3052 params[i] = GL_FALSE;
3053 else
3054 params[i] = GL_TRUE;
3055 }
3056
3057 delete [] floatParams;
3058 }
3059 else if (nativeType == GL_INT)
3060 {
3061 GLint *intParams = NULL;
3062 intParams = new GLint[numParams];
3063
3064 context->getIntegerv(pname, intParams);
3065
3066 for (unsigned int i = 0; i < numParams; ++i)
3067 {
3068 if (intParams[i] == 0)
3069 params[i] = GL_FALSE;
3070 else
3071 params[i] = GL_TRUE;
3072 }
3073
3074 delete [] intParams;
3075 }
3076 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003077 }
3078 }
3079 catch(std::bad_alloc&)
3080 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003081 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003082 }
3083}
3084
3085void __stdcall glGetBufferParameteriv(GLenum target, GLenum pname, GLint* params)
3086{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003087 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLint* params = 0x%0.8p)", target, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003088
3089 try
3090 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003091 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comaa0ccbd2010-04-15 20:45:05 +00003092
3093 if (context)
3094 {
3095 gl::Buffer *buffer;
3096
3097 switch (target)
3098 {
3099 case GL_ARRAY_BUFFER:
3100 buffer = context->getArrayBuffer();
3101 break;
3102 case GL_ELEMENT_ARRAY_BUFFER:
3103 buffer = context->getElementArrayBuffer();
3104 break;
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003105 default: return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comaa0ccbd2010-04-15 20:45:05 +00003106 }
3107
3108 if (!buffer)
3109 {
3110 // A null buffer means that "0" is bound to the requested buffer target
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003111 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comaa0ccbd2010-04-15 20:45:05 +00003112 }
3113
3114 switch (pname)
3115 {
3116 case GL_BUFFER_USAGE:
3117 *params = buffer->usage();
3118 break;
3119 case GL_BUFFER_SIZE:
3120 *params = buffer->size();
3121 break;
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003122 default: return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comaa0ccbd2010-04-15 20:45:05 +00003123 }
3124 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003125 }
3126 catch(std::bad_alloc&)
3127 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003128 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003129 }
3130}
3131
3132GLenum __stdcall glGetError(void)
3133{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003134 EVENT("()");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003135
3136 gl::Context *context = gl::getContext();
3137
3138 if (context)
3139 {
daniel@transgaming.com82b28912011-12-12 21:01:35 +00003140 return context->getError();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003141 }
3142
3143 return GL_NO_ERROR;
3144}
3145
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00003146void __stdcall glGetFenceivNV(GLuint fence, GLenum pname, GLint *params)
3147{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003148 EVENT("(GLuint fence = %d, GLenum pname = 0x%X, GLint *params = 0x%0.8p)", fence, pname, params);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00003149
3150 try
3151 {
3152
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003153 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00003154
3155 if (context)
3156 {
3157 gl::Fence *fenceObject = context->getFence(fence);
3158
3159 if (fenceObject == NULL)
3160 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003161 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00003162 }
3163
3164 fenceObject->getFenceiv(pname, params);
3165 }
3166 }
3167 catch(std::bad_alloc&)
3168 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003169 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00003170 }
3171}
3172
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003173void __stdcall glGetFloatv(GLenum pname, GLfloat* params)
3174{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003175 EVENT("(GLenum pname = 0x%X, GLfloat* params = 0x%0.8p)", pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003176
3177 try
3178 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003179 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com32e58cd2010-03-24 09:44:10 +00003180
3181 if (context)
3182 {
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003183 if (!(context->getFloatv(pname, params)))
daniel@transgaming.com32e58cd2010-03-24 09:44:10 +00003184 {
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003185 GLenum nativeType;
3186 unsigned int numParams = 0;
3187 if (!context->getQueryParameterInfo(pname, &nativeType, &numParams))
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003188 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003189
3190 if (numParams == 0)
3191 return; // it is known that the pname is valid, but that there are no parameters to return.
3192
3193 if (nativeType == GL_BOOL)
3194 {
3195 GLboolean *boolParams = NULL;
3196 boolParams = new GLboolean[numParams];
3197
3198 context->getBooleanv(pname, boolParams);
3199
3200 for (unsigned int i = 0; i < numParams; ++i)
3201 {
3202 if (boolParams[i] == GL_FALSE)
3203 params[i] = 0.0f;
3204 else
3205 params[i] = 1.0f;
3206 }
3207
3208 delete [] boolParams;
3209 }
3210 else if (nativeType == GL_INT)
3211 {
3212 GLint *intParams = NULL;
3213 intParams = new GLint[numParams];
3214
3215 context->getIntegerv(pname, intParams);
3216
3217 for (unsigned int i = 0; i < numParams; ++i)
3218 {
3219 params[i] = (GLfloat)intParams[i];
3220 }
3221
3222 delete [] intParams;
3223 }
daniel@transgaming.com32e58cd2010-03-24 09:44:10 +00003224 }
3225 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003226 }
3227 catch(std::bad_alloc&)
3228 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003229 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003230 }
3231}
3232
3233void __stdcall glGetFramebufferAttachmentParameteriv(GLenum target, GLenum attachment, GLenum pname, GLint* params)
3234{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003235 EVENT("(GLenum target = 0x%X, GLenum attachment = 0x%X, GLenum pname = 0x%X, GLint* params = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00003236 target, attachment, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003237
3238 try
3239 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003240 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003241
3242 if (context)
3243 {
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00003244 if (target != GL_FRAMEBUFFER && target != GL_DRAW_FRAMEBUFFER_ANGLE && target != GL_READ_FRAMEBUFFER_ANGLE)
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003245 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003246 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003247 }
3248
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00003249 gl::Framebuffer *framebuffer = NULL;
3250 if (target == GL_READ_FRAMEBUFFER_ANGLE)
3251 {
3252 if(context->getReadFramebufferHandle() == 0)
3253 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003254 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00003255 }
3256
3257 framebuffer = context->getReadFramebuffer();
3258 }
3259 else
3260 {
3261 if (context->getDrawFramebufferHandle() == 0)
3262 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003263 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00003264 }
3265
3266 framebuffer = context->getDrawFramebuffer();
3267 }
3268
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003269 GLenum attachmentType;
3270 GLuint attachmentHandle;
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00003271
3272 if (attachment >= GL_COLOR_ATTACHMENT0_EXT && attachment <= GL_COLOR_ATTACHMENT15_EXT)
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003273 {
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00003274 const unsigned int colorAttachment = (attachment - GL_COLOR_ATTACHMENT0_EXT);
3275
3276 if (colorAttachment >= context->getMaximumRenderTargets())
3277 {
3278 return gl::error(GL_INVALID_ENUM);
3279 }
3280
3281 attachmentType = framebuffer->getColorbufferType(colorAttachment);
3282 attachmentHandle = framebuffer->getColorbufferHandle(colorAttachment);
3283 }
3284 else
3285 {
3286 switch (attachment)
3287 {
3288 case GL_DEPTH_ATTACHMENT:
3289 attachmentType = framebuffer->getDepthbufferType();
3290 attachmentHandle = framebuffer->getDepthbufferHandle();
3291 break;
3292 case GL_STENCIL_ATTACHMENT:
3293 attachmentType = framebuffer->getStencilbufferType();
3294 attachmentHandle = framebuffer->getStencilbufferHandle();
3295 break;
3296 default: return gl::error(GL_INVALID_ENUM);
3297 }
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003298 }
3299
3300 GLenum attachmentObjectType; // Type category
daniel@transgaming.comfbc09532010-04-26 15:33:41 +00003301 if (attachmentType == GL_NONE || attachmentType == GL_RENDERBUFFER)
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003302 {
3303 attachmentObjectType = attachmentType;
3304 }
apatrick@chromium.org551022e2012-01-23 19:56:54 +00003305 else if (gl::IsInternalTextureTarget(attachmentType))
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003306 {
3307 attachmentObjectType = GL_TEXTURE;
3308 }
apatrick@chromium.orga1d80592012-01-25 21:52:10 +00003309 else
3310 {
3311 UNREACHABLE();
3312 return;
3313 }
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003314
3315 switch (pname)
3316 {
3317 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE:
3318 *params = attachmentObjectType;
3319 break;
3320 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME:
3321 if (attachmentObjectType == GL_RENDERBUFFER || attachmentObjectType == GL_TEXTURE)
3322 {
3323 *params = attachmentHandle;
3324 }
3325 else
3326 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003327 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003328 }
3329 break;
3330 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL:
3331 if (attachmentObjectType == GL_TEXTURE)
3332 {
3333 *params = 0; // FramebufferTexture2D will not allow level to be set to anything else in GL ES 2.0
3334 }
3335 else
3336 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003337 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003338 }
3339 break;
3340 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE:
3341 if (attachmentObjectType == GL_TEXTURE)
3342 {
daniel@transgaming.com19ffc242010-05-04 03:35:21 +00003343 if (gl::IsCubemapTextureTarget(attachmentType))
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003344 {
3345 *params = attachmentType;
3346 }
3347 else
3348 {
3349 *params = 0;
3350 }
3351 }
3352 else
3353 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003354 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003355 }
3356 break;
3357 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003358 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003359 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003360 }
3361 }
3362 catch(std::bad_alloc&)
3363 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003364 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003365 }
3366}
3367
daniel@transgaming.com17f548c2011-11-09 17:47:02 +00003368GLenum __stdcall glGetGraphicsResetStatusEXT(void)
3369{
3370 EVENT("()");
3371
3372 try
3373 {
3374 gl::Context *context = gl::getContext();
3375
3376 if (context)
3377 {
3378 return context->getResetStatus();
3379 }
3380
3381 return GL_NO_ERROR;
3382 }
3383 catch(std::bad_alloc&)
3384 {
3385 return GL_OUT_OF_MEMORY;
3386 }
3387}
3388
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003389void __stdcall glGetIntegerv(GLenum pname, GLint* params)
3390{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003391 EVENT("(GLenum pname = 0x%X, GLint* params = 0x%0.8p)", pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003392
3393 try
3394 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003395 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003396
3397 if (context)
3398 {
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003399 if (!(context->getIntegerv(pname, params)))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003400 {
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003401 GLenum nativeType;
3402 unsigned int numParams = 0;
3403 if (!context->getQueryParameterInfo(pname, &nativeType, &numParams))
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003404 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003405
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003406 if (numParams == 0)
3407 return; // it is known that pname is valid, but there are no parameters to return
3408
3409 if (nativeType == GL_BOOL)
3410 {
3411 GLboolean *boolParams = NULL;
3412 boolParams = new GLboolean[numParams];
3413
3414 context->getBooleanv(pname, boolParams);
3415
3416 for (unsigned int i = 0; i < numParams; ++i)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003417 {
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003418 if (boolParams[i] == GL_FALSE)
3419 params[i] = 0;
3420 else
3421 params[i] = 1;
3422 }
3423
3424 delete [] boolParams;
3425 }
3426 else if (nativeType == GL_FLOAT)
3427 {
3428 GLfloat *floatParams = NULL;
3429 floatParams = new GLfloat[numParams];
3430
3431 context->getFloatv(pname, floatParams);
3432
3433 for (unsigned int i = 0; i < numParams; ++i)
3434 {
daniel@transgaming.comc1641352010-04-26 15:33:36 +00003435 if (pname == GL_DEPTH_RANGE || pname == GL_COLOR_CLEAR_VALUE || pname == GL_DEPTH_CLEAR_VALUE || pname == GL_BLEND_COLOR)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003436 {
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003437 params[i] = (GLint)(((GLfloat)(0xFFFFFFFF) * floatParams[i] - 1.0f) / 2.0f);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003438 }
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003439 else
3440 params[i] = (GLint)(floatParams[i] > 0.0f ? floor(floatParams[i] + 0.5) : ceil(floatParams[i] - 0.5));
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003441 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003442
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003443 delete [] floatParams;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003444 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003445 }
3446 }
3447 }
3448 catch(std::bad_alloc&)
3449 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003450 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003451 }
3452}
3453
3454void __stdcall glGetProgramiv(GLuint program, GLenum pname, GLint* params)
3455{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003456 EVENT("(GLuint program = %d, GLenum pname = %d, GLint* params = 0x%0.8p)", program, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003457
3458 try
3459 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003460 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003461
3462 if (context)
3463 {
3464 gl::Program *programObject = context->getProgram(program);
3465
3466 if (!programObject)
3467 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003468 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003469 }
3470
3471 switch (pname)
3472 {
3473 case GL_DELETE_STATUS:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003474 *params = programObject->isFlaggedForDeletion();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003475 return;
3476 case GL_LINK_STATUS:
daniel@transgaming.com716056c2012-07-24 18:38:59 +00003477 *params = programObject->isLinked();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003478 return;
3479 case GL_VALIDATE_STATUS:
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00003480 *params = programObject->isValidated();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003481 return;
3482 case GL_INFO_LOG_LENGTH:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003483 *params = programObject->getInfoLogLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003484 return;
3485 case GL_ATTACHED_SHADERS:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003486 *params = programObject->getAttachedShadersCount();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003487 return;
3488 case GL_ACTIVE_ATTRIBUTES:
daniel@transgaming.com85423182010-04-22 13:35:27 +00003489 *params = programObject->getActiveAttributeCount();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003490 return;
3491 case GL_ACTIVE_ATTRIBUTE_MAX_LENGTH:
daniel@transgaming.com85423182010-04-22 13:35:27 +00003492 *params = programObject->getActiveAttributeMaxLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003493 return;
3494 case GL_ACTIVE_UNIFORMS:
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00003495 *params = programObject->getActiveUniformCount();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003496 return;
3497 case GL_ACTIVE_UNIFORM_MAX_LENGTH:
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00003498 *params = programObject->getActiveUniformMaxLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003499 return;
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00003500 case GL_PROGRAM_BINARY_LENGTH_OES:
apatrick@chromium.org90080e32012-07-09 22:15:33 +00003501 *params = programObject->getProgramBinaryLength();
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00003502 return;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003503 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003504 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003505 }
3506 }
3507 }
3508 catch(std::bad_alloc&)
3509 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003510 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003511 }
3512}
3513
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00003514void __stdcall glGetProgramInfoLog(GLuint program, GLsizei bufsize, GLsizei* length, GLchar* infolog)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003515{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003516 EVENT("(GLuint program = %d, GLsizei bufsize = %d, GLsizei* length = 0x%0.8p, GLchar* infolog = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00003517 program, bufsize, length, infolog);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003518
3519 try
3520 {
3521 if (bufsize < 0)
3522 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003523 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003524 }
3525
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003526 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003527
3528 if (context)
3529 {
3530 gl::Program *programObject = context->getProgram(program);
3531
3532 if (!programObject)
3533 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003534 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003535 }
3536
3537 programObject->getInfoLog(bufsize, length, infolog);
3538 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003539 }
3540 catch(std::bad_alloc&)
3541 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003542 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003543 }
3544}
3545
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003546void __stdcall glGetQueryivEXT(GLenum target, GLenum pname, GLint *params)
3547{
3548 EVENT("GLenum target = 0x%X, GLenum pname = 0x%X, GLint *params = 0x%0.8p)", target, pname, params);
3549
3550 try
3551 {
3552 switch (pname)
3553 {
3554 case GL_CURRENT_QUERY_EXT:
3555 break;
3556 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003557 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003558 }
3559
3560 gl::Context *context = gl::getNonLostContext();
3561
3562 if (context)
3563 {
3564 params[0] = context->getActiveQuery(target);
3565 }
3566 }
3567 catch(std::bad_alloc&)
3568 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003569 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003570 }
3571}
3572
3573void __stdcall glGetQueryObjectuivEXT(GLuint id, GLenum pname, GLuint *params)
3574{
3575 EVENT("(GLuint id = %d, GLenum pname = 0x%X, GLuint *params = 0x%0.8p)", id, pname, params);
3576
3577 try
3578 {
3579 switch (pname)
3580 {
3581 case GL_QUERY_RESULT_EXT:
3582 case GL_QUERY_RESULT_AVAILABLE_EXT:
3583 break;
3584 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003585 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003586 }
3587 gl::Context *context = gl::getNonLostContext();
3588
3589 if (context)
3590 {
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003591 gl::Query *queryObject = context->getQuery(id, false, GL_NONE);
3592
3593 if (!queryObject)
3594 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003595 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003596 }
3597
3598 if (context->getActiveQuery(queryObject->getType()) == id)
3599 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003600 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003601 }
3602
3603 switch(pname)
3604 {
3605 case GL_QUERY_RESULT_EXT:
3606 params[0] = queryObject->getResult();
3607 break;
3608 case GL_QUERY_RESULT_AVAILABLE_EXT:
3609 params[0] = queryObject->isResultAvailable();
3610 break;
3611 default:
3612 ASSERT(false);
3613 }
3614 }
3615 }
3616 catch(std::bad_alloc&)
3617 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003618 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003619 }
3620}
3621
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003622void __stdcall glGetRenderbufferParameteriv(GLenum target, GLenum pname, GLint* params)
3623{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003624 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLint* params = 0x%0.8p)", target, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003625
3626 try
3627 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003628 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003629
3630 if (context)
3631 {
3632 if (target != GL_RENDERBUFFER)
3633 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003634 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003635 }
3636
daniel@transgaming.com428d1582010-05-04 03:35:25 +00003637 if (context->getRenderbufferHandle() == 0)
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003638 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003639 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003640 }
3641
daniel@transgaming.com428d1582010-05-04 03:35:25 +00003642 gl::Renderbuffer *renderbuffer = context->getRenderbuffer(context->getRenderbufferHandle());
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003643
3644 switch (pname)
3645 {
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +00003646 case GL_RENDERBUFFER_WIDTH: *params = renderbuffer->getWidth(); break;
3647 case GL_RENDERBUFFER_HEIGHT: *params = renderbuffer->getHeight(); break;
3648 case GL_RENDERBUFFER_INTERNAL_FORMAT: *params = renderbuffer->getInternalFormat(); break;
3649 case GL_RENDERBUFFER_RED_SIZE: *params = renderbuffer->getRedSize(); break;
3650 case GL_RENDERBUFFER_GREEN_SIZE: *params = renderbuffer->getGreenSize(); break;
3651 case GL_RENDERBUFFER_BLUE_SIZE: *params = renderbuffer->getBlueSize(); break;
3652 case GL_RENDERBUFFER_ALPHA_SIZE: *params = renderbuffer->getAlphaSize(); break;
3653 case GL_RENDERBUFFER_DEPTH_SIZE: *params = renderbuffer->getDepthSize(); break;
3654 case GL_RENDERBUFFER_STENCIL_SIZE: *params = renderbuffer->getStencilSize(); break;
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00003655 case GL_RENDERBUFFER_SAMPLES_ANGLE:
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +00003656 if (context->getMaxSupportedSamples() != 0)
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00003657 {
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +00003658 *params = renderbuffer->getSamples();
3659 }
3660 else
3661 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003662 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00003663 }
3664 break;
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003665 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003666 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003667 }
3668 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003669 }
3670 catch(std::bad_alloc&)
3671 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003672 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003673 }
3674}
3675
3676void __stdcall glGetShaderiv(GLuint shader, GLenum pname, GLint* params)
3677{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003678 EVENT("(GLuint shader = %d, GLenum pname = %d, GLint* params = 0x%0.8p)", shader, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003679
3680 try
3681 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003682 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003683
3684 if (context)
3685 {
3686 gl::Shader *shaderObject = context->getShader(shader);
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00003687
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003688 if (!shaderObject)
3689 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003690 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003691 }
3692
3693 switch (pname)
3694 {
3695 case GL_SHADER_TYPE:
3696 *params = shaderObject->getType();
3697 return;
3698 case GL_DELETE_STATUS:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003699 *params = shaderObject->isFlaggedForDeletion();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003700 return;
3701 case GL_COMPILE_STATUS:
3702 *params = shaderObject->isCompiled() ? GL_TRUE : GL_FALSE;
3703 return;
3704 case GL_INFO_LOG_LENGTH:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003705 *params = shaderObject->getInfoLogLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003706 return;
3707 case GL_SHADER_SOURCE_LENGTH:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003708 *params = shaderObject->getSourceLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003709 return;
zmo@google.coma574f782011-10-03 21:45:23 +00003710 case GL_TRANSLATED_SHADER_SOURCE_LENGTH_ANGLE:
3711 *params = shaderObject->getTranslatedSourceLength();
3712 return;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003713 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003714 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003715 }
3716 }
3717 }
3718 catch(std::bad_alloc&)
3719 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003720 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003721 }
3722}
3723
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00003724void __stdcall glGetShaderInfoLog(GLuint shader, GLsizei bufsize, GLsizei* length, GLchar* infolog)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003725{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003726 EVENT("(GLuint shader = %d, GLsizei bufsize = %d, GLsizei* length = 0x%0.8p, GLchar* infolog = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00003727 shader, bufsize, length, infolog);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003728
3729 try
3730 {
3731 if (bufsize < 0)
3732 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003733 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003734 }
3735
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003736 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003737
3738 if (context)
3739 {
3740 gl::Shader *shaderObject = context->getShader(shader);
3741
3742 if (!shaderObject)
3743 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003744 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003745 }
3746
3747 shaderObject->getInfoLog(bufsize, length, infolog);
3748 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003749 }
3750 catch(std::bad_alloc&)
3751 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003752 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003753 }
3754}
3755
3756void __stdcall glGetShaderPrecisionFormat(GLenum shadertype, GLenum precisiontype, GLint* range, GLint* precision)
3757{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003758 EVENT("(GLenum shadertype = 0x%X, GLenum precisiontype = 0x%X, GLint* range = 0x%0.8p, GLint* precision = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00003759 shadertype, precisiontype, range, precision);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003760
3761 try
3762 {
daniel@transgaming.com6c785212010-03-30 03:36:17 +00003763 switch (shadertype)
3764 {
3765 case GL_VERTEX_SHADER:
3766 case GL_FRAGMENT_SHADER:
3767 break;
3768 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003769 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com6c785212010-03-30 03:36:17 +00003770 }
3771
3772 switch (precisiontype)
3773 {
3774 case GL_LOW_FLOAT:
3775 case GL_MEDIUM_FLOAT:
3776 case GL_HIGH_FLOAT:
3777 // Assume IEEE 754 precision
3778 range[0] = 127;
3779 range[1] = 127;
daniel@transgaming.comc5c15382010-04-23 18:34:49 +00003780 *precision = 23;
daniel@transgaming.com6c785212010-03-30 03:36:17 +00003781 break;
3782 case GL_LOW_INT:
3783 case GL_MEDIUM_INT:
3784 case GL_HIGH_INT:
3785 // Some (most) hardware only supports single-precision floating-point numbers,
3786 // which can accurately represent integers up to +/-16777216
3787 range[0] = 24;
3788 range[1] = 24;
daniel@transgaming.comc5c15382010-04-23 18:34:49 +00003789 *precision = 0;
daniel@transgaming.com6c785212010-03-30 03:36:17 +00003790 break;
3791 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003792 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com6c785212010-03-30 03:36:17 +00003793 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003794 }
3795 catch(std::bad_alloc&)
3796 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003797 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003798 }
3799}
3800
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00003801void __stdcall glGetShaderSource(GLuint shader, GLsizei bufsize, GLsizei* length, GLchar* source)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003802{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003803 EVENT("(GLuint shader = %d, GLsizei bufsize = %d, GLsizei* length = 0x%0.8p, GLchar* source = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00003804 shader, bufsize, length, source);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003805
3806 try
3807 {
3808 if (bufsize < 0)
3809 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003810 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003811 }
3812
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003813 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003814
3815 if (context)
3816 {
3817 gl::Shader *shaderObject = context->getShader(shader);
3818
3819 if (!shaderObject)
3820 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003821 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003822 }
3823
3824 shaderObject->getSource(bufsize, length, source);
3825 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003826 }
3827 catch(std::bad_alloc&)
3828 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003829 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003830 }
3831}
3832
zmo@google.coma574f782011-10-03 21:45:23 +00003833void __stdcall glGetTranslatedShaderSourceANGLE(GLuint shader, GLsizei bufsize, GLsizei* length, GLchar* source)
3834{
3835 EVENT("(GLuint shader = %d, GLsizei bufsize = %d, GLsizei* length = 0x%0.8p, GLchar* source = 0x%0.8p)",
3836 shader, bufsize, length, source);
3837
3838 try
3839 {
3840 if (bufsize < 0)
3841 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003842 return gl::error(GL_INVALID_VALUE);
zmo@google.coma574f782011-10-03 21:45:23 +00003843 }
3844
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003845 gl::Context *context = gl::getNonLostContext();
zmo@google.coma574f782011-10-03 21:45:23 +00003846
3847 if (context)
3848 {
3849 gl::Shader *shaderObject = context->getShader(shader);
3850
3851 if (!shaderObject)
3852 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003853 return gl::error(GL_INVALID_OPERATION);
zmo@google.coma574f782011-10-03 21:45:23 +00003854 }
3855
3856 shaderObject->getTranslatedSource(bufsize, length, source);
3857 }
3858 }
3859 catch(std::bad_alloc&)
3860 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003861 return gl::error(GL_OUT_OF_MEMORY);
zmo@google.coma574f782011-10-03 21:45:23 +00003862 }
3863}
3864
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003865const GLubyte* __stdcall glGetString(GLenum name)
3866{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003867 EVENT("(GLenum name = 0x%X)", name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003868
3869 try
3870 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003871 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com3e4c6002010-05-05 18:50:13 +00003872
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003873 switch (name)
3874 {
3875 case GL_VENDOR:
daniel@transgaming.coma0ce7e62011-01-25 14:47:16 +00003876 return (GLubyte*)"Google Inc.";
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003877 case GL_RENDERER:
daniel@transgaming.comc23ff642011-08-16 20:28:45 +00003878 return (GLubyte*)((context != NULL) ? context->getRendererString() : "ANGLE");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003879 case GL_VERSION:
daniel@transgaming.com1825d8e2012-08-27 16:25:29 +00003880 return (GLubyte*)"OpenGL ES 2.0 (ANGLE " VERSION_STRING ")";
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003881 case GL_SHADING_LANGUAGE_VERSION:
daniel@transgaming.com1825d8e2012-08-27 16:25:29 +00003882 return (GLubyte*)"OpenGL ES GLSL ES 1.00 (ANGLE " VERSION_STRING ")";
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003883 case GL_EXTENSIONS:
daniel@transgaming.com3e4c6002010-05-05 18:50:13 +00003884 return (GLubyte*)((context != NULL) ? context->getExtensionString() : "");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003885 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003886 return gl::error(GL_INVALID_ENUM, (GLubyte*)NULL);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003887 }
3888 }
3889 catch(std::bad_alloc&)
3890 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003891 return gl::error(GL_OUT_OF_MEMORY, (GLubyte*)NULL);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003892 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003893}
3894
3895void __stdcall glGetTexParameterfv(GLenum target, GLenum pname, GLfloat* params)
3896{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003897 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLfloat* params = 0x%0.8p)", target, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003898
3899 try
3900 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003901 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003902
3903 if (context)
3904 {
3905 gl::Texture *texture;
3906
3907 switch (target)
3908 {
3909 case GL_TEXTURE_2D:
3910 texture = context->getTexture2D();
3911 break;
3912 case GL_TEXTURE_CUBE_MAP:
3913 texture = context->getTextureCubeMap();
3914 break;
3915 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003916 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003917 }
3918
3919 switch (pname)
3920 {
3921 case GL_TEXTURE_MAG_FILTER:
3922 *params = (GLfloat)texture->getMagFilter();
3923 break;
3924 case GL_TEXTURE_MIN_FILTER:
3925 *params = (GLfloat)texture->getMinFilter();
3926 break;
3927 case GL_TEXTURE_WRAP_S:
3928 *params = (GLfloat)texture->getWrapS();
3929 break;
3930 case GL_TEXTURE_WRAP_T:
3931 *params = (GLfloat)texture->getWrapT();
3932 break;
daniel@transgaming.comd30bd0a2011-11-11 04:10:34 +00003933 case GL_TEXTURE_IMMUTABLE_FORMAT_EXT:
3934 *params = (GLfloat)(texture->isImmutable() ? GL_TRUE : GL_FALSE);
3935 break;
daniel@transgaming.com7d18c172011-11-11 04:18:21 +00003936 case GL_TEXTURE_USAGE_ANGLE:
3937 *params = (GLfloat)texture->getUsage();
3938 break;
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00003939 case GL_TEXTURE_MAX_ANISOTROPY_EXT:
3940 if (!context->supportsTextureFilterAnisotropy())
3941 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003942 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00003943 }
3944 *params = (GLfloat)texture->getMaxAnisotropy();
3945 break;
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003946 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003947 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003948 }
3949 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003950 }
3951 catch(std::bad_alloc&)
3952 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003953 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003954 }
3955}
3956
3957void __stdcall glGetTexParameteriv(GLenum target, GLenum pname, GLint* params)
3958{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003959 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLint* params = 0x%0.8p)", target, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003960
3961 try
3962 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003963 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003964
3965 if (context)
3966 {
3967 gl::Texture *texture;
3968
3969 switch (target)
3970 {
3971 case GL_TEXTURE_2D:
3972 texture = context->getTexture2D();
3973 break;
3974 case GL_TEXTURE_CUBE_MAP:
3975 texture = context->getTextureCubeMap();
3976 break;
3977 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003978 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003979 }
3980
3981 switch (pname)
3982 {
3983 case GL_TEXTURE_MAG_FILTER:
3984 *params = texture->getMagFilter();
3985 break;
3986 case GL_TEXTURE_MIN_FILTER:
3987 *params = texture->getMinFilter();
3988 break;
3989 case GL_TEXTURE_WRAP_S:
3990 *params = texture->getWrapS();
3991 break;
3992 case GL_TEXTURE_WRAP_T:
3993 *params = texture->getWrapT();
3994 break;
daniel@transgaming.comd30bd0a2011-11-11 04:10:34 +00003995 case GL_TEXTURE_IMMUTABLE_FORMAT_EXT:
3996 *params = texture->isImmutable() ? GL_TRUE : GL_FALSE;
3997 break;
daniel@transgaming.com7d18c172011-11-11 04:18:21 +00003998 case GL_TEXTURE_USAGE_ANGLE:
3999 *params = texture->getUsage();
4000 break;
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00004001 case GL_TEXTURE_MAX_ANISOTROPY_EXT:
4002 if (!context->supportsTextureFilterAnisotropy())
4003 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004004 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00004005 }
4006 *params = (GLint)texture->getMaxAnisotropy();
4007 break;
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00004008 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004009 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00004010 }
4011 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004012 }
4013 catch(std::bad_alloc&)
4014 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004015 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004016 }
4017}
4018
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004019void __stdcall glGetnUniformfvEXT(GLuint program, GLint location, GLsizei bufSize, GLfloat* params)
4020{
4021 EVENT("(GLuint program = %d, GLint location = %d, GLsizei bufSize = %d, GLfloat* params = 0x%0.8p)",
4022 program, location, bufSize, params);
4023
4024 try
4025 {
4026 if (bufSize < 0)
4027 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004028 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004029 }
4030
4031 gl::Context *context = gl::getNonLostContext();
4032
4033 if (context)
4034 {
4035 if (program == 0)
4036 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004037 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004038 }
4039
4040 gl::Program *programObject = context->getProgram(program);
4041
daniel@transgaming.com716056c2012-07-24 18:38:59 +00004042 if (!programObject || !programObject->isLinked())
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004043 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004044 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004045 }
4046
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00004047 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
4048 if (!programBinary)
4049 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004050 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00004051 }
4052
4053 if (!programBinary->getUniformfv(location, &bufSize, params))
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004054 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004055 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004056 }
4057 }
4058 }
4059 catch(std::bad_alloc&)
4060 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004061 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004062 }
4063}
4064
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004065void __stdcall glGetUniformfv(GLuint program, GLint location, GLfloat* params)
4066{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004067 EVENT("(GLuint program = %d, GLint location = %d, GLfloat* params = 0x%0.8p)", program, location, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004068
4069 try
4070 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004071 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004072
4073 if (context)
4074 {
4075 if (program == 0)
4076 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004077 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004078 }
4079
4080 gl::Program *programObject = context->getProgram(program);
4081
daniel@transgaming.com716056c2012-07-24 18:38:59 +00004082 if (!programObject || !programObject->isLinked())
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004083 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004084 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004085 }
4086
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00004087 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
4088 if (!programBinary)
4089 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004090 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00004091 }
4092
4093 if (!programBinary->getUniformfv(location, NULL, params))
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004094 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004095 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004096 }
4097 }
4098 }
4099 catch(std::bad_alloc&)
4100 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004101 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004102 }
4103}
4104
4105void __stdcall glGetnUniformivEXT(GLuint program, GLint location, GLsizei bufSize, GLint* params)
4106{
4107 EVENT("(GLuint program = %d, GLint location = %d, GLsizei bufSize = %d, GLint* params = 0x%0.8p)",
4108 program, location, bufSize, params);
4109
4110 try
4111 {
4112 if (bufSize < 0)
4113 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004114 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004115 }
4116
4117 gl::Context *context = gl::getNonLostContext();
4118
4119 if (context)
4120 {
4121 if (program == 0)
4122 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004123 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004124 }
4125
4126 gl::Program *programObject = context->getProgram(program);
4127
daniel@transgaming.com716056c2012-07-24 18:38:59 +00004128 if (!programObject || !programObject->isLinked())
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004129 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004130 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004131 }
4132
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00004133 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
4134 if (!programBinary)
4135 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004136 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00004137 }
4138
4139 if (!programBinary->getUniformiv(location, &bufSize, params))
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004140 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004141 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004142 }
4143 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004144 }
4145 catch(std::bad_alloc&)
4146 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004147 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004148 }
4149}
4150
4151void __stdcall glGetUniformiv(GLuint program, GLint location, GLint* params)
4152{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004153 EVENT("(GLuint program = %d, GLint location = %d, GLint* params = 0x%0.8p)", program, location, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004154
4155 try
4156 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004157 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004158
4159 if (context)
4160 {
4161 if (program == 0)
4162 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004163 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004164 }
4165
4166 gl::Program *programObject = context->getProgram(program);
4167
daniel@transgaming.com716056c2012-07-24 18:38:59 +00004168 if (!programObject || !programObject->isLinked())
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004169 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004170 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004171 }
4172
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00004173 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
4174 if (!programBinary)
4175 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004176 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00004177 }
4178
4179 if (!programBinary->getUniformiv(location, NULL, params))
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004180 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004181 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004182 }
4183 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004184 }
4185 catch(std::bad_alloc&)
4186 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004187 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004188 }
4189}
4190
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00004191int __stdcall glGetUniformLocation(GLuint program, const GLchar* name)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004192{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004193 EVENT("(GLuint program = %d, const GLchar* name = 0x%0.8p)", program, name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004194
4195 try
4196 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004197 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004198
4199 if (strstr(name, "gl_") == name)
4200 {
4201 return -1;
4202 }
4203
4204 if (context)
4205 {
4206 gl::Program *programObject = context->getProgram(program);
4207
4208 if (!programObject)
4209 {
daniel@transgaming.comd1abe5b2010-04-13 19:53:33 +00004210 if (context->getShader(program))
4211 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004212 return gl::error(GL_INVALID_OPERATION, -1);
daniel@transgaming.comd1abe5b2010-04-13 19:53:33 +00004213 }
4214 else
4215 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004216 return gl::error(GL_INVALID_VALUE, -1);
daniel@transgaming.comd1abe5b2010-04-13 19:53:33 +00004217 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004218 }
4219
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00004220 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
daniel@transgaming.com716056c2012-07-24 18:38:59 +00004221 if (!programObject->isLinked() || !programBinary)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004222 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004223 return gl::error(GL_INVALID_OPERATION, -1);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004224 }
4225
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00004226 return programBinary->getUniformLocation(name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004227 }
4228 }
4229 catch(std::bad_alloc&)
4230 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004231 return gl::error(GL_OUT_OF_MEMORY, -1);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004232 }
4233
4234 return -1;
4235}
4236
4237void __stdcall glGetVertexAttribfv(GLuint index, GLenum pname, GLfloat* params)
4238{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004239 EVENT("(GLuint index = %d, GLenum pname = 0x%X, GLfloat* params = 0x%0.8p)", index, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004240
4241 try
4242 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004243 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004244
daniel@transgaming.come0078962010-04-15 20:45:08 +00004245 if (context)
4246 {
4247 if (index >= gl::MAX_VERTEX_ATTRIBS)
4248 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004249 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004250 }
4251
daniel@transgaming.com83921382011-01-08 05:46:00 +00004252 const gl::VertexAttribute &attribState = context->getVertexAttribState(index);
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004253
daniel@transgaming.come0078962010-04-15 20:45:08 +00004254 switch (pname)
4255 {
4256 case GL_VERTEX_ATTRIB_ARRAY_ENABLED:
daniel@transgaming.com83921382011-01-08 05:46:00 +00004257 *params = (GLfloat)(attribState.mArrayEnabled ? GL_TRUE : GL_FALSE);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004258 break;
4259 case GL_VERTEX_ATTRIB_ARRAY_SIZE:
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004260 *params = (GLfloat)attribState.mSize;
daniel@transgaming.come0078962010-04-15 20:45:08 +00004261 break;
4262 case GL_VERTEX_ATTRIB_ARRAY_STRIDE:
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004263 *params = (GLfloat)attribState.mStride;
daniel@transgaming.come0078962010-04-15 20:45:08 +00004264 break;
4265 case GL_VERTEX_ATTRIB_ARRAY_TYPE:
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004266 *params = (GLfloat)attribState.mType;
daniel@transgaming.come0078962010-04-15 20:45:08 +00004267 break;
4268 case GL_VERTEX_ATTRIB_ARRAY_NORMALIZED:
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004269 *params = (GLfloat)(attribState.mNormalized ? GL_TRUE : GL_FALSE);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004270 break;
4271 case GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING:
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +00004272 *params = (GLfloat)attribState.mBoundBuffer.id();
daniel@transgaming.come0078962010-04-15 20:45:08 +00004273 break;
4274 case GL_CURRENT_VERTEX_ATTRIB:
4275 for (int i = 0; i < 4; ++i)
4276 {
shannon.woods%transgaming.com@gtempaccount.com3026dc72013-04-13 03:37:27 +00004277 params[i] = attribState.mCurrentValue.FloatValues[i];
daniel@transgaming.come0078962010-04-15 20:45:08 +00004278 }
4279 break;
shannon.woods%transgaming.com@gtempaccount.com14eb55e2013-04-13 03:35:06 +00004280 case GL_VERTEX_ATTRIB_ARRAY_DIVISOR:
4281 // Don't verify ES3 context because GL_VERTEX_ATTRIB_ARRAY_DIVISOR_ANGLE uses
4282 // the same constant.
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00004283 *params = (GLfloat)attribState.mDivisor;
4284 break;
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004285 default: return gl::error(GL_INVALID_ENUM);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004286 }
4287 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004288 }
4289 catch(std::bad_alloc&)
4290 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004291 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004292 }
4293}
4294
4295void __stdcall glGetVertexAttribiv(GLuint index, GLenum pname, GLint* params)
4296{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004297 EVENT("(GLuint index = %d, GLenum pname = 0x%X, GLint* params = 0x%0.8p)", index, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004298
4299 try
4300 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004301 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004302
daniel@transgaming.come0078962010-04-15 20:45:08 +00004303 if (context)
4304 {
4305 if (index >= gl::MAX_VERTEX_ATTRIBS)
4306 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004307 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004308 }
4309
daniel@transgaming.com83921382011-01-08 05:46:00 +00004310 const gl::VertexAttribute &attribState = context->getVertexAttribState(index);
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004311
daniel@transgaming.come0078962010-04-15 20:45:08 +00004312 switch (pname)
4313 {
4314 case GL_VERTEX_ATTRIB_ARRAY_ENABLED:
daniel@transgaming.com83921382011-01-08 05:46:00 +00004315 *params = (attribState.mArrayEnabled ? GL_TRUE : GL_FALSE);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004316 break;
4317 case GL_VERTEX_ATTRIB_ARRAY_SIZE:
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004318 *params = attribState.mSize;
daniel@transgaming.come0078962010-04-15 20:45:08 +00004319 break;
4320 case GL_VERTEX_ATTRIB_ARRAY_STRIDE:
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004321 *params = attribState.mStride;
daniel@transgaming.come0078962010-04-15 20:45:08 +00004322 break;
4323 case GL_VERTEX_ATTRIB_ARRAY_TYPE:
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004324 *params = attribState.mType;
daniel@transgaming.come0078962010-04-15 20:45:08 +00004325 break;
4326 case GL_VERTEX_ATTRIB_ARRAY_NORMALIZED:
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004327 *params = (attribState.mNormalized ? GL_TRUE : GL_FALSE);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004328 break;
4329 case GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING:
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +00004330 *params = attribState.mBoundBuffer.id();
daniel@transgaming.come0078962010-04-15 20:45:08 +00004331 break;
4332 case GL_CURRENT_VERTEX_ATTRIB:
4333 for (int i = 0; i < 4; ++i)
4334 {
shannon.woods%transgaming.com@gtempaccount.com3026dc72013-04-13 03:37:27 +00004335 float currentValue = attribState.mCurrentValue.FloatValues[i];
daniel@transgaming.come0078962010-04-15 20:45:08 +00004336 params[i] = (GLint)(currentValue > 0.0f ? floor(currentValue + 0.5f) : ceil(currentValue - 0.5f));
4337 }
4338 break;
shannon.woods%transgaming.com@gtempaccount.com14eb55e2013-04-13 03:35:06 +00004339 case GL_VERTEX_ATTRIB_ARRAY_DIVISOR:
4340 // Don't verify ES3 context because GL_VERTEX_ATTRIB_ARRAY_DIVISOR_ANGLE uses
4341 // the same constant.
4342 META_ASSERT(GL_VERTEX_ATTRIB_ARRAY_DIVISOR == GL_VERTEX_ATTRIB_ARRAY_DIVISOR_ANGLE);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00004343 *params = (GLint)attribState.mDivisor;
4344 break;
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004345 default: return gl::error(GL_INVALID_ENUM);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004346 }
4347 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004348 }
4349 catch(std::bad_alloc&)
4350 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004351 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004352 }
4353}
4354
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00004355void __stdcall glGetVertexAttribPointerv(GLuint index, GLenum pname, GLvoid** pointer)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004356{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004357 EVENT("(GLuint index = %d, GLenum pname = 0x%X, GLvoid** pointer = 0x%0.8p)", index, pname, pointer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004358
4359 try
4360 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004361 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004362
daniel@transgaming.come0078962010-04-15 20:45:08 +00004363 if (context)
4364 {
4365 if (index >= gl::MAX_VERTEX_ATTRIBS)
4366 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004367 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004368 }
4369
4370 if (pname != GL_VERTEX_ATTRIB_ARRAY_POINTER)
4371 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004372 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004373 }
4374
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004375 *pointer = const_cast<GLvoid*>(context->getVertexAttribPointer(index));
daniel@transgaming.come0078962010-04-15 20:45:08 +00004376 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004377 }
4378 catch(std::bad_alloc&)
4379 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004380 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004381 }
4382}
4383
4384void __stdcall glHint(GLenum target, GLenum mode)
4385{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004386 EVENT("(GLenum target = 0x%X, GLenum mode = 0x%X)", target, mode);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004387
4388 try
4389 {
alokp@chromium.orgd303ef92010-09-09 17:30:15 +00004390 switch (mode)
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00004391 {
alokp@chromium.orgd303ef92010-09-09 17:30:15 +00004392 case GL_FASTEST:
4393 case GL_NICEST:
4394 case GL_DONT_CARE:
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00004395 break;
4396 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004397 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00004398 }
4399
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004400 gl::Context *context = gl::getNonLostContext();
alokp@chromium.orgd303ef92010-09-09 17:30:15 +00004401 switch (target)
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00004402 {
alokp@chromium.orgd303ef92010-09-09 17:30:15 +00004403 case GL_GENERATE_MIPMAP_HINT:
4404 if (context) context->setGenerateMipmapHint(mode);
4405 break;
4406 case GL_FRAGMENT_SHADER_DERIVATIVE_HINT_OES:
4407 if (context) context->setFragmentShaderDerivativeHint(mode);
4408 break;
4409 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004410 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00004411 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004412 }
4413 catch(std::bad_alloc&)
4414 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004415 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004416 }
4417}
4418
4419GLboolean __stdcall glIsBuffer(GLuint buffer)
4420{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004421 EVENT("(GLuint buffer = %d)", buffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004422
4423 try
4424 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004425 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004426
4427 if (context && buffer)
4428 {
4429 gl::Buffer *bufferObject = context->getBuffer(buffer);
4430
4431 if (bufferObject)
4432 {
4433 return GL_TRUE;
4434 }
4435 }
4436 }
4437 catch(std::bad_alloc&)
4438 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004439 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004440 }
4441
4442 return GL_FALSE;
4443}
4444
4445GLboolean __stdcall glIsEnabled(GLenum cap)
4446{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004447 EVENT("(GLenum cap = 0x%X)", cap);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004448
4449 try
4450 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004451 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004452
4453 if (context)
4454 {
4455 switch (cap)
4456 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004457 case GL_CULL_FACE: return context->isCullFaceEnabled();
4458 case GL_POLYGON_OFFSET_FILL: return context->isPolygonOffsetFillEnabled();
4459 case GL_SAMPLE_ALPHA_TO_COVERAGE: return context->isSampleAlphaToCoverageEnabled();
4460 case GL_SAMPLE_COVERAGE: return context->isSampleCoverageEnabled();
4461 case GL_SCISSOR_TEST: return context->isScissorTestEnabled();
4462 case GL_STENCIL_TEST: return context->isStencilTestEnabled();
4463 case GL_DEPTH_TEST: return context->isDepthTestEnabled();
4464 case GL_BLEND: return context->isBlendEnabled();
4465 case GL_DITHER: return context->isDitherEnabled();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004466 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004467 return gl::error(GL_INVALID_ENUM, false);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004468 }
4469 }
4470 }
4471 catch(std::bad_alloc&)
4472 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004473 return gl::error(GL_OUT_OF_MEMORY, false);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004474 }
4475
4476 return false;
4477}
4478
daniel@transgaming.comfe208882010-09-01 15:47:57 +00004479GLboolean __stdcall glIsFenceNV(GLuint fence)
4480{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004481 EVENT("(GLuint fence = %d)", fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004482
4483 try
4484 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004485 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004486
4487 if (context)
4488 {
4489 gl::Fence *fenceObject = context->getFence(fence);
4490
4491 if (fenceObject == NULL)
4492 {
4493 return GL_FALSE;
4494 }
4495
4496 return fenceObject->isFence();
4497 }
4498 }
4499 catch(std::bad_alloc&)
4500 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004501 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004502 }
4503
4504 return GL_FALSE;
daniel@transgaming.comfe208882010-09-01 15:47:57 +00004505}
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004506
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004507GLboolean __stdcall glIsFramebuffer(GLuint framebuffer)
4508{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004509 EVENT("(GLuint framebuffer = %d)", framebuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004510
4511 try
4512 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004513 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004514
4515 if (context && framebuffer)
4516 {
4517 gl::Framebuffer *framebufferObject = context->getFramebuffer(framebuffer);
4518
4519 if (framebufferObject)
4520 {
4521 return GL_TRUE;
4522 }
4523 }
4524 }
4525 catch(std::bad_alloc&)
4526 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004527 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004528 }
4529
4530 return GL_FALSE;
4531}
4532
4533GLboolean __stdcall glIsProgram(GLuint program)
4534{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004535 EVENT("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004536
4537 try
4538 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004539 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004540
4541 if (context && program)
4542 {
4543 gl::Program *programObject = context->getProgram(program);
4544
4545 if (programObject)
4546 {
4547 return GL_TRUE;
4548 }
4549 }
4550 }
4551 catch(std::bad_alloc&)
4552 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004553 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004554 }
4555
4556 return GL_FALSE;
4557}
4558
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00004559GLboolean __stdcall glIsQueryEXT(GLuint id)
4560{
4561 EVENT("(GLuint id = %d)", id);
4562
4563 try
4564 {
4565 if (id == 0)
4566 {
4567 return GL_FALSE;
4568 }
4569
4570 gl::Context *context = gl::getNonLostContext();
4571
4572 if (context)
4573 {
4574 gl::Query *queryObject = context->getQuery(id, false, GL_NONE);
4575
4576 if (queryObject)
4577 {
4578 return GL_TRUE;
4579 }
4580 }
4581 }
4582 catch(std::bad_alloc&)
4583 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004584 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00004585 }
4586
4587 return GL_FALSE;
4588}
4589
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004590GLboolean __stdcall glIsRenderbuffer(GLuint renderbuffer)
4591{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004592 EVENT("(GLuint renderbuffer = %d)", renderbuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004593
4594 try
4595 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004596 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004597
4598 if (context && renderbuffer)
4599 {
4600 gl::Renderbuffer *renderbufferObject = context->getRenderbuffer(renderbuffer);
4601
4602 if (renderbufferObject)
4603 {
4604 return GL_TRUE;
4605 }
4606 }
4607 }
4608 catch(std::bad_alloc&)
4609 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004610 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004611 }
4612
4613 return GL_FALSE;
4614}
4615
4616GLboolean __stdcall glIsShader(GLuint shader)
4617{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004618 EVENT("(GLuint shader = %d)", shader);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004619
4620 try
4621 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004622 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004623
4624 if (context && shader)
4625 {
4626 gl::Shader *shaderObject = context->getShader(shader);
4627
4628 if (shaderObject)
4629 {
4630 return GL_TRUE;
4631 }
4632 }
4633 }
4634 catch(std::bad_alloc&)
4635 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004636 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004637 }
4638
4639 return GL_FALSE;
4640}
4641
4642GLboolean __stdcall glIsTexture(GLuint texture)
4643{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004644 EVENT("(GLuint texture = %d)", texture);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004645
4646 try
4647 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004648 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004649
4650 if (context && texture)
4651 {
4652 gl::Texture *textureObject = context->getTexture(texture);
4653
4654 if (textureObject)
4655 {
4656 return GL_TRUE;
4657 }
4658 }
4659 }
4660 catch(std::bad_alloc&)
4661 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004662 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004663 }
4664
4665 return GL_FALSE;
4666}
4667
4668void __stdcall glLineWidth(GLfloat width)
4669{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004670 EVENT("(GLfloat width = %f)", width);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004671
4672 try
4673 {
4674 if (width <= 0.0f)
4675 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004676 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004677 }
4678
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004679 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com32e58cd2010-03-24 09:44:10 +00004680
4681 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004682 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004683 context->setLineWidth(width);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004684 }
4685 }
4686 catch(std::bad_alloc&)
4687 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004688 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004689 }
4690}
4691
4692void __stdcall glLinkProgram(GLuint program)
4693{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004694 EVENT("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004695
4696 try
4697 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004698 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004699
4700 if (context)
4701 {
4702 gl::Program *programObject = context->getProgram(program);
4703
4704 if (!programObject)
4705 {
daniel@transgaming.com277b7142010-04-13 03:26:44 +00004706 if (context->getShader(program))
4707 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004708 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com277b7142010-04-13 03:26:44 +00004709 }
4710 else
4711 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004712 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com277b7142010-04-13 03:26:44 +00004713 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004714 }
4715
daniel@transgaming.com95d29422012-07-24 18:36:10 +00004716 context->linkProgram(program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004717 }
4718 }
4719 catch(std::bad_alloc&)
4720 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004721 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004722 }
4723}
4724
4725void __stdcall glPixelStorei(GLenum pname, GLint param)
4726{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004727 EVENT("(GLenum pname = 0x%X, GLint param = %d)", pname, param);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004728
4729 try
4730 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004731 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004732
4733 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004734 {
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004735 switch (pname)
4736 {
4737 case GL_UNPACK_ALIGNMENT:
4738 if (param != 1 && param != 2 && param != 4 && param != 8)
4739 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004740 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004741 }
4742
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004743 context->setUnpackAlignment(param);
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004744 break;
4745
4746 case GL_PACK_ALIGNMENT:
4747 if (param != 1 && param != 2 && param != 4 && param != 8)
4748 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004749 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004750 }
4751
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004752 context->setPackAlignment(param);
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004753 break;
4754
bsalomon@google.com56d46ab2011-11-23 14:53:10 +00004755 case GL_PACK_REVERSE_ROW_ORDER_ANGLE:
4756 context->setPackReverseRowOrder(param != 0);
4757 break;
4758
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004759 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004760 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004761 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004762 }
4763 }
4764 catch(std::bad_alloc&)
4765 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004766 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004767 }
4768}
4769
4770void __stdcall glPolygonOffset(GLfloat factor, GLfloat units)
4771{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004772 EVENT("(GLfloat factor = %f, GLfloat units = %f)", factor, units);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004773
4774 try
4775 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004776 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comaede6302010-04-29 03:35:48 +00004777
4778 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004779 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004780 context->setPolygonOffsetParams(factor, units);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004781 }
4782 }
4783 catch(std::bad_alloc&)
4784 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004785 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004786 }
4787}
4788
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00004789void __stdcall glReadnPixelsEXT(GLint x, GLint y, GLsizei width, GLsizei height,
4790 GLenum format, GLenum type, GLsizei bufSize,
4791 GLvoid *data)
4792{
4793 EVENT("(GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d, "
4794 "GLenum format = 0x%X, GLenum type = 0x%X, GLsizei bufSize = 0x%d, GLvoid *data = 0x%0.8p)",
4795 x, y, width, height, format, type, bufSize, data);
4796
4797 try
4798 {
4799 if (width < 0 || height < 0 || bufSize < 0)
4800 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004801 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00004802 }
4803
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00004804 gl::Context *context = gl::getNonLostContext();
4805
4806 if (context)
4807 {
daniel@transgaming.com42944b02012-09-27 17:45:57 +00004808 GLenum currentFormat, currentType;
4809
4810 // Failure in getCurrentReadFormatType indicates that no color attachment is currently bound,
4811 // and attempting to read back if that's the case is an error. The error will be registered
4812 // by getCurrentReadFormat.
4813 if (!context->getCurrentReadFormatType(&currentFormat, &currentType))
4814 return;
4815
4816 if (!(currentFormat == format && currentType == type) && !validReadFormatType(format, type))
4817 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004818 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com42944b02012-09-27 17:45:57 +00004819 }
4820
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00004821 context->readPixels(x, y, width, height, format, type, &bufSize, data);
4822 }
4823 }
4824 catch(std::bad_alloc&)
4825 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004826 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00004827 }
4828}
4829
4830void __stdcall glReadPixels(GLint x, GLint y, GLsizei width, GLsizei height,
4831 GLenum format, GLenum type, GLvoid* pixels)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004832{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004833 EVENT("(GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00004834 "GLenum format = 0x%X, GLenum type = 0x%X, GLvoid* pixels = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00004835 x, y, width, height, format, type, pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004836
4837 try
4838 {
4839 if (width < 0 || height < 0)
4840 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004841 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004842 }
4843
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004844 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004845
4846 if (context)
4847 {
daniel@transgaming.com42944b02012-09-27 17:45:57 +00004848 GLenum currentFormat, currentType;
4849
4850 // Failure in getCurrentReadFormatType indicates that no color attachment is currently bound,
4851 // and attempting to read back if that's the case is an error. The error will be registered
4852 // by getCurrentReadFormat.
4853 if (!context->getCurrentReadFormatType(&currentFormat, &currentType))
4854 return;
4855
4856 if (!(currentFormat == format && currentType == type) && !validReadFormatType(format, type))
4857 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004858 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com42944b02012-09-27 17:45:57 +00004859 }
4860
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00004861 context->readPixels(x, y, width, height, format, type, NULL, pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004862 }
4863 }
4864 catch(std::bad_alloc&)
4865 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004866 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004867 }
4868}
4869
4870void __stdcall glReleaseShaderCompiler(void)
4871{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004872 EVENT("()");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004873
4874 try
4875 {
4876 gl::Shader::releaseCompiler();
4877 }
4878 catch(std::bad_alloc&)
4879 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004880 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004881 }
4882}
4883
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00004884void __stdcall glRenderbufferStorageMultisampleANGLE(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004885{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004886 EVENT("(GLenum target = 0x%X, GLsizei samples = %d, GLenum internalformat = 0x%X, GLsizei width = %d, GLsizei height = %d)",
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00004887 target, samples, internalformat, width, height);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004888
4889 try
4890 {
4891 switch (target)
4892 {
4893 case GL_RENDERBUFFER:
4894 break;
4895 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004896 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004897 }
4898
daniel@transgaming.comedc19182010-10-15 17:57:55 +00004899 if (!gl::IsColorRenderable(internalformat) && !gl::IsDepthRenderable(internalformat) && !gl::IsStencilRenderable(internalformat))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004900 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004901 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004902 }
4903
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00004904 if (width < 0 || height < 0 || samples < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004905 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004906 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004907 }
4908
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004909 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004910
4911 if (context)
4912 {
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00004913 if (width > context->getMaximumRenderbufferDimension() ||
4914 height > context->getMaximumRenderbufferDimension() ||
4915 samples > context->getMaxSupportedSamples())
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00004916 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004917 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00004918 }
4919
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +00004920 GLuint handle = context->getRenderbufferHandle();
4921 if (handle == 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004922 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004923 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004924 }
4925
4926 switch (internalformat)
4927 {
4928 case GL_DEPTH_COMPONENT16:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004929 case GL_RGBA4:
4930 case GL_RGB5_A1:
4931 case GL_RGB565:
daniel@transgaming.com63977542010-08-24 19:21:02 +00004932 case GL_RGB8_OES:
4933 case GL_RGBA8_OES:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004934 case GL_STENCIL_INDEX8:
daniel@transgaming.comcdacc8e2010-07-28 19:20:50 +00004935 case GL_DEPTH24_STENCIL8_OES:
daniel@transgaming.com70062c92012-11-28 19:32:30 +00004936 context->setRenderbufferStorage(width, height, internalformat, samples);
daniel@transgaming.comcdacc8e2010-07-28 19:20:50 +00004937 break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004938 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004939 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004940 }
4941 }
4942 }
4943 catch(std::bad_alloc&)
4944 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004945 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004946 }
4947}
4948
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00004949void __stdcall glRenderbufferStorage(GLenum target, GLenum internalformat, GLsizei width, GLsizei height)
4950{
4951 glRenderbufferStorageMultisampleANGLE(target, 0, internalformat, width, height);
4952}
4953
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004954void __stdcall glSampleCoverage(GLclampf value, GLboolean invert)
4955{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00004956 EVENT("(GLclampf value = %f, GLboolean invert = %u)", value, invert);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004957
4958 try
4959 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004960 gl::Context* context = gl::getNonLostContext();
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00004961
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004962 if (context)
4963 {
daniel@transgaming.coma36f98e2010-05-18 18:51:09 +00004964 context->setSampleCoverageParams(gl::clamp01(value), invert == GL_TRUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004965 }
4966 }
4967 catch(std::bad_alloc&)
4968 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004969 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004970 }
4971}
4972
daniel@transgaming.comfe208882010-09-01 15:47:57 +00004973void __stdcall glSetFenceNV(GLuint fence, GLenum condition)
4974{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004975 EVENT("(GLuint fence = %d, GLenum condition = 0x%X)", fence, condition);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004976
4977 try
4978 {
4979 if (condition != GL_ALL_COMPLETED_NV)
4980 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004981 return gl::error(GL_INVALID_ENUM);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004982 }
4983
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004984 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004985
4986 if (context)
4987 {
4988 gl::Fence *fenceObject = context->getFence(fence);
4989
4990 if (fenceObject == NULL)
4991 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004992 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004993 }
4994
4995 fenceObject->setFence(condition);
4996 }
4997 }
4998 catch(std::bad_alloc&)
4999 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005000 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005001 }
daniel@transgaming.comfe208882010-09-01 15:47:57 +00005002}
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005003
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005004void __stdcall glScissor(GLint x, GLint y, GLsizei width, GLsizei height)
5005{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005006 EVENT("(GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d)", x, y, width, height);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005007
5008 try
5009 {
5010 if (width < 0 || height < 0)
5011 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005012 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005013 }
5014
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005015 gl::Context* context = gl::getNonLostContext();
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00005016
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005017 if (context)
5018 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00005019 context->setScissorParams(x, y, width, height);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005020 }
5021 }
5022 catch(std::bad_alloc&)
5023 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005024 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005025 }
5026}
5027
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00005028void __stdcall glShaderBinary(GLsizei n, const GLuint* shaders, GLenum binaryformat, const GLvoid* binary, GLsizei length)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005029{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005030 EVENT("(GLsizei n = %d, const GLuint* shaders = 0x%0.8p, GLenum binaryformat = 0x%X, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00005031 "const GLvoid* binary = 0x%0.8p, GLsizei length = %d)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00005032 n, shaders, binaryformat, binary, length);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005033
5034 try
5035 {
daniel@transgaming.comd1f667f2010-04-29 03:38:52 +00005036 // No binary shader formats are supported.
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005037 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005038 }
5039 catch(std::bad_alloc&)
5040 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005041 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005042 }
5043}
5044
shannon.woods%transgaming.com@gtempaccount.com5f339332013-04-13 03:29:02 +00005045void __stdcall glShaderSource(GLuint shader, GLsizei count, const GLchar* const* string, const GLint* length)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005046{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005047 EVENT("(GLuint shader = %d, GLsizei count = %d, const GLchar** string = 0x%0.8p, const GLint* length = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00005048 shader, count, string, length);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005049
5050 try
5051 {
daniel@transgaming.com8e6a6be2010-04-13 03:26:41 +00005052 if (count < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005053 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005054 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005055 }
5056
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005057 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005058
5059 if (context)
5060 {
5061 gl::Shader *shaderObject = context->getShader(shader);
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00005062
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005063 if (!shaderObject)
5064 {
daniel@transgaming.com8e6a6be2010-04-13 03:26:41 +00005065 if (context->getProgram(shader))
5066 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005067 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com8e6a6be2010-04-13 03:26:41 +00005068 }
5069 else
5070 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005071 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com8e6a6be2010-04-13 03:26:41 +00005072 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005073 }
5074
5075 shaderObject->setSource(count, string, length);
5076 }
5077 }
5078 catch(std::bad_alloc&)
5079 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005080 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005081 }
5082}
5083
5084void __stdcall glStencilFunc(GLenum func, GLint ref, GLuint mask)
5085{
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00005086 glStencilFuncSeparate(GL_FRONT_AND_BACK, func, ref, mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005087}
5088
5089void __stdcall glStencilFuncSeparate(GLenum face, GLenum func, GLint ref, GLuint mask)
5090{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005091 EVENT("(GLenum face = 0x%X, GLenum func = 0x%X, GLint ref = %d, GLuint mask = %d)", face, func, ref, mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005092
5093 try
5094 {
5095 switch (face)
5096 {
5097 case GL_FRONT:
5098 case GL_BACK:
5099 case GL_FRONT_AND_BACK:
5100 break;
5101 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005102 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005103 }
5104
5105 switch (func)
5106 {
5107 case GL_NEVER:
5108 case GL_ALWAYS:
5109 case GL_LESS:
5110 case GL_LEQUAL:
5111 case GL_EQUAL:
5112 case GL_GEQUAL:
5113 case GL_GREATER:
5114 case GL_NOTEQUAL:
5115 break;
5116 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005117 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005118 }
5119
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005120 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005121
5122 if (context)
5123 {
5124 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
5125 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00005126 context->setStencilParams(func, ref, mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005127 }
5128
5129 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
5130 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00005131 context->setStencilBackParams(func, ref, mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005132 }
5133 }
5134 }
5135 catch(std::bad_alloc&)
5136 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005137 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005138 }
5139}
5140
5141void __stdcall glStencilMask(GLuint mask)
5142{
5143 glStencilMaskSeparate(GL_FRONT_AND_BACK, mask);
5144}
5145
5146void __stdcall glStencilMaskSeparate(GLenum face, GLuint mask)
5147{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005148 EVENT("(GLenum face = 0x%X, GLuint mask = %d)", face, mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005149
5150 try
5151 {
5152 switch (face)
5153 {
5154 case GL_FRONT:
5155 case GL_BACK:
5156 case GL_FRONT_AND_BACK:
5157 break;
5158 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005159 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005160 }
5161
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005162 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005163
5164 if (context)
5165 {
5166 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
5167 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00005168 context->setStencilWritemask(mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005169 }
5170
5171 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
5172 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00005173 context->setStencilBackWritemask(mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005174 }
5175 }
5176 }
5177 catch(std::bad_alloc&)
5178 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005179 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005180 }
5181}
5182
5183void __stdcall glStencilOp(GLenum fail, GLenum zfail, GLenum zpass)
5184{
5185 glStencilOpSeparate(GL_FRONT_AND_BACK, fail, zfail, zpass);
5186}
5187
5188void __stdcall glStencilOpSeparate(GLenum face, GLenum fail, GLenum zfail, GLenum zpass)
5189{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005190 EVENT("(GLenum face = 0x%X, GLenum fail = 0x%X, GLenum zfail = 0x%X, GLenum zpas = 0x%Xs)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00005191 face, fail, zfail, zpass);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005192
5193 try
5194 {
5195 switch (face)
5196 {
5197 case GL_FRONT:
5198 case GL_BACK:
5199 case GL_FRONT_AND_BACK:
5200 break;
5201 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005202 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005203 }
5204
5205 switch (fail)
5206 {
5207 case GL_ZERO:
5208 case GL_KEEP:
5209 case GL_REPLACE:
5210 case GL_INCR:
5211 case GL_DECR:
5212 case GL_INVERT:
5213 case GL_INCR_WRAP:
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00005214 case GL_DECR_WRAP:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005215 break;
5216 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005217 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005218 }
5219
5220 switch (zfail)
5221 {
5222 case GL_ZERO:
5223 case GL_KEEP:
5224 case GL_REPLACE:
5225 case GL_INCR:
5226 case GL_DECR:
5227 case GL_INVERT:
5228 case GL_INCR_WRAP:
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00005229 case GL_DECR_WRAP:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005230 break;
5231 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005232 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005233 }
5234
5235 switch (zpass)
5236 {
5237 case GL_ZERO:
5238 case GL_KEEP:
5239 case GL_REPLACE:
5240 case GL_INCR:
5241 case GL_DECR:
5242 case GL_INVERT:
5243 case GL_INCR_WRAP:
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00005244 case GL_DECR_WRAP:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005245 break;
5246 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005247 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005248 }
5249
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005250 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005251
5252 if (context)
5253 {
5254 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
5255 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00005256 context->setStencilOperations(fail, zfail, zpass);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005257 }
5258
5259 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
5260 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00005261 context->setStencilBackOperations(fail, zfail, zpass);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005262 }
5263 }
5264 }
5265 catch(std::bad_alloc&)
5266 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005267 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005268 }
5269}
5270
daniel@transgaming.comfe208882010-09-01 15:47:57 +00005271GLboolean __stdcall glTestFenceNV(GLuint fence)
5272{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005273 EVENT("(GLuint fence = %d)", fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005274
5275 try
5276 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005277 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005278
5279 if (context)
5280 {
5281 gl::Fence *fenceObject = context->getFence(fence);
5282
5283 if (fenceObject == NULL)
5284 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005285 return gl::error(GL_INVALID_OPERATION, GL_TRUE);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005286 }
5287
5288 return fenceObject->testFence();
5289 }
5290 }
5291 catch(std::bad_alloc&)
5292 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005293 gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005294 }
5295
5296 return GL_TRUE;
daniel@transgaming.comfe208882010-09-01 15:47:57 +00005297}
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005298
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00005299void __stdcall glTexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height,
5300 GLint border, GLenum format, GLenum type, const GLvoid* pixels)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005301{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005302 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint internalformat = %d, GLsizei width = %d, GLsizei height = %d, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00005303 "GLint border = %d, GLenum format = 0x%X, GLenum type = 0x%X, const GLvoid* pixels = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00005304 target, level, internalformat, width, height, border, format, type, pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005305
5306 try
5307 {
daniel@transgaming.com4f9ef0d2011-05-30 23:51:19 +00005308 if (!validImageSize(level, width, height))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005309 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005310 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005311 }
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00005312
apatrick@chromium.orge057c5d2012-01-26 19:18:24 +00005313 if (internalformat != GLint(format))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005314 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005315 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005316 }
5317
daniel@transgaming.com6377e362012-06-05 19:49:55 +00005318 // validate <type> by itself (used as secondary key below)
5319 switch (type)
5320 {
5321 case GL_UNSIGNED_BYTE:
5322 case GL_UNSIGNED_SHORT_5_6_5:
5323 case GL_UNSIGNED_SHORT_4_4_4_4:
5324 case GL_UNSIGNED_SHORT_5_5_5_1:
5325 case GL_UNSIGNED_SHORT:
5326 case GL_UNSIGNED_INT:
5327 case GL_UNSIGNED_INT_24_8_OES:
5328 case GL_HALF_FLOAT_OES:
5329 case GL_FLOAT:
5330 break;
5331 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005332 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com6377e362012-06-05 19:49:55 +00005333 }
5334
5335 // validate <format> + <type> combinations
5336 // - invalid <format> -> sets INVALID_ENUM
5337 // - invalid <format>+<type> combination -> sets INVALID_OPERATION
daniel@transgaming.com8a0a2db2011-03-21 16:38:20 +00005338 switch (format)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005339 {
5340 case GL_ALPHA:
5341 case GL_LUMINANCE:
5342 case GL_LUMINANCE_ALPHA:
5343 switch (type)
5344 {
5345 case GL_UNSIGNED_BYTE:
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00005346 case GL_FLOAT:
5347 case GL_HALF_FLOAT_OES:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005348 break;
5349 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005350 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005351 }
5352 break;
5353 case GL_RGB:
5354 switch (type)
5355 {
5356 case GL_UNSIGNED_BYTE:
5357 case GL_UNSIGNED_SHORT_5_6_5:
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00005358 case GL_FLOAT:
5359 case GL_HALF_FLOAT_OES:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005360 break;
5361 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005362 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005363 }
5364 break;
5365 case GL_RGBA:
5366 switch (type)
5367 {
5368 case GL_UNSIGNED_BYTE:
5369 case GL_UNSIGNED_SHORT_4_4_4_4:
5370 case GL_UNSIGNED_SHORT_5_5_5_1:
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00005371 case GL_FLOAT:
5372 case GL_HALF_FLOAT_OES:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005373 break;
5374 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005375 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005376 }
5377 break;
daniel@transgaming.coma9198d92010-08-08 04:49:56 +00005378 case GL_BGRA_EXT:
5379 switch (type)
5380 {
5381 case GL_UNSIGNED_BYTE:
5382 break;
5383 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005384 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.coma9198d92010-08-08 04:49:56 +00005385 }
5386 break;
daniel@transgaming.com01868132010-08-24 19:21:17 +00005387 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT: // error cases for compressed textures are handled below
5388 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
gman@chromium.org50c526d2011-08-10 05:19:44 +00005389 case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
5390 case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
daniel@transgaming.com01868132010-08-24 19:21:17 +00005391 break;
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00005392 case GL_DEPTH_COMPONENT:
5393 switch (type)
5394 {
5395 case GL_UNSIGNED_SHORT:
5396 case GL_UNSIGNED_INT:
5397 break;
5398 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005399 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00005400 }
5401 break;
5402 case GL_DEPTH_STENCIL_OES:
5403 switch (type)
5404 {
5405 case GL_UNSIGNED_INT_24_8_OES:
5406 break;
5407 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005408 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00005409 }
5410 break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005411 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005412 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005413 }
5414
5415 if (border != 0)
5416 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005417 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005418 }
5419
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005420 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005421
5422 if (context)
5423 {
daniel@transgaming.com32b11442011-11-19 02:42:48 +00005424 if (level > context->getMaximumTextureLevel())
5425 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005426 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com32b11442011-11-19 02:42:48 +00005427 }
5428
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00005429 switch (target)
5430 {
5431 case GL_TEXTURE_2D:
5432 if (width > (context->getMaximumTextureDimension() >> level) ||
5433 height > (context->getMaximumTextureDimension() >> level))
5434 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005435 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00005436 }
5437 break;
5438 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
5439 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
5440 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
5441 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
5442 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
5443 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
5444 if (width != height)
5445 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005446 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00005447 }
5448
5449 if (width > (context->getMaximumCubeTextureDimension() >> level) ||
5450 height > (context->getMaximumCubeTextureDimension() >> level))
5451 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005452 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00005453 }
5454 break;
5455 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005456 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00005457 }
5458
gman@chromium.org50c526d2011-08-10 05:19:44 +00005459 switch (format) {
5460 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
5461 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
5462 if (context->supportsDXT1Textures())
daniel@transgaming.com01868132010-08-24 19:21:17 +00005463 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005464 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com01868132010-08-24 19:21:17 +00005465 }
5466 else
5467 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005468 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com01868132010-08-24 19:21:17 +00005469 }
gman@chromium.org50c526d2011-08-10 05:19:44 +00005470 break;
5471 case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
5472 if (context->supportsDXT3Textures())
5473 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005474 return gl::error(GL_INVALID_OPERATION);
gman@chromium.org50c526d2011-08-10 05:19:44 +00005475 }
5476 else
5477 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005478 return gl::error(GL_INVALID_ENUM);
gman@chromium.org50c526d2011-08-10 05:19:44 +00005479 }
5480 break;
5481 case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
5482 if (context->supportsDXT5Textures())
5483 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005484 return gl::error(GL_INVALID_OPERATION);
gman@chromium.org50c526d2011-08-10 05:19:44 +00005485 }
5486 else
5487 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005488 return gl::error(GL_INVALID_ENUM);
gman@chromium.org50c526d2011-08-10 05:19:44 +00005489 }
5490 break;
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00005491 case GL_DEPTH_COMPONENT:
5492 case GL_DEPTH_STENCIL_OES:
5493 if (!context->supportsDepthTextures())
5494 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005495 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00005496 }
daniel@transgaming.com0c854682012-05-31 01:14:11 +00005497 if (target != GL_TEXTURE_2D)
5498 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005499 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com0c854682012-05-31 01:14:11 +00005500 }
daniel@transgaming.com797924b2012-06-05 19:50:01 +00005501 // OES_depth_texture supports loading depth data and multiple levels,
5502 // but ANGLE_depth_texture does not
5503 if (pixels != NULL || level != 0)
daniel@transgaming.com0c854682012-05-31 01:14:11 +00005504 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005505 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com0c854682012-05-31 01:14:11 +00005506 }
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00005507 break;
gman@chromium.org50c526d2011-08-10 05:19:44 +00005508 default:
5509 break;
daniel@transgaming.com01868132010-08-24 19:21:17 +00005510 }
5511
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00005512 if (type == GL_FLOAT)
5513 {
daniel@transgaming.combbeffbb2011-11-09 17:46:11 +00005514 if (!context->supportsFloat32Textures())
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00005515 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005516 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00005517 }
5518 }
5519 else if (type == GL_HALF_FLOAT_OES)
5520 {
daniel@transgaming.combbeffbb2011-11-09 17:46:11 +00005521 if (!context->supportsFloat16Textures())
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00005522 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005523 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00005524 }
5525 }
5526
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005527 if (target == GL_TEXTURE_2D)
5528 {
5529 gl::Texture2D *texture = context->getTexture2D();
5530
5531 if (!texture)
5532 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005533 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005534 }
5535
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005536 if (texture->isImmutable())
5537 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005538 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005539 }
5540
daniel@transgaming.com8a0a2db2011-03-21 16:38:20 +00005541 texture->setImage(level, width, height, format, type, context->getUnpackAlignment(), pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005542 }
5543 else
5544 {
5545 gl::TextureCubeMap *texture = context->getTextureCubeMap();
5546
5547 if (!texture)
5548 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005549 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005550 }
5551
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005552 if (texture->isImmutable())
5553 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005554 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005555 }
5556
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005557 switch (target)
5558 {
5559 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
daniel@transgaming.com8a0a2db2011-03-21 16:38:20 +00005560 texture->setImagePosX(level, width, height, format, type, context->getUnpackAlignment(), pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005561 break;
5562 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
daniel@transgaming.com8a0a2db2011-03-21 16:38:20 +00005563 texture->setImageNegX(level, width, height, format, type, context->getUnpackAlignment(), pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005564 break;
5565 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
daniel@transgaming.com8a0a2db2011-03-21 16:38:20 +00005566 texture->setImagePosY(level, width, height, format, type, context->getUnpackAlignment(), pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005567 break;
5568 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
daniel@transgaming.com8a0a2db2011-03-21 16:38:20 +00005569 texture->setImageNegY(level, width, height, format, type, context->getUnpackAlignment(), pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005570 break;
5571 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
daniel@transgaming.com8a0a2db2011-03-21 16:38:20 +00005572 texture->setImagePosZ(level, width, height, format, type, context->getUnpackAlignment(), pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005573 break;
5574 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
daniel@transgaming.com8a0a2db2011-03-21 16:38:20 +00005575 texture->setImageNegZ(level, width, height, format, type, context->getUnpackAlignment(), pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005576 break;
5577 default: UNREACHABLE();
5578 }
5579 }
5580 }
5581 }
5582 catch(std::bad_alloc&)
5583 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005584 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005585 }
5586}
5587
5588void __stdcall glTexParameterf(GLenum target, GLenum pname, GLfloat param)
5589{
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005590 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLint param = %f)", target, pname, param);
5591
5592 try
5593 {
5594 gl::Context *context = gl::getNonLostContext();
5595
5596 if (context)
5597 {
5598 gl::Texture *texture;
5599
5600 switch (target)
5601 {
5602 case GL_TEXTURE_2D:
5603 texture = context->getTexture2D();
5604 break;
5605 case GL_TEXTURE_CUBE_MAP:
5606 texture = context->getTextureCubeMap();
5607 break;
5608 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005609 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005610 }
5611
5612 switch (pname)
5613 {
5614 case GL_TEXTURE_WRAP_S:
5615 if (!texture->setWrapS((GLenum)param))
5616 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005617 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005618 }
5619 break;
5620 case GL_TEXTURE_WRAP_T:
5621 if (!texture->setWrapT((GLenum)param))
5622 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005623 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005624 }
5625 break;
5626 case GL_TEXTURE_MIN_FILTER:
5627 if (!texture->setMinFilter((GLenum)param))
5628 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005629 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005630 }
5631 break;
5632 case GL_TEXTURE_MAG_FILTER:
5633 if (!texture->setMagFilter((GLenum)param))
5634 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005635 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005636 }
5637 break;
5638 case GL_TEXTURE_USAGE_ANGLE:
5639 if (!texture->setUsage((GLenum)param))
5640 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005641 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005642 }
5643 break;
5644 case GL_TEXTURE_MAX_ANISOTROPY_EXT:
5645 if (!context->supportsTextureFilterAnisotropy())
5646 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005647 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005648 }
5649 if (!texture->setMaxAnisotropy((float)param, context->getTextureMaxAnisotropy()))
5650 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005651 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005652 }
5653 break;
5654 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005655 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005656 }
5657 }
5658 }
5659 catch(std::bad_alloc&)
5660 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005661 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005662 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005663}
5664
5665void __stdcall glTexParameterfv(GLenum target, GLenum pname, const GLfloat* params)
5666{
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005667 glTexParameterf(target, pname, (GLfloat)*params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005668}
5669
5670void __stdcall glTexParameteri(GLenum target, GLenum pname, GLint param)
5671{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005672 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLint param = %d)", target, pname, param);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005673
5674 try
5675 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005676 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005677
5678 if (context)
5679 {
5680 gl::Texture *texture;
5681
5682 switch (target)
5683 {
5684 case GL_TEXTURE_2D:
5685 texture = context->getTexture2D();
5686 break;
5687 case GL_TEXTURE_CUBE_MAP:
5688 texture = context->getTextureCubeMap();
5689 break;
5690 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005691 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005692 }
5693
5694 switch (pname)
5695 {
5696 case GL_TEXTURE_WRAP_S:
5697 if (!texture->setWrapS((GLenum)param))
5698 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005699 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005700 }
5701 break;
5702 case GL_TEXTURE_WRAP_T:
5703 if (!texture->setWrapT((GLenum)param))
5704 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005705 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005706 }
5707 break;
5708 case GL_TEXTURE_MIN_FILTER:
5709 if (!texture->setMinFilter((GLenum)param))
5710 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005711 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005712 }
5713 break;
5714 case GL_TEXTURE_MAG_FILTER:
5715 if (!texture->setMagFilter((GLenum)param))
5716 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005717 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005718 }
5719 break;
daniel@transgaming.com7d18c172011-11-11 04:18:21 +00005720 case GL_TEXTURE_USAGE_ANGLE:
5721 if (!texture->setUsage((GLenum)param))
5722 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005723 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com7d18c172011-11-11 04:18:21 +00005724 }
5725 break;
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005726 case GL_TEXTURE_MAX_ANISOTROPY_EXT:
5727 if (!context->supportsTextureFilterAnisotropy())
5728 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005729 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005730 }
5731 if (!texture->setMaxAnisotropy((float)param, context->getTextureMaxAnisotropy()))
5732 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005733 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005734 }
5735 break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005736 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005737 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005738 }
5739 }
5740 }
5741 catch(std::bad_alloc&)
5742 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005743 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005744 }
5745}
5746
5747void __stdcall glTexParameteriv(GLenum target, GLenum pname, const GLint* params)
5748{
5749 glTexParameteri(target, pname, *params);
5750}
5751
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005752void __stdcall glTexStorage2DEXT(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height)
5753{
5754 EVENT("(GLenum target = 0x%X, GLsizei levels = %d, GLenum internalformat = 0x%X, GLsizei width = %d, GLsizei height = %d)",
5755 target, levels, internalformat, width, height);
5756
5757 try
5758 {
5759 if (target != GL_TEXTURE_2D && target != GL_TEXTURE_CUBE_MAP)
5760 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005761 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005762 }
5763
5764 if (width < 1 || height < 1 || levels < 1)
5765 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005766 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005767 }
5768
5769 if (target == GL_TEXTURE_CUBE_MAP && width != height)
5770 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005771 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005772 }
5773
daniel@transgaming.com45b888a2011-11-16 03:56:39 +00005774 if (levels != 1 && levels != gl::log2(std::max(width, height)) + 1)
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005775 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005776 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005777 }
5778
5779 GLenum format = gl::ExtractFormat(internalformat);
5780 GLenum type = gl::ExtractType(internalformat);
5781
5782 if (format == GL_NONE || type == GL_NONE)
5783 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005784 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005785 }
5786
5787 gl::Context *context = gl::getNonLostContext();
5788
5789 if (context)
5790 {
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00005791 switch (target)
5792 {
5793 case GL_TEXTURE_2D:
5794 if (width > context->getMaximumTextureDimension() ||
5795 height > context->getMaximumTextureDimension())
5796 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005797 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00005798 }
5799 break;
5800 case GL_TEXTURE_CUBE_MAP:
5801 if (width > context->getMaximumCubeTextureDimension() ||
5802 height > context->getMaximumCubeTextureDimension())
5803 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005804 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00005805 }
5806 break;
5807 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005808 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00005809 }
5810
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005811 if (levels != 1 && !context->supportsNonPower2Texture())
5812 {
5813 if (!gl::isPow2(width) || !gl::isPow2(height))
5814 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005815 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005816 }
5817 }
5818
daniel@transgaming.come1077362011-11-11 04:16:50 +00005819 switch (internalformat)
5820 {
5821 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
5822 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
5823 if (!context->supportsDXT1Textures())
5824 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005825 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.come1077362011-11-11 04:16:50 +00005826 }
5827 break;
5828 case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
5829 if (!context->supportsDXT3Textures())
5830 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005831 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.come1077362011-11-11 04:16:50 +00005832 }
5833 break;
5834 case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
5835 if (!context->supportsDXT5Textures())
5836 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005837 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.come1077362011-11-11 04:16:50 +00005838 }
5839 break;
daniel@transgaming.comff941aa2011-11-11 04:17:09 +00005840 case GL_RGBA32F_EXT:
5841 case GL_RGB32F_EXT:
5842 case GL_ALPHA32F_EXT:
5843 case GL_LUMINANCE32F_EXT:
5844 case GL_LUMINANCE_ALPHA32F_EXT:
5845 if (!context->supportsFloat32Textures())
5846 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005847 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comff941aa2011-11-11 04:17:09 +00005848 }
5849 break;
5850 case GL_RGBA16F_EXT:
5851 case GL_RGB16F_EXT:
5852 case GL_ALPHA16F_EXT:
5853 case GL_LUMINANCE16F_EXT:
5854 case GL_LUMINANCE_ALPHA16F_EXT:
5855 if (!context->supportsFloat16Textures())
5856 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005857 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comff941aa2011-11-11 04:17:09 +00005858 }
5859 break;
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00005860 case GL_DEPTH_COMPONENT16:
5861 case GL_DEPTH_COMPONENT32_OES:
5862 case GL_DEPTH24_STENCIL8_OES:
5863 if (!context->supportsDepthTextures())
5864 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005865 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00005866 }
daniel@transgaming.com0c854682012-05-31 01:14:11 +00005867 if (target != GL_TEXTURE_2D)
5868 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005869 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com0c854682012-05-31 01:14:11 +00005870 }
daniel@transgaming.com797924b2012-06-05 19:50:01 +00005871 // ANGLE_depth_texture only supports 1-level textures
5872 if (levels != 1)
5873 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005874 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com797924b2012-06-05 19:50:01 +00005875 }
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00005876 break;
5877 default:
5878 break;
daniel@transgaming.come1077362011-11-11 04:16:50 +00005879 }
5880
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005881 if (target == GL_TEXTURE_2D)
5882 {
5883 gl::Texture2D *texture = context->getTexture2D();
5884
5885 if (!texture || texture->id() == 0)
5886 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005887 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005888 }
5889
5890 if (texture->isImmutable())
5891 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005892 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005893 }
5894
5895 texture->storage(levels, internalformat, width, height);
5896 }
5897 else if (target == GL_TEXTURE_CUBE_MAP)
5898 {
5899 gl::TextureCubeMap *texture = context->getTextureCubeMap();
5900
5901 if (!texture || texture->id() == 0)
5902 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005903 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005904 }
5905
5906 if (texture->isImmutable())
5907 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005908 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005909 }
5910
5911 texture->storage(levels, internalformat, width);
5912 }
5913 else UNREACHABLE();
5914 }
5915 }
5916 catch(std::bad_alloc&)
5917 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005918 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005919 }
5920}
5921
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00005922void __stdcall glTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height,
5923 GLenum format, GLenum type, const GLvoid* pixels)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005924{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005925 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00005926 "GLsizei width = %d, GLsizei height = %d, GLenum format = 0x%X, GLenum type = 0x%X, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00005927 "const GLvoid* pixels = 0x%0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005928 target, level, xoffset, yoffset, width, height, format, type, pixels);
5929
5930 try
5931 {
apatrick@chromium.org551022e2012-01-23 19:56:54 +00005932 if (!gl::IsInternalTextureTarget(target))
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005933 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005934 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005935 }
5936
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00005937 if (level < 0 || xoffset < 0 || yoffset < 0 || width < 0 || height < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005938 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005939 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005940 }
5941
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005942 if (std::numeric_limits<GLsizei>::max() - xoffset < width || std::numeric_limits<GLsizei>::max() - yoffset < height)
5943 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005944 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005945 }
5946
daniel@transgaming.com8833dd22012-06-05 19:49:58 +00005947 if (!checkTextureFormatType(format, type))
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005948 {
daniel@transgaming.com8833dd22012-06-05 19:49:58 +00005949 return; // error is set by helper function
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005950 }
5951
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005952 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005953
5954 if (context)
5955 {
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00005956 if (level > context->getMaximumTextureLevel())
5957 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005958 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00005959 }
5960
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00005961 if (format == GL_FLOAT)
5962 {
daniel@transgaming.combbeffbb2011-11-09 17:46:11 +00005963 if (!context->supportsFloat32Textures())
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00005964 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005965 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00005966 }
5967 }
5968 else if (format == GL_HALF_FLOAT_OES)
5969 {
daniel@transgaming.combbeffbb2011-11-09 17:46:11 +00005970 if (!context->supportsFloat16Textures())
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00005971 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005972 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00005973 }
5974 }
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00005975 else if (gl::IsDepthTexture(format))
5976 {
5977 if (!context->supportsDepthTextures())
5978 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005979 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00005980 }
daniel@transgaming.com0c854682012-05-31 01:14:11 +00005981 if (target != GL_TEXTURE_2D)
5982 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005983 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com0c854682012-05-31 01:14:11 +00005984 }
5985 // OES_depth_texture supports loading depth data, but ANGLE_depth_texture does not
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005986 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00005987 }
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00005988
daniel@transgaming.com1d2d3c42012-05-31 01:14:15 +00005989 if (width == 0 || height == 0 || pixels == NULL)
5990 {
5991 return;
5992 }
5993
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005994 if (target == GL_TEXTURE_2D)
5995 {
5996 gl::Texture2D *texture = context->getTexture2D();
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00005997 if (validateSubImageParams2D(false, width, height, xoffset, yoffset, level, format, type, texture))
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005998 {
daniel@transgaming.com343373a2011-11-29 19:42:32 +00005999 texture->subImage(level, xoffset, yoffset, width, height, format, type, context->getUnpackAlignment(), pixels);
daniel@transgaming.com00c75962010-03-11 20:36:15 +00006000 }
daniel@transgaming.com00c75962010-03-11 20:36:15 +00006001 }
daniel@transgaming.com19ffc242010-05-04 03:35:21 +00006002 else if (gl::IsCubemapTextureTarget(target))
daniel@transgaming.com00c75962010-03-11 20:36:15 +00006003 {
6004 gl::TextureCubeMap *texture = context->getTextureCubeMap();
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00006005 if (validateSubImageParamsCube(false, width, height, xoffset, yoffset, target, level, format, type, texture))
daniel@transgaming.com00c75962010-03-11 20:36:15 +00006006 {
daniel@transgaming.com343373a2011-11-29 19:42:32 +00006007 texture->subImage(target, level, xoffset, yoffset, width, height, format, type, context->getUnpackAlignment(), pixels);
daniel@transgaming.com00c75962010-03-11 20:36:15 +00006008 }
daniel@transgaming.com00c75962010-03-11 20:36:15 +00006009 }
6010 else
6011 {
6012 UNREACHABLE();
6013 }
6014 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006015 }
6016 catch(std::bad_alloc&)
6017 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006018 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006019 }
6020}
6021
6022void __stdcall glUniform1f(GLint location, GLfloat x)
6023{
6024 glUniform1fv(location, 1, &x);
6025}
6026
6027void __stdcall glUniform1fv(GLint location, GLsizei count, const GLfloat* v)
6028{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006029 EVENT("(GLint location = %d, GLsizei count = %d, const GLfloat* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006030
6031 try
6032 {
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006033 if (count < 0)
6034 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006035 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006036 }
6037
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006038 if (location == -1)
6039 {
6040 return;
6041 }
6042
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006043 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006044
6045 if (context)
6046 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00006047 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006048 if (!programBinary)
6049 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006050 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006051 }
6052
6053 if (!programBinary->setUniform1fv(location, count, v))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006054 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006055 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006056 }
6057 }
6058 }
6059 catch(std::bad_alloc&)
6060 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006061 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006062 }
6063}
6064
6065void __stdcall glUniform1i(GLint location, GLint x)
6066{
6067 glUniform1iv(location, 1, &x);
6068}
6069
6070void __stdcall glUniform1iv(GLint location, GLsizei count, const GLint* v)
6071{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006072 EVENT("(GLint location = %d, GLsizei count = %d, const GLint* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006073
6074 try
6075 {
6076 if (count < 0)
6077 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006078 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006079 }
6080
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006081 if (location == -1)
6082 {
6083 return;
6084 }
6085
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006086 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006087
6088 if (context)
6089 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00006090 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006091 if (!programBinary)
6092 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006093 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006094 }
6095
6096 if (!programBinary->setUniform1iv(location, count, v))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006097 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006098 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006099 }
6100 }
6101 }
6102 catch(std::bad_alloc&)
6103 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006104 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006105 }
6106}
6107
6108void __stdcall glUniform2f(GLint location, GLfloat x, GLfloat y)
6109{
6110 GLfloat xy[2] = {x, y};
6111
6112 glUniform2fv(location, 1, (GLfloat*)&xy);
6113}
6114
6115void __stdcall glUniform2fv(GLint location, GLsizei count, const GLfloat* v)
6116{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006117 EVENT("(GLint location = %d, GLsizei count = %d, const GLfloat* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006118
6119 try
6120 {
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006121 if (count < 0)
6122 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006123 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006124 }
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006125
6126 if (location == -1)
6127 {
6128 return;
6129 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006130
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006131 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006132
6133 if (context)
6134 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00006135 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006136 if (!programBinary)
6137 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006138 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006139 }
6140
6141 if (!programBinary->setUniform2fv(location, count, v))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006142 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006143 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006144 }
6145 }
6146 }
6147 catch(std::bad_alloc&)
6148 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006149 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006150 }
6151}
6152
6153void __stdcall glUniform2i(GLint location, GLint x, GLint y)
6154{
6155 GLint xy[4] = {x, y};
6156
6157 glUniform2iv(location, 1, (GLint*)&xy);
6158}
6159
6160void __stdcall glUniform2iv(GLint location, GLsizei count, const GLint* v)
6161{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006162 EVENT("(GLint location = %d, GLsizei count = %d, const GLint* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006163
6164 try
6165 {
6166 if (count < 0)
6167 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006168 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006169 }
6170
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006171 if (location == -1)
6172 {
6173 return;
6174 }
6175
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006176 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006177
6178 if (context)
6179 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00006180 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006181 if (!programBinary)
6182 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006183 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006184 }
6185
6186 if (!programBinary->setUniform2iv(location, count, v))
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006187 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006188 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006189 }
6190 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006191 }
6192 catch(std::bad_alloc&)
6193 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006194 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006195 }
6196}
6197
6198void __stdcall glUniform3f(GLint location, GLfloat x, GLfloat y, GLfloat z)
6199{
6200 GLfloat xyz[3] = {x, y, z};
6201
6202 glUniform3fv(location, 1, (GLfloat*)&xyz);
6203}
6204
6205void __stdcall glUniform3fv(GLint location, GLsizei count, const GLfloat* v)
6206{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006207 EVENT("(GLint location = %d, GLsizei count = %d, const GLfloat* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006208
6209 try
6210 {
6211 if (count < 0)
6212 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006213 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006214 }
6215
6216 if (location == -1)
6217 {
6218 return;
6219 }
6220
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006221 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006222
6223 if (context)
6224 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00006225 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006226 if (!programBinary)
6227 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006228 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006229 }
6230
6231 if (!programBinary->setUniform3fv(location, count, v))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006232 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006233 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006234 }
6235 }
6236 }
6237 catch(std::bad_alloc&)
6238 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006239 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006240 }
6241}
6242
6243void __stdcall glUniform3i(GLint location, GLint x, GLint y, GLint z)
6244{
6245 GLint xyz[3] = {x, y, z};
6246
6247 glUniform3iv(location, 1, (GLint*)&xyz);
6248}
6249
6250void __stdcall glUniform3iv(GLint location, GLsizei count, const GLint* v)
6251{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006252 EVENT("(GLint location = %d, GLsizei count = %d, const GLint* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006253
6254 try
6255 {
6256 if (count < 0)
6257 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006258 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006259 }
6260
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006261 if (location == -1)
6262 {
6263 return;
6264 }
6265
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006266 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006267
6268 if (context)
6269 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00006270 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006271 if (!programBinary)
6272 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006273 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006274 }
6275
6276 if (!programBinary->setUniform3iv(location, count, v))
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006277 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006278 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006279 }
6280 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006281 }
6282 catch(std::bad_alloc&)
6283 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006284 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006285 }
6286}
6287
6288void __stdcall glUniform4f(GLint location, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
6289{
6290 GLfloat xyzw[4] = {x, y, z, w};
6291
6292 glUniform4fv(location, 1, (GLfloat*)&xyzw);
6293}
6294
6295void __stdcall glUniform4fv(GLint location, GLsizei count, const GLfloat* v)
6296{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006297 EVENT("(GLint location = %d, GLsizei count = %d, const GLfloat* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006298
6299 try
6300 {
6301 if (count < 0)
6302 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006303 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006304 }
6305
6306 if (location == -1)
6307 {
6308 return;
6309 }
6310
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006311 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006312
6313 if (context)
6314 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00006315 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006316 if (!programBinary)
6317 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006318 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006319 }
6320
6321 if (!programBinary->setUniform4fv(location, count, v))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006322 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006323 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006324 }
6325 }
6326 }
6327 catch(std::bad_alloc&)
6328 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006329 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006330 }
6331}
6332
6333void __stdcall glUniform4i(GLint location, GLint x, GLint y, GLint z, GLint w)
6334{
6335 GLint xyzw[4] = {x, y, z, w};
6336
6337 glUniform4iv(location, 1, (GLint*)&xyzw);
6338}
6339
6340void __stdcall glUniform4iv(GLint location, GLsizei count, const GLint* v)
6341{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006342 EVENT("(GLint location = %d, GLsizei count = %d, const GLint* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006343
6344 try
6345 {
6346 if (count < 0)
6347 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006348 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006349 }
6350
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006351 if (location == -1)
6352 {
6353 return;
6354 }
6355
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006356 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006357
6358 if (context)
6359 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00006360 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006361 if (!programBinary)
6362 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006363 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006364 }
6365
6366 if (!programBinary->setUniform4iv(location, count, v))
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006367 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006368 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006369 }
6370 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006371 }
6372 catch(std::bad_alloc&)
6373 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006374 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006375 }
6376}
6377
6378void __stdcall glUniformMatrix2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
6379{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006380 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00006381 location, count, transpose, value);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006382
6383 try
6384 {
6385 if (count < 0 || transpose != GL_FALSE)
6386 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006387 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006388 }
6389
6390 if (location == -1)
6391 {
6392 return;
6393 }
6394
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006395 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006396
6397 if (context)
6398 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00006399 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006400 if (!programBinary)
6401 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006402 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006403 }
6404
6405 if (!programBinary->setUniformMatrix2fv(location, count, value))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006406 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006407 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006408 }
6409 }
6410 }
6411 catch(std::bad_alloc&)
6412 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006413 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006414 }
6415}
6416
6417void __stdcall glUniformMatrix3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
6418{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006419 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00006420 location, count, transpose, value);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006421
6422 try
6423 {
6424 if (count < 0 || transpose != GL_FALSE)
6425 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006426 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006427 }
6428
6429 if (location == -1)
6430 {
6431 return;
6432 }
6433
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006434 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006435
6436 if (context)
6437 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00006438 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006439 if (!programBinary)
6440 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006441 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006442 }
6443
6444 if (!programBinary->setUniformMatrix3fv(location, count, value))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006445 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006446 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006447 }
6448 }
6449 }
6450 catch(std::bad_alloc&)
6451 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006452 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006453 }
6454}
6455
6456void __stdcall glUniformMatrix4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
6457{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006458 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00006459 location, count, transpose, value);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006460
6461 try
6462 {
6463 if (count < 0 || transpose != GL_FALSE)
6464 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006465 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006466 }
6467
6468 if (location == -1)
6469 {
6470 return;
6471 }
6472
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006473 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006474
6475 if (context)
6476 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00006477 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006478 if (!programBinary)
6479 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006480 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006481 }
6482
6483 if (!programBinary->setUniformMatrix4fv(location, count, value))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006484 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006485 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006486 }
6487 }
6488 }
6489 catch(std::bad_alloc&)
6490 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006491 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006492 }
6493}
6494
6495void __stdcall glUseProgram(GLuint program)
6496{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006497 EVENT("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006498
6499 try
6500 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006501 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006502
6503 if (context)
6504 {
6505 gl::Program *programObject = context->getProgram(program);
6506
daniel@transgaming.comc8478202010-04-13 19:53:35 +00006507 if (!programObject && program != 0)
6508 {
6509 if (context->getShader(program))
6510 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006511 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comc8478202010-04-13 19:53:35 +00006512 }
6513 else
6514 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006515 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comc8478202010-04-13 19:53:35 +00006516 }
6517 }
6518
daniel@transgaming.com716056c2012-07-24 18:38:59 +00006519 if (program != 0 && !programObject->isLinked())
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006520 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006521 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006522 }
6523
6524 context->useProgram(program);
6525 }
6526 }
6527 catch(std::bad_alloc&)
6528 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006529 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006530 }
6531}
6532
6533void __stdcall glValidateProgram(GLuint program)
6534{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006535 EVENT("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006536
6537 try
6538 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006539 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00006540
6541 if (context)
6542 {
6543 gl::Program *programObject = context->getProgram(program);
6544
6545 if (!programObject)
6546 {
6547 if (context->getShader(program))
6548 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006549 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00006550 }
6551 else
6552 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006553 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00006554 }
6555 }
6556
apatrick@chromium.org253b8d22012-06-22 19:27:21 +00006557 programObject->validate();
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00006558 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006559 }
6560 catch(std::bad_alloc&)
6561 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006562 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006563 }
6564}
6565
6566void __stdcall glVertexAttrib1f(GLuint index, GLfloat x)
6567{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006568 EVENT("(GLuint index = %d, GLfloat x = %f)", index, x);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006569
6570 try
6571 {
6572 if (index >= gl::MAX_VERTEX_ATTRIBS)
6573 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006574 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006575 }
6576
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006577 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006578
6579 if (context)
6580 {
6581 GLfloat vals[4] = { x, 0, 0, 1 };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00006582 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006583 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006584 }
6585 catch(std::bad_alloc&)
6586 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006587 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006588 }
6589}
6590
6591void __stdcall glVertexAttrib1fv(GLuint index, const GLfloat* values)
6592{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006593 EVENT("(GLuint index = %d, const GLfloat* values = 0x%0.8p)", index, values);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006594
6595 try
6596 {
6597 if (index >= gl::MAX_VERTEX_ATTRIBS)
6598 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006599 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006600 }
6601
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006602 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006603
6604 if (context)
6605 {
6606 GLfloat vals[4] = { values[0], 0, 0, 1 };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00006607 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006608 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006609 }
6610 catch(std::bad_alloc&)
6611 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006612 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006613 }
6614}
6615
6616void __stdcall glVertexAttrib2f(GLuint index, GLfloat x, GLfloat y)
6617{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006618 EVENT("(GLuint index = %d, GLfloat x = %f, GLfloat y = %f)", index, x, y);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006619
6620 try
6621 {
6622 if (index >= gl::MAX_VERTEX_ATTRIBS)
6623 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006624 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006625 }
6626
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006627 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006628
6629 if (context)
6630 {
6631 GLfloat vals[4] = { x, y, 0, 1 };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00006632 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006633 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006634 }
6635 catch(std::bad_alloc&)
6636 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006637 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006638 }
6639}
6640
6641void __stdcall glVertexAttrib2fv(GLuint index, const GLfloat* values)
6642{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006643 EVENT("(GLuint index = %d, const GLfloat* values = 0x%0.8p)", index, values);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006644
6645 try
6646 {
6647 if (index >= gl::MAX_VERTEX_ATTRIBS)
6648 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006649 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006650 }
6651
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006652 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006653
6654 if (context)
6655 {
6656 GLfloat vals[4] = { values[0], values[1], 0, 1 };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00006657 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006658 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006659 }
6660 catch(std::bad_alloc&)
6661 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006662 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006663 }
6664}
6665
6666void __stdcall glVertexAttrib3f(GLuint index, GLfloat x, GLfloat y, GLfloat z)
6667{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006668 EVENT("(GLuint index = %d, GLfloat x = %f, GLfloat y = %f, GLfloat z = %f)", index, x, y, z);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006669
6670 try
6671 {
6672 if (index >= gl::MAX_VERTEX_ATTRIBS)
6673 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006674 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006675 }
6676
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006677 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006678
6679 if (context)
6680 {
6681 GLfloat vals[4] = { x, y, z, 1 };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00006682 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006683 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006684 }
6685 catch(std::bad_alloc&)
6686 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006687 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006688 }
6689}
6690
6691void __stdcall glVertexAttrib3fv(GLuint index, const GLfloat* values)
6692{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006693 EVENT("(GLuint index = %d, const GLfloat* values = 0x%0.8p)", index, values);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006694
6695 try
6696 {
6697 if (index >= gl::MAX_VERTEX_ATTRIBS)
6698 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006699 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006700 }
6701
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006702 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006703
6704 if (context)
6705 {
6706 GLfloat vals[4] = { values[0], values[1], values[2], 1 };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00006707 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006708 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006709 }
6710 catch(std::bad_alloc&)
6711 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006712 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006713 }
6714}
6715
6716void __stdcall glVertexAttrib4f(GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
6717{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006718 EVENT("(GLuint index = %d, GLfloat x = %f, GLfloat y = %f, GLfloat z = %f, GLfloat w = %f)", index, x, y, z, w);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006719
6720 try
6721 {
6722 if (index >= gl::MAX_VERTEX_ATTRIBS)
6723 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006724 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006725 }
6726
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006727 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006728
6729 if (context)
6730 {
6731 GLfloat vals[4] = { x, y, z, w };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00006732 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006733 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006734 }
6735 catch(std::bad_alloc&)
6736 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006737 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006738 }
6739}
6740
6741void __stdcall glVertexAttrib4fv(GLuint index, const GLfloat* values)
6742{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006743 EVENT("(GLuint index = %d, const GLfloat* values = 0x%0.8p)", index, values);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006744
6745 try
6746 {
6747 if (index >= gl::MAX_VERTEX_ATTRIBS)
6748 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006749 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006750 }
6751
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006752 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006753
6754 if (context)
6755 {
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00006756 context->setVertexAttribf(index, values);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006757 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006758 }
6759 catch(std::bad_alloc&)
6760 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006761 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006762 }
6763}
6764
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00006765void __stdcall glVertexAttribDivisorANGLE(GLuint index, GLuint divisor)
6766{
6767 EVENT("(GLuint index = %d, GLuint divisor = %d)", index, divisor);
6768
6769 try
6770 {
6771 if (index >= gl::MAX_VERTEX_ATTRIBS)
6772 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006773 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00006774 }
6775
6776 gl::Context *context = gl::getNonLostContext();
6777
6778 if (context)
6779 {
6780 context->setVertexAttribDivisor(index, divisor);
6781 }
6782 }
6783 catch(std::bad_alloc&)
6784 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006785 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00006786 }
6787}
6788
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00006789void __stdcall glVertexAttribPointer(GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid* ptr)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006790{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006791 EVENT("(GLuint index = %d, GLint size = %d, GLenum type = 0x%X, "
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006792 "GLboolean normalized = %u, GLsizei stride = %d, const GLvoid* ptr = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00006793 index, size, type, normalized, stride, ptr);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006794
6795 try
6796 {
6797 if (index >= gl::MAX_VERTEX_ATTRIBS)
6798 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006799 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006800 }
6801
6802 if (size < 1 || size > 4)
6803 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006804 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006805 }
6806
shannon.woods%transgaming.com@gtempaccount.com1a4e09a2013-04-13 03:33:30 +00006807 gl::Context *context = gl::getNonLostContext();
6808
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006809 switch (type)
6810 {
6811 case GL_BYTE:
6812 case GL_UNSIGNED_BYTE:
6813 case GL_SHORT:
6814 case GL_UNSIGNED_SHORT:
6815 case GL_FIXED:
6816 case GL_FLOAT:
6817 break;
shannon.woods%transgaming.com@gtempaccount.com1a4e09a2013-04-13 03:33:30 +00006818 case GL_HALF_FLOAT:
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00006819 case GL_INT:
6820 case GL_UNSIGNED_INT:
shannon.woods%transgaming.com@gtempaccount.com1ab57be2013-04-13 03:38:39 +00006821 case GL_INT_2_10_10_10_REV:
6822 case GL_UNSIGNED_INT_2_10_10_10_REV:
shannon.woods%transgaming.com@gtempaccount.com1a4e09a2013-04-13 03:33:30 +00006823 if (context && context->getClientVersion() < 3)
6824 {
6825 return gl::error(GL_INVALID_ENUM);
6826 }
6827 else
6828 {
6829 break;
6830 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006831 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006832 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006833 }
6834
6835 if (stride < 0)
6836 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006837 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006838 }
6839
shannon.woods%transgaming.com@gtempaccount.com1ab57be2013-04-13 03:38:39 +00006840 if ((type == GL_INT_2_10_10_10_REV || type == GL_UNSIGNED_INT_2_10_10_10_REV) && size != 4)
6841 {
6842 return gl::error(GL_INVALID_OPERATION);
6843 }
6844
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006845 if (context)
6846 {
shannon.woods%transgaming.com@gtempaccount.com8de4e6a2013-04-13 03:37:44 +00006847 context->setVertexAttribState(index, context->getArrayBuffer(), size, type,
6848 normalized == GL_TRUE, false, stride, ptr);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006849 }
6850 }
6851 catch(std::bad_alloc&)
6852 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006853 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006854 }
6855}
6856
6857void __stdcall glViewport(GLint x, GLint y, GLsizei width, GLsizei height)
6858{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006859 EVENT("(GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d)", x, y, width, height);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006860
6861 try
6862 {
6863 if (width < 0 || height < 0)
6864 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006865 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006866 }
6867
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006868 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006869
6870 if (context)
6871 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00006872 context->setViewportParams(x, y, width, height);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006873 }
6874 }
6875 catch(std::bad_alloc&)
6876 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006877 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006878 }
6879}
6880
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006881// OpenGL ES 3.0 functions
6882
6883void __stdcall glReadBuffer(GLenum mode)
6884{
6885 EVENT("(GLenum mode = 0x%X)", mode);
6886
6887 try
6888 {
6889 gl::Context *context = gl::getNonLostContext();
6890
6891 if (context)
6892 {
6893 if (context->getClientVersion() < 3)
6894 {
6895 return gl::error(GL_INVALID_OPERATION);
6896 }
6897 }
6898
6899 UNIMPLEMENTED();
6900 }
6901 catch(std::bad_alloc&)
6902 {
6903 return gl::error(GL_OUT_OF_MEMORY);
6904 }
6905}
6906
6907void __stdcall glDrawRangeElements(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid* indices)
6908{
6909 EVENT("(GLenum mode = 0x%X, GLuint start = %u, GLuint end = %u, GLsizei count = %d, GLenum type = 0x%X, "
6910 "const GLvoid* indices = 0x%0.8p)", mode, start, end, count, type, indices);
6911
6912 try
6913 {
6914 gl::Context *context = gl::getNonLostContext();
6915
6916 if (context)
6917 {
6918 if (context->getClientVersion() < 3)
6919 {
6920 return gl::error(GL_INVALID_OPERATION);
6921 }
6922 }
6923
6924 UNIMPLEMENTED();
6925 }
6926 catch(std::bad_alloc&)
6927 {
6928 return gl::error(GL_OUT_OF_MEMORY);
6929 }
6930}
6931
6932void __stdcall glTexImage3D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid* pixels)
6933{
6934 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint internalformat = %d, GLsizei width = %d, "
6935 "GLsizei height = %d, GLsizei depth = %d, GLint border = %d, GLenum format = 0x%X, "
6936 "GLenum type = 0x%X, const GLvoid* pixels = 0x%0.8p)",
6937 target, level, internalformat, width, height, depth, border, format, type, pixels);
6938
6939 try
6940 {
6941 gl::Context *context = gl::getNonLostContext();
6942
6943 if (context)
6944 {
6945 if (context->getClientVersion() < 3)
6946 {
6947 return gl::error(GL_INVALID_OPERATION);
6948 }
6949 }
6950
6951 UNIMPLEMENTED();
6952 }
6953 catch(std::bad_alloc&)
6954 {
6955 return gl::error(GL_OUT_OF_MEMORY);
6956 }
6957}
6958
6959void __stdcall glTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid* pixels)
6960{
6961 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
6962 "GLint zoffset = %d, GLsizei width = %d, GLsizei height = %d, GLsizei depth = %d, "
6963 "GLenum format = 0x%X, GLenum type = 0x%X, const GLvoid* pixels = 0x%0.8p)",
6964 target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels);
6965
6966 try
6967 {
6968 gl::Context *context = gl::getNonLostContext();
6969
6970 if (context)
6971 {
6972 if (context->getClientVersion() < 3)
6973 {
6974 return gl::error(GL_INVALID_OPERATION);
6975 }
6976 }
6977
6978 UNIMPLEMENTED();
6979 }
6980 catch(std::bad_alloc&)
6981 {
6982 return gl::error(GL_OUT_OF_MEMORY);
6983 }
6984}
6985
6986void __stdcall glCopyTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height)
6987{
6988 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
6989 "GLint zoffset = %d, GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d)",
6990 target, level, xoffset, yoffset, zoffset, x, y, width, height);
6991
6992 try
6993 {
6994 gl::Context *context = gl::getNonLostContext();
6995
6996 if (context)
6997 {
6998 if (context->getClientVersion() < 3)
6999 {
7000 return gl::error(GL_INVALID_OPERATION);
7001 }
7002 }
7003
7004 UNIMPLEMENTED();
7005 }
7006 catch(std::bad_alloc&)
7007 {
7008 return gl::error(GL_OUT_OF_MEMORY);
7009 }
7010}
7011
7012void __stdcall glCompressedTexImage3D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid* data)
7013{
7014 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint internalformat = %d, GLsizei width = %d, "
7015 "GLsizei height = %d, GLsizei depth = %d, GLint border = %d, GLsizei imageSize = %d, "
7016 "const GLvoid* data = 0x%0.8p)",
7017 target, level, internalformat, width, height, depth, border, imageSize, data);
7018
7019 try
7020 {
7021 gl::Context *context = gl::getNonLostContext();
7022
7023 if (context)
7024 {
7025 if (context->getClientVersion() < 3)
7026 {
7027 return gl::error(GL_INVALID_OPERATION);
7028 }
7029 }
7030
7031 UNIMPLEMENTED();
7032 }
7033 catch(std::bad_alloc&)
7034 {
7035 return gl::error(GL_OUT_OF_MEMORY);
7036 }
7037}
7038
7039void __stdcall glCompressedTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid* data)
7040{
7041 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
7042 "GLint zoffset = %d, GLsizei width = %d, GLsizei height = %d, GLsizei depth = %d, "
7043 "GLenum format = 0x%X, GLsizei imageSize = %d, const GLvoid* data = 0x%0.8p)",
7044 target, level, xoffset, yoffset, zoffset, width, height, depth, format, imageSize, data);
7045
7046 try
7047 {
7048 gl::Context *context = gl::getNonLostContext();
7049
7050 if (context)
7051 {
7052 if (context->getClientVersion() < 3)
7053 {
7054 return gl::error(GL_INVALID_OPERATION);
7055 }
7056 }
7057
7058 UNIMPLEMENTED();
7059 }
7060 catch(std::bad_alloc&)
7061 {
7062 return gl::error(GL_OUT_OF_MEMORY);
7063 }
7064}
7065
7066void __stdcall glGenQueries(GLsizei n, GLuint* ids)
7067{
7068 EVENT("(GLsizei n = %d, GLuint* ids = 0x%0.8p)", n, ids);
7069
7070 try
7071 {
7072 gl::Context *context = gl::getNonLostContext();
7073
7074 if (context)
7075 {
7076 if (context->getClientVersion() < 3)
7077 {
7078 return gl::error(GL_INVALID_OPERATION);
7079 }
7080 }
7081
7082 UNIMPLEMENTED();
7083 }
7084 catch(std::bad_alloc&)
7085 {
7086 return gl::error(GL_OUT_OF_MEMORY);
7087 }
7088}
7089
7090void __stdcall glDeleteQueries(GLsizei n, const GLuint* ids)
7091{
7092 EVENT("(GLsizei n = %d, GLuint* ids = 0x%0.8p)", n, ids);
7093
7094 try
7095 {
7096 gl::Context *context = gl::getNonLostContext();
7097
7098 if (context)
7099 {
7100 if (context->getClientVersion() < 3)
7101 {
7102 return gl::error(GL_INVALID_OPERATION);
7103 }
7104 }
7105
7106 UNIMPLEMENTED();
7107 }
7108 catch(std::bad_alloc&)
7109 {
7110 return gl::error(GL_OUT_OF_MEMORY);
7111 }
7112}
7113
7114GLboolean __stdcall glIsQuery(GLuint id)
7115{
7116 EVENT("(GLuint id = %u)", id);
7117
7118 try
7119 {
7120 gl::Context *context = gl::getNonLostContext();
7121
7122 if (context)
7123 {
7124 if (context->getClientVersion() < 3)
7125 {
7126 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
7127 }
7128 }
7129
7130 UNIMPLEMENTED();
7131 }
7132 catch(std::bad_alloc&)
7133 {
7134 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
7135 }
7136
7137 return GL_FALSE;
7138}
7139
7140void __stdcall glBeginQuery(GLenum target, GLuint id)
7141{
7142 EVENT("(GLenum target = 0x%X, GLuint id = %u)", target, id);
7143
7144 try
7145 {
7146 gl::Context *context = gl::getNonLostContext();
7147
7148 if (context)
7149 {
7150 if (context->getClientVersion() < 3)
7151 {
7152 return gl::error(GL_INVALID_OPERATION);
7153 }
7154 }
7155
7156 UNIMPLEMENTED();
7157 }
7158 catch(std::bad_alloc&)
7159 {
7160 return gl::error(GL_OUT_OF_MEMORY);
7161 }
7162}
7163
7164void __stdcall glEndQuery(GLenum target)
7165{
7166 EVENT("(GLenum target = 0x%X)", target);
7167
7168 try
7169 {
7170 gl::Context *context = gl::getNonLostContext();
7171
7172 if (context)
7173 {
7174 if (context->getClientVersion() < 3)
7175 {
7176 return gl::error(GL_INVALID_OPERATION);
7177 }
7178 }
7179
7180 UNIMPLEMENTED();
7181 }
7182 catch(std::bad_alloc&)
7183 {
7184 return gl::error(GL_OUT_OF_MEMORY);
7185 }
7186}
7187
7188void __stdcall glGetQueryiv(GLenum target, GLenum pname, GLint* params)
7189{
7190 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLint* params = 0x%0.8p)", target, pname, params);
7191
7192 try
7193 {
7194 gl::Context *context = gl::getNonLostContext();
7195
7196 if (context)
7197 {
7198 if (context->getClientVersion() < 3)
7199 {
7200 return gl::error(GL_INVALID_OPERATION);
7201 }
7202 }
7203
7204 UNIMPLEMENTED();
7205 }
7206 catch(std::bad_alloc&)
7207 {
7208 return gl::error(GL_OUT_OF_MEMORY);
7209 }
7210}
7211
7212void __stdcall glGetQueryObjectuiv(GLuint id, GLenum pname, GLuint* params)
7213{
7214 EVENT("(GLuint id = %u, GLenum pname = 0x%X, GLint* params = 0x%0.8p)", id, pname, params);
7215
7216 try
7217 {
7218 gl::Context *context = gl::getNonLostContext();
7219
7220 if (context)
7221 {
7222 if (context->getClientVersion() < 3)
7223 {
7224 return gl::error(GL_INVALID_OPERATION);
7225 }
7226 }
7227
7228 UNIMPLEMENTED();
7229 }
7230 catch(std::bad_alloc&)
7231 {
7232 return gl::error(GL_OUT_OF_MEMORY);
7233 }
7234}
7235
7236GLboolean __stdcall glUnmapBuffer(GLenum target)
7237{
7238 EVENT("(GLenum target = 0x%X)", target);
7239
7240 try
7241 {
7242 gl::Context *context = gl::getNonLostContext();
7243
7244 if (context)
7245 {
7246 if (context->getClientVersion() < 3)
7247 {
7248 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
7249 }
7250 }
7251
7252 UNIMPLEMENTED();
7253 }
7254 catch(std::bad_alloc&)
7255 {
7256 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
7257 }
7258
7259 return GL_FALSE;
7260}
7261
7262void __stdcall glGetBufferPointerv(GLenum target, GLenum pname, GLvoid** params)
7263{
7264 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLvoid** params = 0x%0.8p)", target, pname, params);
7265
7266 try
7267 {
7268 gl::Context *context = gl::getNonLostContext();
7269
7270 if (context)
7271 {
7272 if (context->getClientVersion() < 3)
7273 {
7274 return gl::error(GL_INVALID_OPERATION);
7275 }
7276 }
7277
7278 UNIMPLEMENTED();
7279 }
7280 catch(std::bad_alloc&)
7281 {
7282 return gl::error(GL_OUT_OF_MEMORY);
7283 }
7284}
7285
7286void __stdcall glDrawBuffers(GLsizei n, const GLenum* bufs)
7287{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007288 try
7289 {
7290 gl::Context *context = gl::getNonLostContext();
7291
7292 if (context)
7293 {
7294 if (context->getClientVersion() < 3)
7295 {
7296 return gl::error(GL_INVALID_OPERATION);
7297 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007298
shannon.woods%transgaming.com@gtempaccount.com7948c5f2013-04-13 03:38:58 +00007299 glDrawBuffersEXT(n, bufs);
7300 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007301 }
7302 catch(std::bad_alloc&)
7303 {
7304 return gl::error(GL_OUT_OF_MEMORY);
7305 }
7306}
7307
7308void __stdcall glUniformMatrix2x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
7309{
7310 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
7311 location, count, transpose, value);
7312
7313 try
7314 {
7315 gl::Context *context = gl::getNonLostContext();
7316
7317 if (context)
7318 {
7319 if (context->getClientVersion() < 3)
7320 {
7321 return gl::error(GL_INVALID_OPERATION);
7322 }
7323 }
7324
7325 UNIMPLEMENTED();
7326 }
7327 catch(std::bad_alloc&)
7328 {
7329 return gl::error(GL_OUT_OF_MEMORY);
7330 }
7331}
7332
7333void __stdcall glUniformMatrix3x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
7334{
7335 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
7336 location, count, transpose, value);
7337
7338 try
7339 {
7340 gl::Context *context = gl::getNonLostContext();
7341
7342 if (context)
7343 {
7344 if (context->getClientVersion() < 3)
7345 {
7346 return gl::error(GL_INVALID_OPERATION);
7347 }
7348 }
7349
7350 UNIMPLEMENTED();
7351 }
7352 catch(std::bad_alloc&)
7353 {
7354 return gl::error(GL_OUT_OF_MEMORY);
7355 }
7356}
7357
7358void __stdcall glUniformMatrix2x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
7359{
7360 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
7361 location, count, transpose, value);
7362
7363 try
7364 {
7365 gl::Context *context = gl::getNonLostContext();
7366
7367 if (context)
7368 {
7369 if (context->getClientVersion() < 3)
7370 {
7371 return gl::error(GL_INVALID_OPERATION);
7372 }
7373 }
7374
7375 UNIMPLEMENTED();
7376 }
7377 catch(std::bad_alloc&)
7378 {
7379 return gl::error(GL_OUT_OF_MEMORY);
7380 }
7381}
7382
7383void __stdcall glUniformMatrix4x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
7384{
7385 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
7386 location, count, transpose, value);
7387
7388 try
7389 {
7390 gl::Context *context = gl::getNonLostContext();
7391
7392 if (context)
7393 {
7394 if (context->getClientVersion() < 3)
7395 {
7396 return gl::error(GL_INVALID_OPERATION);
7397 }
7398 }
7399
7400 UNIMPLEMENTED();
7401 }
7402 catch(std::bad_alloc&)
7403 {
7404 return gl::error(GL_OUT_OF_MEMORY);
7405 }
7406}
7407
7408void __stdcall glUniformMatrix3x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
7409{
7410 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
7411 location, count, transpose, value);
7412
7413 try
7414 {
7415 gl::Context *context = gl::getNonLostContext();
7416
7417 if (context)
7418 {
7419 if (context->getClientVersion() < 3)
7420 {
7421 return gl::error(GL_INVALID_OPERATION);
7422 }
7423 }
7424
7425 UNIMPLEMENTED();
7426 }
7427 catch(std::bad_alloc&)
7428 {
7429 return gl::error(GL_OUT_OF_MEMORY);
7430 }
7431}
7432
7433void __stdcall glUniformMatrix4x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
7434{
7435 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
7436 location, count, transpose, value);
7437
7438 try
7439 {
7440 gl::Context *context = gl::getNonLostContext();
7441
7442 if (context)
7443 {
7444 if (context->getClientVersion() < 3)
7445 {
7446 return gl::error(GL_INVALID_OPERATION);
7447 }
7448 }
7449
7450 UNIMPLEMENTED();
7451 }
7452 catch(std::bad_alloc&)
7453 {
7454 return gl::error(GL_OUT_OF_MEMORY);
7455 }
7456}
7457
7458void __stdcall glBlitFramebuffer(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter)
7459{
7460 EVENT("(GLint srcX0 = %d, GLint srcY0 = %d, GLint srcX1 = %d, GLint srcY1 = %d, GLint dstX0 = %d, "
7461 "GLint dstY0 = %d, GLint dstX1 = %d, GLint dstY1 = %d, GLbitfield mask = 0x%X, GLenum filter = 0x%X)",
7462 srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter);
7463
7464 try
7465 {
7466 gl::Context *context = gl::getNonLostContext();
7467
7468 if (context)
7469 {
7470 if (context->getClientVersion() < 3)
7471 {
7472 return gl::error(GL_INVALID_OPERATION);
7473 }
7474 }
7475
7476 UNIMPLEMENTED();
7477 }
7478 catch(std::bad_alloc&)
7479 {
7480 return gl::error(GL_OUT_OF_MEMORY);
7481 }
7482}
7483
7484void __stdcall glRenderbufferStorageMultisample(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height)
7485{
7486 EVENT("(GLenum target = 0x%X, GLsizei samples = %d, GLenum internalformat = 0x%X, GLsizei width = %d, GLsizei height = %d)",
7487 target, samples, internalformat, width, height);
7488
7489 try
7490 {
7491 gl::Context *context = gl::getNonLostContext();
7492
7493 if (context)
7494 {
7495 if (context->getClientVersion() < 3)
7496 {
7497 return gl::error(GL_INVALID_OPERATION);
7498 }
7499 }
7500
7501 UNIMPLEMENTED();
7502 }
7503 catch(std::bad_alloc&)
7504 {
7505 return gl::error(GL_OUT_OF_MEMORY);
7506 }
7507}
7508
7509void __stdcall glFramebufferTextureLayer(GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer)
7510{
7511 EVENT("(GLenum target = 0x%X, GLenum attachment = 0x%X, GLuint texture = %u, GLint level = %d, GLint layer = %d)",
7512 target, attachment, texture, level, layer);
7513
7514 try
7515 {
7516 gl::Context *context = gl::getNonLostContext();
7517
7518 if (context)
7519 {
7520 if (context->getClientVersion() < 3)
7521 {
7522 return gl::error(GL_INVALID_OPERATION);
7523 }
7524 }
7525
7526 UNIMPLEMENTED();
7527 }
7528 catch(std::bad_alloc&)
7529 {
7530 return gl::error(GL_OUT_OF_MEMORY);
7531 }
7532}
7533
7534GLvoid* __stdcall glMapBufferRange(GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access)
7535{
7536 EVENT("(GLenum target = 0x%X, GLintptr offset = %d, GLsizeiptr length = %d, GLbitfield access = 0x%X)",
7537 target, offset, length, access);
7538
7539 try
7540 {
7541 gl::Context *context = gl::getNonLostContext();
7542
7543 if (context)
7544 {
7545 if (context->getClientVersion() < 3)
7546 {
7547 return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLvoid*>(NULL));
7548 }
7549 }
7550
7551 UNIMPLEMENTED();
7552 }
7553 catch(std::bad_alloc&)
7554 {
7555 return gl::error(GL_OUT_OF_MEMORY, reinterpret_cast<GLvoid*>(NULL));
7556 }
7557
7558 return NULL;
7559}
7560
7561void __stdcall glFlushMappedBufferRange(GLenum target, GLintptr offset, GLsizeiptr length)
7562{
7563 EVENT("(GLenum target = 0x%X, GLintptr offset = %d, GLsizeiptr length = %d)", target, offset, length);
7564
7565 try
7566 {
7567 gl::Context *context = gl::getNonLostContext();
7568
7569 if (context)
7570 {
7571 if (context->getClientVersion() < 3)
7572 {
7573 return gl::error(GL_INVALID_OPERATION);
7574 }
7575 }
7576
7577 UNIMPLEMENTED();
7578 }
7579 catch(std::bad_alloc&)
7580 {
7581 return gl::error(GL_OUT_OF_MEMORY);
7582 }
7583}
7584
7585void __stdcall glBindVertexArray(GLuint array)
7586{
7587 EVENT("(GLuint array = %u)", array);
7588
7589 try
7590 {
7591 gl::Context *context = gl::getNonLostContext();
7592
7593 if (context)
7594 {
7595 if (context->getClientVersion() < 3)
7596 {
7597 return gl::error(GL_INVALID_OPERATION);
7598 }
7599 }
7600
7601 UNIMPLEMENTED();
7602 }
7603 catch(std::bad_alloc&)
7604 {
7605 return gl::error(GL_OUT_OF_MEMORY);
7606 }
7607}
7608
7609void __stdcall glDeleteVertexArrays(GLsizei n, const GLuint* arrays)
7610{
7611 EVENT("(GLsizei n = %d, const GLuint* arrays = 0x%0.8p)", n, arrays);
7612
7613 try
7614 {
7615 gl::Context *context = gl::getNonLostContext();
7616
7617 if (context)
7618 {
7619 if (context->getClientVersion() < 3)
7620 {
7621 return gl::error(GL_INVALID_OPERATION);
7622 }
7623 }
7624
7625 UNIMPLEMENTED();
7626 }
7627 catch(std::bad_alloc&)
7628 {
7629 return gl::error(GL_OUT_OF_MEMORY);
7630 }
7631}
7632
7633void __stdcall glGenVertexArrays(GLsizei n, GLuint* arrays)
7634{
7635 EVENT("(GLsizei n = %d, GLuint* arrays = 0x%0.8p)", n, arrays);
7636
7637 try
7638 {
7639 gl::Context *context = gl::getNonLostContext();
7640
7641 if (context)
7642 {
7643 if (context->getClientVersion() < 3)
7644 {
7645 return gl::error(GL_INVALID_OPERATION);
7646 }
7647 }
7648
7649 UNIMPLEMENTED();
7650 }
7651 catch(std::bad_alloc&)
7652 {
7653 return gl::error(GL_OUT_OF_MEMORY);
7654 }
7655}
7656
7657GLboolean __stdcall glIsVertexArray(GLuint array)
7658{
7659 EVENT("(GLuint array = %u)", array);
7660
7661 try
7662 {
7663 gl::Context *context = gl::getNonLostContext();
7664
7665 if (context)
7666 {
7667 if (context->getClientVersion() < 3)
7668 {
7669 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
7670 }
7671 }
7672
7673 UNIMPLEMENTED();
7674 }
7675 catch(std::bad_alloc&)
7676 {
7677 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
7678 }
7679
7680 return GL_FALSE;
7681}
7682
7683void __stdcall glGetIntegeri_v(GLenum target, GLuint index, GLint* data)
7684{
7685 EVENT("(GLenum target = 0x%X, GLuint index = %u, GLint* data = 0x%0.8p)",
7686 target, index, data);
7687
7688 try
7689 {
7690 gl::Context *context = gl::getNonLostContext();
7691
7692 if (context)
7693 {
7694 if (context->getClientVersion() < 3)
7695 {
7696 return gl::error(GL_INVALID_OPERATION);
7697 }
7698 }
7699
7700 UNIMPLEMENTED();
7701 }
7702 catch(std::bad_alloc&)
7703 {
7704 return gl::error(GL_OUT_OF_MEMORY);
7705 }
7706}
7707
7708void __stdcall glBeginTransformFeedback(GLenum primitiveMode)
7709{
7710 EVENT("(GLenum primitiveMode = 0x%X)", primitiveMode);
7711
7712 try
7713 {
7714 gl::Context *context = gl::getNonLostContext();
7715
7716 if (context)
7717 {
7718 if (context->getClientVersion() < 3)
7719 {
7720 return gl::error(GL_INVALID_OPERATION);
7721 }
7722 }
7723
7724 UNIMPLEMENTED();
7725 }
7726 catch(std::bad_alloc&)
7727 {
7728 return gl::error(GL_OUT_OF_MEMORY);
7729 }
7730}
7731
7732void __stdcall glEndTransformFeedback(void)
7733{
7734 EVENT("(void)");
7735
7736 try
7737 {
7738 gl::Context *context = gl::getNonLostContext();
7739
7740 if (context)
7741 {
7742 if (context->getClientVersion() < 3)
7743 {
7744 return gl::error(GL_INVALID_OPERATION);
7745 }
7746 }
7747
7748 UNIMPLEMENTED();
7749 }
7750 catch(std::bad_alloc&)
7751 {
7752 return gl::error(GL_OUT_OF_MEMORY);
7753 }
7754}
7755
7756void __stdcall glBindBufferRange(GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size)
7757{
7758 EVENT("(GLenum target = 0x%X, GLuint index = %u, GLuint buffer = %u, GLintptr offset = %d, GLsizeiptr size = %d)",
7759 target, index, buffer, offset, size);
7760
7761 try
7762 {
7763 gl::Context *context = gl::getNonLostContext();
7764
7765 if (context)
7766 {
7767 if (context->getClientVersion() < 3)
7768 {
7769 return gl::error(GL_INVALID_OPERATION);
7770 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007771
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007772 switch (target)
7773 {
7774 case GL_TRANSFORM_FEEDBACK_BUFFER:
7775 if (index > context->getMaxTransformFeedbackBufferBindings())
7776 {
7777 return gl::error(GL_INVALID_VALUE);
7778 }
7779 break;
7780
7781 case GL_UNIFORM_BUFFER:
7782 if (index >= context->getMaximumCombinedUniformBufferBindings())
7783 {
7784 return gl::error(GL_INVALID_VALUE);
7785 }
7786 break;
7787
7788 default:
7789 return gl::error(GL_INVALID_ENUM);
7790 }
7791
7792 gl::Buffer *bufferObject = context->getBuffer(buffer);
7793 if (!bufferObject)
7794 {
7795 // Buffer index must not have been valid
7796 return gl::error(GL_INVALID_VALUE);
7797 }
7798
7799 if (size <= 0 || static_cast<unsigned int>(offset + size) > bufferObject->size())
7800 {
7801 return gl::error(GL_INVALID_VALUE);
7802 }
7803
7804 switch (target)
7805 {
7806 case GL_TRANSFORM_FEEDBACK_BUFFER:
7807 context->bindTransformFeedbackBuffer(buffer, index, offset, size);
7808 break;
7809
7810 case GL_UNIFORM_BUFFER:
7811 context->bindUniformBuffer(buffer, index, offset, size);
7812 break;
7813
7814 default:
7815 UNREACHABLE();
7816 }
7817 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007818 }
7819 catch(std::bad_alloc&)
7820 {
7821 return gl::error(GL_OUT_OF_MEMORY);
7822 }
7823}
7824
7825void __stdcall glBindBufferBase(GLenum target, GLuint index, GLuint buffer)
7826{
7827 EVENT("(GLenum target = 0x%X, GLuint index = %u, GLuint buffer = %u)",
7828 target, index, buffer);
7829
7830 try
7831 {
7832 gl::Context *context = gl::getNonLostContext();
7833
7834 if (context)
7835 {
7836 if (context->getClientVersion() < 3)
7837 {
7838 return gl::error(GL_INVALID_OPERATION);
7839 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007840
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007841 switch (target)
7842 {
7843 case GL_TRANSFORM_FEEDBACK_BUFFER:
7844 if (index > context->getMaxTransformFeedbackBufferBindings())
7845 {
7846 return gl::error(GL_INVALID_VALUE);
7847 }
7848 break;
7849
7850 case GL_UNIFORM_BUFFER:
7851 if (index > context->getMaximumCombinedUniformBufferBindings())
7852 {
7853 return gl::error(GL_INVALID_VALUE);
7854 }
7855 break;
7856
7857 default:
7858 return gl::error(GL_INVALID_ENUM);
7859 }
7860
7861 gl::Buffer *bufferObject = context->getBuffer(buffer);
7862 if (!bufferObject)
7863 {
7864 // Buffer index must not have been valid
7865 return gl::error(GL_INVALID_VALUE);
7866 }
7867
7868 switch (target)
7869 {
7870 case GL_TRANSFORM_FEEDBACK_BUFFER:
7871 context->bindTransformFeedbackBuffer(buffer, index, 0, -1);
7872 break;
7873
7874 case GL_UNIFORM_BUFFER:
7875 context->bindUniformBuffer(buffer, index, 0, -1);
7876 break;
7877
7878 default:
7879 UNREACHABLE();
7880 }
7881 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007882 }
7883 catch(std::bad_alloc&)
7884 {
7885 return gl::error(GL_OUT_OF_MEMORY);
7886 }
7887}
7888
7889void __stdcall glTransformFeedbackVaryings(GLuint program, GLsizei count, const GLchar* const* varyings, GLenum bufferMode)
7890{
7891 EVENT("(GLuint program = %u, GLsizei count = %d, const GLchar* const* varyings = 0x%0.8p, GLenum bufferMode = 0x%X)",
7892 program, count, varyings, bufferMode);
7893
7894 try
7895 {
7896 gl::Context *context = gl::getNonLostContext();
7897
7898 if (context)
7899 {
7900 if (context->getClientVersion() < 3)
7901 {
7902 return gl::error(GL_INVALID_OPERATION);
7903 }
7904 }
7905
7906 UNIMPLEMENTED();
7907 }
7908 catch(std::bad_alloc&)
7909 {
7910 return gl::error(GL_OUT_OF_MEMORY);
7911 }
7912}
7913
7914void __stdcall glGetTransformFeedbackVarying(GLuint program, GLuint index, GLsizei bufSize, GLsizei* length, GLsizei* size, GLenum* type, GLchar* name)
7915{
7916 EVENT("(GLuint program = %u, GLuint index = %u, GLsizei bufSize = %d, GLsizei* length = 0x%0.8p, "
7917 "GLsizei* size = 0x%0.8p, GLenum* type = 0x%0.8p, GLchar* name = 0x%0.8p)",
7918 program, index, bufSize, length, size, type, name);
7919
7920 try
7921 {
7922 gl::Context *context = gl::getNonLostContext();
7923
7924 if (context)
7925 {
7926 if (context->getClientVersion() < 3)
7927 {
7928 return gl::error(GL_INVALID_OPERATION);
7929 }
7930 }
7931
7932 UNIMPLEMENTED();
7933 }
7934 catch(std::bad_alloc&)
7935 {
7936 return gl::error(GL_OUT_OF_MEMORY);
7937 }
7938}
7939
7940void __stdcall glVertexAttribIPointer(GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid* pointer)
7941{
7942 EVENT("(GLuint index = %u, GLint size = %d, GLenum type = 0x%X, GLsizei stride = %d, const GLvoid* pointer = 0x%0.8p)",
7943 index, size, type, stride, pointer);
7944
7945 try
7946 {
7947 gl::Context *context = gl::getNonLostContext();
7948
7949 if (context)
7950 {
7951 if (context->getClientVersion() < 3)
7952 {
7953 return gl::error(GL_INVALID_OPERATION);
7954 }
7955 }
7956
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007957 if (index >= gl::MAX_VERTEX_ATTRIBS)
7958 {
7959 return gl::error(GL_INVALID_VALUE);
7960 }
7961
7962 if (size < 1 || size > 4)
7963 {
7964 return gl::error(GL_INVALID_VALUE);
7965 }
7966
7967 switch (type)
7968 {
7969 case GL_BYTE:
7970 case GL_UNSIGNED_BYTE:
7971 case GL_SHORT:
7972 case GL_UNSIGNED_SHORT:
7973 case GL_INT:
7974 case GL_UNSIGNED_INT:
shannon.woods%transgaming.com@gtempaccount.com1ab57be2013-04-13 03:38:39 +00007975 case GL_INT_2_10_10_10_REV:
7976 case GL_UNSIGNED_INT_2_10_10_10_REV:
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007977 break;
7978 default:
7979 return gl::error(GL_INVALID_ENUM);
7980 }
7981
7982 if (stride < 0)
7983 {
7984 return gl::error(GL_INVALID_VALUE);
7985 }
7986
shannon.woods%transgaming.com@gtempaccount.com1ab57be2013-04-13 03:38:39 +00007987 if ((type == GL_INT_2_10_10_10_REV || type == GL_UNSIGNED_INT_2_10_10_10_REV) && size != 4)
7988 {
7989 return gl::error(GL_INVALID_OPERATION);
7990 }
7991
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007992 if (context)
7993 {
7994 context->setVertexAttribState(index, context->getArrayBuffer(), size, type, false, true,
7995 stride, pointer);
7996 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007997 }
7998 catch(std::bad_alloc&)
7999 {
8000 return gl::error(GL_OUT_OF_MEMORY);
8001 }
8002}
8003
8004void __stdcall glGetVertexAttribIiv(GLuint index, GLenum pname, GLint* params)
8005{
8006 EVENT("(GLuint index = %u, GLenum pname = 0x%X, GLint* params = 0x%0.8p)",
8007 index, pname, params);
8008
8009 try
8010 {
8011 gl::Context *context = gl::getNonLostContext();
8012
8013 if (context)
8014 {
8015 if (context->getClientVersion() < 3)
8016 {
8017 return gl::error(GL_INVALID_OPERATION);
8018 }
8019 }
8020
8021 UNIMPLEMENTED();
8022 }
8023 catch(std::bad_alloc&)
8024 {
8025 return gl::error(GL_OUT_OF_MEMORY);
8026 }
8027}
8028
8029void __stdcall glGetVertexAttribIuiv(GLuint index, GLenum pname, GLuint* params)
8030{
8031 EVENT("(GLuint index = %u, GLenum pname = 0x%X, GLuint* params = 0x%0.8p)",
8032 index, pname, params);
8033
8034 try
8035 {
8036 gl::Context *context = gl::getNonLostContext();
8037
8038 if (context)
8039 {
8040 if (context->getClientVersion() < 3)
8041 {
8042 return gl::error(GL_INVALID_OPERATION);
8043 }
8044 }
8045
8046 UNIMPLEMENTED();
8047 }
8048 catch(std::bad_alloc&)
8049 {
8050 return gl::error(GL_OUT_OF_MEMORY);
8051 }
8052}
8053
8054void __stdcall glVertexAttribI4i(GLuint index, GLint x, GLint y, GLint z, GLint w)
8055{
8056 EVENT("(GLuint index = %u, GLint x = %d, GLint y = %d, GLint z = %d, GLint w = %d)",
8057 index, x, y, z, w);
8058
8059 try
8060 {
8061 gl::Context *context = gl::getNonLostContext();
8062
8063 if (context)
8064 {
8065 if (context->getClientVersion() < 3)
8066 {
8067 return gl::error(GL_INVALID_OPERATION);
8068 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008069
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00008070 if (index >= gl::MAX_VERTEX_ATTRIBS)
8071 {
8072 return gl::error(GL_INVALID_VALUE);
8073 }
8074
8075 GLint vals[4] = { x, y, z, w };
8076 context->setVertexAttribi(index, vals);
8077 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008078 }
8079 catch(std::bad_alloc&)
8080 {
8081 return gl::error(GL_OUT_OF_MEMORY);
8082 }
8083}
8084
8085void __stdcall glVertexAttribI4ui(GLuint index, GLuint x, GLuint y, GLuint z, GLuint w)
8086{
8087 EVENT("(GLuint index = %u, GLuint x = %u, GLuint y = %u, GLuint z = %u, GLuint w = %u)",
8088 index, x, y, z, w);
8089
8090 try
8091 {
8092 gl::Context *context = gl::getNonLostContext();
8093
8094 if (context)
8095 {
8096 if (context->getClientVersion() < 3)
8097 {
8098 return gl::error(GL_INVALID_OPERATION);
8099 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008100
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00008101 if (index >= gl::MAX_VERTEX_ATTRIBS)
8102 {
8103 return gl::error(GL_INVALID_VALUE);
8104 }
8105
8106 GLuint vals[4] = { x, y, z, w };
8107 context->setVertexAttribu(index, vals);
8108 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008109 }
8110 catch(std::bad_alloc&)
8111 {
8112 return gl::error(GL_OUT_OF_MEMORY);
8113 }
8114}
8115
8116void __stdcall glVertexAttribI4iv(GLuint index, const GLint* v)
8117{
8118 EVENT("(GLuint index = %u, const GLint* v = 0x%0.8p)", index, v);
8119
8120 try
8121 {
8122 gl::Context *context = gl::getNonLostContext();
8123
8124 if (context)
8125 {
8126 if (context->getClientVersion() < 3)
8127 {
8128 return gl::error(GL_INVALID_OPERATION);
8129 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008130
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00008131 if (index >= gl::MAX_VERTEX_ATTRIBS)
8132 {
8133 return gl::error(GL_INVALID_VALUE);
8134 }
8135
8136 context->setVertexAttribi(index, v);
8137 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008138 }
8139 catch(std::bad_alloc&)
8140 {
8141 return gl::error(GL_OUT_OF_MEMORY);
8142 }
8143}
8144
8145void __stdcall glVertexAttribI4uiv(GLuint index, const GLuint* v)
8146{
8147 EVENT("(GLuint index = %u, const GLuint* v = 0x%0.8p)", index, v);
8148
8149 try
8150 {
8151 gl::Context *context = gl::getNonLostContext();
8152
8153 if (context)
8154 {
8155 if (context->getClientVersion() < 3)
8156 {
8157 return gl::error(GL_INVALID_OPERATION);
8158 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008159
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00008160 if (index >= gl::MAX_VERTEX_ATTRIBS)
8161 {
8162 return gl::error(GL_INVALID_VALUE);
8163 }
8164
8165 context->setVertexAttribu(index, v);
8166 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008167 }
8168 catch(std::bad_alloc&)
8169 {
8170 return gl::error(GL_OUT_OF_MEMORY);
8171 }
8172}
8173
8174void __stdcall glGetUniformuiv(GLuint program, GLint location, GLuint* params)
8175{
8176 EVENT("(GLuint program = %u, GLint location = %d, GLuint* params = 0x%0.8p)",
8177 program, location, params);
8178
8179 try
8180 {
8181 gl::Context *context = gl::getNonLostContext();
8182
8183 if (context)
8184 {
8185 if (context->getClientVersion() < 3)
8186 {
8187 return gl::error(GL_INVALID_OPERATION);
8188 }
8189 }
8190
8191 UNIMPLEMENTED();
8192 }
8193 catch(std::bad_alloc&)
8194 {
8195 return gl::error(GL_OUT_OF_MEMORY);
8196 }
8197}
8198
8199GLint __stdcall glGetFragDataLocation(GLuint program, const GLchar *name)
8200{
8201 EVENT("(GLuint program = %u, const GLchar *name = 0x%0.8p)",
8202 program, name);
8203
8204 try
8205 {
8206 gl::Context *context = gl::getNonLostContext();
8207
8208 if (context)
8209 {
8210 if (context->getClientVersion() < 3)
8211 {
8212 return gl::error(GL_INVALID_OPERATION, 0);
8213 }
8214 }
8215
8216 UNIMPLEMENTED();
8217 }
8218 catch(std::bad_alloc&)
8219 {
8220 return gl::error(GL_OUT_OF_MEMORY, 0);
8221 }
8222
8223 return 0;
8224}
8225
8226void __stdcall glUniform1ui(GLint location, GLuint v0)
8227{
8228 EVENT("(GLint location = %d, GLuint v0 = %u)",
8229 location, v0);
8230
8231 try
8232 {
8233 gl::Context *context = gl::getNonLostContext();
8234
8235 if (context)
8236 {
8237 if (context->getClientVersion() < 3)
8238 {
8239 return gl::error(GL_INVALID_OPERATION);
8240 }
8241 }
8242
8243 UNIMPLEMENTED();
8244 }
8245 catch(std::bad_alloc&)
8246 {
8247 return gl::error(GL_OUT_OF_MEMORY);
8248 }
8249}
8250
8251void __stdcall glUniform2ui(GLint location, GLuint v0, GLuint v1)
8252{
8253 EVENT("(GLint location = %d, GLuint v0 = %u, GLuint v1 = %u)",
8254 location, v0, v1);
8255
8256 try
8257 {
8258 gl::Context *context = gl::getNonLostContext();
8259
8260 if (context)
8261 {
8262 if (context->getClientVersion() < 3)
8263 {
8264 return gl::error(GL_INVALID_OPERATION);
8265 }
8266 }
8267
8268 UNIMPLEMENTED();
8269 }
8270 catch(std::bad_alloc&)
8271 {
8272 return gl::error(GL_OUT_OF_MEMORY);
8273 }
8274}
8275
8276void __stdcall glUniform3ui(GLint location, GLuint v0, GLuint v1, GLuint v2)
8277{
8278 EVENT("(GLint location = %d, GLuint v0 = %u, GLuint v1 = %u, GLuint v2 = %u)",
8279 location, v0, v1, v2);
8280
8281 try
8282 {
8283 gl::Context *context = gl::getNonLostContext();
8284
8285 if (context)
8286 {
8287 if (context->getClientVersion() < 3)
8288 {
8289 return gl::error(GL_INVALID_OPERATION);
8290 }
8291 }
8292
8293 UNIMPLEMENTED();
8294 }
8295 catch(std::bad_alloc&)
8296 {
8297 return gl::error(GL_OUT_OF_MEMORY);
8298 }
8299}
8300
8301void __stdcall glUniform4ui(GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3)
8302{
8303 EVENT("(GLint location = %d, GLuint v0 = %u, GLuint v1 = %u, GLuint v2 = %u, GLuint v3 = %u)",
8304 location, v0, v1, v2, v3);
8305
8306 try
8307 {
8308 gl::Context *context = gl::getNonLostContext();
8309
8310 if (context)
8311 {
8312 if (context->getClientVersion() < 3)
8313 {
8314 return gl::error(GL_INVALID_OPERATION);
8315 }
8316 }
8317
8318 UNIMPLEMENTED();
8319 }
8320 catch(std::bad_alloc&)
8321 {
8322 return gl::error(GL_OUT_OF_MEMORY);
8323 }
8324}
8325
8326void __stdcall glUniform1uiv(GLint location, GLsizei count, const GLuint* value)
8327{
8328 EVENT("(GLint location = %d, GLsizei count = %d, const GLuint* value = 0x%0.8p)",
8329 location, count, value);
8330
8331 try
8332 {
8333 gl::Context *context = gl::getNonLostContext();
8334
8335 if (context)
8336 {
8337 if (context->getClientVersion() < 3)
8338 {
8339 return gl::error(GL_INVALID_OPERATION);
8340 }
8341 }
8342
8343 UNIMPLEMENTED();
8344 }
8345 catch(std::bad_alloc&)
8346 {
8347 return gl::error(GL_OUT_OF_MEMORY);
8348 }
8349}
8350
8351void __stdcall glUniform2uiv(GLint location, GLsizei count, const GLuint* value)
8352{
8353 EVENT("(GLint location = %d, GLsizei count = %d, const GLuint* value = 0x%0.8p)",
8354 location, count, value);
8355
8356 try
8357 {
8358 gl::Context *context = gl::getNonLostContext();
8359
8360 if (context)
8361 {
8362 if (context->getClientVersion() < 3)
8363 {
8364 return gl::error(GL_INVALID_OPERATION);
8365 }
8366 }
8367
8368 UNIMPLEMENTED();
8369 }
8370 catch(std::bad_alloc&)
8371 {
8372 return gl::error(GL_OUT_OF_MEMORY);
8373 }
8374}
8375
8376void __stdcall glUniform3uiv(GLint location, GLsizei count, const GLuint* value)
8377{
8378 EVENT("(GLint location = %d, GLsizei count = %d, const GLuint* value)",
8379 location, count, value);
8380
8381 try
8382 {
8383 gl::Context *context = gl::getNonLostContext();
8384
8385 if (context)
8386 {
8387 if (context->getClientVersion() < 3)
8388 {
8389 return gl::error(GL_INVALID_OPERATION);
8390 }
8391 }
8392
8393 UNIMPLEMENTED();
8394 }
8395 catch(std::bad_alloc&)
8396 {
8397 return gl::error(GL_OUT_OF_MEMORY);
8398 }
8399}
8400
8401void __stdcall glUniform4uiv(GLint location, GLsizei count, const GLuint* value)
8402{
8403 EVENT("(GLint location = %d, GLsizei count = %d, const GLuint* value = 0x%0.8p)",
8404 location, count, value);
8405
8406 try
8407 {
8408 gl::Context *context = gl::getNonLostContext();
8409
8410 if (context)
8411 {
8412 if (context->getClientVersion() < 3)
8413 {
8414 return gl::error(GL_INVALID_OPERATION);
8415 }
8416 }
8417
8418 UNIMPLEMENTED();
8419 }
8420 catch(std::bad_alloc&)
8421 {
8422 return gl::error(GL_OUT_OF_MEMORY);
8423 }
8424}
8425
8426void __stdcall glClearBufferiv(GLenum buffer, GLint drawbuffer, const GLint* value)
8427{
8428 EVENT("(GLenum buffer = 0x%X, GLint drawbuffer = %d, const GLint* value = 0x%0.8p)",
8429 buffer, drawbuffer, value);
8430
8431 try
8432 {
8433 gl::Context *context = gl::getNonLostContext();
8434
8435 if (context)
8436 {
8437 if (context->getClientVersion() < 3)
8438 {
8439 return gl::error(GL_INVALID_OPERATION);
8440 }
8441 }
8442
8443 UNIMPLEMENTED();
8444 }
8445 catch(std::bad_alloc&)
8446 {
8447 return gl::error(GL_OUT_OF_MEMORY);
8448 }
8449}
8450
8451void __stdcall glClearBufferuiv(GLenum buffer, GLint drawbuffer, const GLuint* value)
8452{
8453 EVENT("(GLenum buffer = 0x%X, GLint drawbuffer = %d, const GLuint* value = 0x%0.8p)",
8454 buffer, drawbuffer, value);
8455
8456 try
8457 {
8458 gl::Context *context = gl::getNonLostContext();
8459
8460 if (context)
8461 {
8462 if (context->getClientVersion() < 3)
8463 {
8464 return gl::error(GL_INVALID_OPERATION);
8465 }
8466 }
8467
8468 UNIMPLEMENTED();
8469 }
8470 catch(std::bad_alloc&)
8471 {
8472 return gl::error(GL_OUT_OF_MEMORY);
8473 }
8474}
8475
8476void __stdcall glClearBufferfv(GLenum buffer, GLint drawbuffer, const GLfloat* value)
8477{
8478 EVENT("(GLenum buffer = 0x%X, GLint drawbuffer = %d, const GLfloat* value = 0x%0.8p)",
8479 buffer, drawbuffer, value);
8480
8481 try
8482 {
8483 gl::Context *context = gl::getNonLostContext();
8484
8485 if (context)
8486 {
8487 if (context->getClientVersion() < 3)
8488 {
8489 return gl::error(GL_INVALID_OPERATION);
8490 }
8491 }
8492
8493 UNIMPLEMENTED();
8494 }
8495 catch(std::bad_alloc&)
8496 {
8497 return gl::error(GL_OUT_OF_MEMORY);
8498 }
8499}
8500
8501void __stdcall glClearBufferfi(GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil)
8502{
8503 EVENT("(GLenum buffer = 0x%X, GLint drawbuffer = %d, GLfloat depth, GLint stencil = %d)",
8504 buffer, drawbuffer, depth, stencil);
8505
8506 try
8507 {
8508 gl::Context *context = gl::getNonLostContext();
8509
8510 if (context)
8511 {
8512 if (context->getClientVersion() < 3)
8513 {
8514 return gl::error(GL_INVALID_OPERATION);
8515 }
8516 }
8517
8518 UNIMPLEMENTED();
8519 }
8520 catch(std::bad_alloc&)
8521 {
8522 return gl::error(GL_OUT_OF_MEMORY);
8523 }
8524}
8525
8526const GLubyte* __stdcall glGetStringi(GLenum name, GLuint index)
8527{
8528 EVENT("(GLenum name = 0x%X, GLuint index = %u)", name, index);
8529
8530 try
8531 {
8532 gl::Context *context = gl::getNonLostContext();
8533
8534 if (context)
8535 {
8536 if (context->getClientVersion() < 3)
8537 {
8538 return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLubyte*>(NULL));
8539 }
8540 }
8541
8542 UNIMPLEMENTED();
8543 }
8544 catch(std::bad_alloc&)
8545 {
8546 return gl::error(GL_OUT_OF_MEMORY, reinterpret_cast<GLubyte*>(NULL));
8547 }
8548
8549 return NULL;
8550}
8551
8552void __stdcall glCopyBufferSubData(GLenum readTarget, GLenum writeTarget, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size)
8553{
8554 EVENT("(GLenum readTarget = 0x%X, GLenum writeTarget = 0x%X, GLintptr readOffset = %d, GLintptr writeOffset = %d, GLsizeiptr size = %d)",
8555 readTarget, writeTarget, readOffset, writeOffset, size);
8556
8557 try
8558 {
8559 gl::Context *context = gl::getNonLostContext();
8560
8561 if (context)
8562 {
8563 if (context->getClientVersion() < 3)
8564 {
8565 return gl::error(GL_INVALID_OPERATION);
8566 }
8567 }
8568
8569 UNIMPLEMENTED();
8570 }
8571 catch(std::bad_alloc&)
8572 {
8573 return gl::error(GL_OUT_OF_MEMORY);
8574 }
8575}
8576
8577void __stdcall glGetUniformIndices(GLuint program, GLsizei uniformCount, const GLchar* const* uniformNames, GLuint* uniformIndices)
8578{
8579 EVENT("(GLuint program = %u, GLsizei uniformCount = %d, const GLchar* const* uniformNames = 0x%0.8p, GLuint* uniformIndices = 0x%0.8p)",
8580 program, uniformCount, uniformNames, uniformIndices);
8581
8582 try
8583 {
8584 gl::Context *context = gl::getNonLostContext();
8585
8586 if (context)
8587 {
8588 if (context->getClientVersion() < 3)
8589 {
8590 return gl::error(GL_INVALID_OPERATION);
8591 }
8592 }
8593
8594 UNIMPLEMENTED();
8595 }
8596 catch(std::bad_alloc&)
8597 {
8598 return gl::error(GL_OUT_OF_MEMORY);
8599 }
8600}
8601
8602void __stdcall glGetActiveUniformsiv(GLuint program, GLsizei uniformCount, const GLuint* uniformIndices, GLenum pname, GLint* params)
8603{
8604 EVENT("(GLuint program = %u, GLsizei uniformCount = %d, const GLuint* uniformIndices = 0x%0.8p, GLenum pname = 0x%X, GLint* params = 0x%0.8p)",
8605 program, uniformCount, uniformIndices, pname, params);
8606
8607 try
8608 {
8609 gl::Context *context = gl::getNonLostContext();
8610
8611 if (context)
8612 {
8613 if (context->getClientVersion() < 3)
8614 {
8615 return gl::error(GL_INVALID_OPERATION);
8616 }
8617 }
8618
8619 UNIMPLEMENTED();
8620 }
8621 catch(std::bad_alloc&)
8622 {
8623 return gl::error(GL_OUT_OF_MEMORY);
8624 }
8625}
8626
8627GLuint __stdcall glGetUniformBlockIndex(GLuint program, const GLchar* uniformBlockName)
8628{
8629 EVENT("(GLuint program = %u, const GLchar* uniformBlockName = 0x%0.8p)", program, uniformBlockName);
8630
8631 try
8632 {
8633 gl::Context *context = gl::getNonLostContext();
8634
8635 if (context)
8636 {
8637 if (context->getClientVersion() < 3)
8638 {
8639 return gl::error(GL_INVALID_OPERATION, 0);
8640 }
8641 }
8642
8643 UNIMPLEMENTED();
8644 }
8645 catch(std::bad_alloc&)
8646 {
8647 return gl::error(GL_OUT_OF_MEMORY, 0);
8648 }
8649
8650 return 0;
8651}
8652
8653void __stdcall glGetActiveUniformBlockiv(GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint* params)
8654{
8655 EVENT("(GLuint program = %u, GLuint uniformBlockIndex = %u, GLenum pname = 0x%X, GLint* params = 0x%0.8p)",
8656 program, uniformBlockIndex, pname, params);
8657
8658 try
8659 {
8660 gl::Context *context = gl::getNonLostContext();
8661
8662 if (context)
8663 {
8664 if (context->getClientVersion() < 3)
8665 {
8666 return gl::error(GL_INVALID_OPERATION);
8667 }
8668 }
8669
8670 UNIMPLEMENTED();
8671 }
8672 catch(std::bad_alloc&)
8673 {
8674 return gl::error(GL_OUT_OF_MEMORY);
8675 }
8676}
8677
8678void __stdcall glGetActiveUniformBlockName(GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei* length, GLchar* uniformBlockName)
8679{
8680 EVENT("(GLuint program = %u, GLuint uniformBlockIndex = %u, GLsizei bufSize = %d, GLsizei* length = 0x%0.8p, GLchar* uniformBlockName = 0x%0.8p)",
8681 program, uniformBlockIndex, bufSize, length, uniformBlockName);
8682
8683 try
8684 {
8685 gl::Context *context = gl::getNonLostContext();
8686
8687 if (context)
8688 {
8689 if (context->getClientVersion() < 3)
8690 {
8691 return gl::error(GL_INVALID_OPERATION);
8692 }
8693 }
8694
8695 UNIMPLEMENTED();
8696 }
8697 catch(std::bad_alloc&)
8698 {
8699 return gl::error(GL_OUT_OF_MEMORY);
8700 }
8701}
8702
8703void __stdcall glUniformBlockBinding(GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding)
8704{
8705 EVENT("(GLuint program = %u, GLuint uniformBlockIndex = %u, GLuint uniformBlockBinding = %u)",
8706 program, uniformBlockIndex, uniformBlockBinding);
8707
8708 try
8709 {
8710 gl::Context *context = gl::getNonLostContext();
8711
8712 if (context)
8713 {
8714 if (context->getClientVersion() < 3)
8715 {
8716 return gl::error(GL_INVALID_OPERATION);
8717 }
8718 }
8719
8720 UNIMPLEMENTED();
8721 }
8722 catch(std::bad_alloc&)
8723 {
8724 return gl::error(GL_OUT_OF_MEMORY);
8725 }
8726}
8727
8728void __stdcall glDrawArraysInstanced(GLenum mode, GLint first, GLsizei count, GLsizei instanceCount)
8729{
8730 EVENT("(GLenum mode = 0x%X, GLint first = %d, GLsizei count = %d, GLsizei instanceCount = %d)",
8731 mode, first, count, instanceCount);
8732
8733 try
8734 {
8735 gl::Context *context = gl::getNonLostContext();
8736
8737 if (context)
8738 {
8739 if (context->getClientVersion() < 3)
8740 {
8741 return gl::error(GL_INVALID_OPERATION);
8742 }
8743 }
8744
8745 UNIMPLEMENTED();
8746 }
8747 catch(std::bad_alloc&)
8748 {
8749 return gl::error(GL_OUT_OF_MEMORY);
8750 }
8751}
8752
8753void __stdcall glDrawElementsInstanced(GLenum mode, GLsizei count, GLenum type, const GLvoid* indices, GLsizei instanceCount)
8754{
8755 EVENT("(GLenum mode = 0x%X, GLsizei count = %d, GLenum type = 0x%X, const GLvoid* indices = 0x%0.8p, GLsizei instanceCount = %d)",
8756 mode, count, type, indices, instanceCount);
8757
8758 try
8759 {
8760 gl::Context *context = gl::getNonLostContext();
8761
8762 if (context)
8763 {
8764 if (context->getClientVersion() < 3)
8765 {
8766 return gl::error(GL_INVALID_OPERATION);
8767 }
8768 }
8769
8770 UNIMPLEMENTED();
8771 }
8772 catch(std::bad_alloc&)
8773 {
8774 return gl::error(GL_OUT_OF_MEMORY);
8775 }
8776}
8777
8778GLsync __stdcall glFenceSync(GLenum condition, GLbitfield flags)
8779{
8780 EVENT("(GLenum condition = 0x%X, GLbitfield flags = 0x%X)", condition, flags);
8781
8782 try
8783 {
8784 gl::Context *context = gl::getNonLostContext();
8785
8786 if (context)
8787 {
8788 if (context->getClientVersion() < 3)
8789 {
8790 return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLsync>(NULL));
8791 }
8792 }
8793
8794 UNIMPLEMENTED();
8795 }
8796 catch(std::bad_alloc&)
8797 {
8798 return gl::error(GL_OUT_OF_MEMORY, reinterpret_cast<GLsync>(NULL));
8799 }
8800
8801 return NULL;
8802}
8803
8804GLboolean __stdcall glIsSync(GLsync sync)
8805{
8806 EVENT("(GLsync sync = 0x%0.8p)", sync);
8807
8808 try
8809 {
8810 gl::Context *context = gl::getNonLostContext();
8811
8812 if (context)
8813 {
8814 if (context->getClientVersion() < 3)
8815 {
8816 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
8817 }
8818 }
8819
8820 UNIMPLEMENTED();
8821 }
8822 catch(std::bad_alloc&)
8823 {
8824 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
8825 }
8826
8827 return GL_FALSE;
8828}
8829
8830void __stdcall glDeleteSync(GLsync sync)
8831{
8832 EVENT("(GLsync sync = 0x%0.8p)", sync);
8833
8834 try
8835 {
8836 gl::Context *context = gl::getNonLostContext();
8837
8838 if (context)
8839 {
8840 if (context->getClientVersion() < 3)
8841 {
8842 return gl::error(GL_INVALID_OPERATION);
8843 }
8844 }
8845
8846 UNIMPLEMENTED();
8847 }
8848 catch(std::bad_alloc&)
8849 {
8850 return gl::error(GL_OUT_OF_MEMORY);
8851 }
8852}
8853
8854GLenum __stdcall glClientWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout)
8855{
8856 EVENT("(GLsync sync = 0x%0.8p, GLbitfield flags = 0x%X, GLuint64 timeout = %llu)",
8857 sync, flags, timeout);
8858
8859 try
8860 {
8861 gl::Context *context = gl::getNonLostContext();
8862
8863 if (context)
8864 {
8865 if (context->getClientVersion() < 3)
8866 {
8867 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
8868 }
8869 }
8870
8871 UNIMPLEMENTED();
8872 }
8873 catch(std::bad_alloc&)
8874 {
8875 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
8876 }
8877
8878 return GL_FALSE;
8879}
8880
8881void __stdcall glWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout)
8882{
8883 EVENT("(GLsync sync = 0x%0.8p, GLbitfield flags = 0x%X, GLuint64 timeout = %llu)",
8884 sync, flags, timeout);
8885
8886 try
8887 {
8888 gl::Context *context = gl::getNonLostContext();
8889
8890 if (context)
8891 {
8892 if (context->getClientVersion() < 3)
8893 {
8894 return gl::error(GL_INVALID_OPERATION);
8895 }
8896 }
8897
8898 UNIMPLEMENTED();
8899 }
8900 catch(std::bad_alloc&)
8901 {
8902 return gl::error(GL_OUT_OF_MEMORY);
8903 }
8904}
8905
8906void __stdcall glGetInteger64v(GLenum pname, GLint64* params)
8907{
8908 EVENT("(GLenum pname = 0x%X, GLint64* params = 0x%0.8p)",
8909 pname, params);
8910
8911 try
8912 {
8913 gl::Context *context = gl::getNonLostContext();
8914
8915 if (context)
8916 {
8917 if (context->getClientVersion() < 3)
8918 {
8919 return gl::error(GL_INVALID_OPERATION);
8920 }
8921 }
8922
8923 UNIMPLEMENTED();
8924 }
8925 catch(std::bad_alloc&)
8926 {
8927 return gl::error(GL_OUT_OF_MEMORY);
8928 }
8929}
8930
8931void __stdcall glGetSynciv(GLsync sync, GLenum pname, GLsizei bufSize, GLsizei* length, GLint* values)
8932{
8933 EVENT("(GLsync sync = 0x%0.8p, GLenum pname = 0x%X, GLsizei bufSize = %d, GLsizei* length = 0x%0.8p, GLint* values = 0x%0.8p)",
8934 sync, pname, bufSize, length, values);
8935
8936 try
8937 {
8938 gl::Context *context = gl::getNonLostContext();
8939
8940 if (context)
8941 {
8942 if (context->getClientVersion() < 3)
8943 {
8944 return gl::error(GL_INVALID_OPERATION);
8945 }
8946 }
8947
8948 UNIMPLEMENTED();
8949 }
8950 catch(std::bad_alloc&)
8951 {
8952 return gl::error(GL_OUT_OF_MEMORY);
8953 }
8954}
8955
8956void __stdcall glGetInteger64i_v(GLenum target, GLuint index, GLint64* data)
8957{
8958 EVENT("(GLenum target = 0x%X, GLuint index = %u, GLint64* data = 0x%0.8p)",
8959 target, index, data);
8960
8961 try
8962 {
8963 gl::Context *context = gl::getNonLostContext();
8964
8965 if (context)
8966 {
8967 if (context->getClientVersion() < 3)
8968 {
8969 return gl::error(GL_INVALID_OPERATION);
8970 }
8971 }
8972
8973 UNIMPLEMENTED();
8974 }
8975 catch(std::bad_alloc&)
8976 {
8977 return gl::error(GL_OUT_OF_MEMORY);
8978 }
8979}
8980
8981void __stdcall glGetBufferParameteri64v(GLenum target, GLenum pname, GLint64* params)
8982{
8983 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLint64* params = 0x%0.8p)",
8984 target, pname, params);
8985
8986 try
8987 {
8988 gl::Context *context = gl::getNonLostContext();
8989
8990 if (context)
8991 {
8992 if (context->getClientVersion() < 3)
8993 {
8994 return gl::error(GL_INVALID_OPERATION);
8995 }
8996 }
8997
8998 UNIMPLEMENTED();
8999 }
9000 catch(std::bad_alloc&)
9001 {
9002 return gl::error(GL_OUT_OF_MEMORY);
9003 }
9004}
9005
9006void __stdcall glGenSamplers(GLsizei count, GLuint* samplers)
9007{
9008 EVENT("(GLsizei count = %d, GLuint* samplers = 0x%0.8p)", count, samplers);
9009
9010 try
9011 {
9012 gl::Context *context = gl::getNonLostContext();
9013
9014 if (context)
9015 {
9016 if (context->getClientVersion() < 3)
9017 {
9018 return gl::error(GL_INVALID_OPERATION);
9019 }
9020 }
9021
9022 UNIMPLEMENTED();
9023 }
9024 catch(std::bad_alloc&)
9025 {
9026 return gl::error(GL_OUT_OF_MEMORY);
9027 }
9028}
9029
9030void __stdcall glDeleteSamplers(GLsizei count, const GLuint* samplers)
9031{
9032 EVENT("(GLsizei count = %d, const GLuint* samplers = 0x%0.8p)", count, samplers);
9033
9034 try
9035 {
9036 gl::Context *context = gl::getNonLostContext();
9037
9038 if (context)
9039 {
9040 if (context->getClientVersion() < 3)
9041 {
9042 return gl::error(GL_INVALID_OPERATION);
9043 }
9044 }
9045
9046 UNIMPLEMENTED();
9047 }
9048 catch(std::bad_alloc&)
9049 {
9050 return gl::error(GL_OUT_OF_MEMORY);
9051 }
9052}
9053
9054GLboolean __stdcall glIsSampler(GLuint sampler)
9055{
9056 EVENT("(GLuint sampler = %u)", sampler);
9057
9058 try
9059 {
9060 gl::Context *context = gl::getNonLostContext();
9061
9062 if (context)
9063 {
9064 if (context->getClientVersion() < 3)
9065 {
9066 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
9067 }
9068 }
9069
9070 UNIMPLEMENTED();
9071 }
9072 catch(std::bad_alloc&)
9073 {
9074 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
9075 }
9076
9077 return GL_FALSE;
9078}
9079
9080void __stdcall glBindSampler(GLuint unit, GLuint sampler)
9081{
9082 EVENT("(GLuint unit = %u, GLuint sampler = %u)", unit, sampler);
9083
9084 try
9085 {
9086 gl::Context *context = gl::getNonLostContext();
9087
9088 if (context)
9089 {
9090 if (context->getClientVersion() < 3)
9091 {
9092 return gl::error(GL_INVALID_OPERATION);
9093 }
9094 }
9095
9096 UNIMPLEMENTED();
9097 }
9098 catch(std::bad_alloc&)
9099 {
9100 return gl::error(GL_OUT_OF_MEMORY);
9101 }
9102}
9103
9104void __stdcall glSamplerParameteri(GLuint sampler, GLenum pname, GLint param)
9105{
9106 EVENT("(GLuint sampler = %u, GLenum pname = 0x%X, GLint param = %d)", sampler, pname, param);
9107
9108 try
9109 {
9110 gl::Context *context = gl::getNonLostContext();
9111
9112 if (context)
9113 {
9114 if (context->getClientVersion() < 3)
9115 {
9116 return gl::error(GL_INVALID_OPERATION);
9117 }
9118 }
9119
9120 UNIMPLEMENTED();
9121 }
9122 catch(std::bad_alloc&)
9123 {
9124 return gl::error(GL_OUT_OF_MEMORY);
9125 }
9126}
9127
9128void __stdcall glSamplerParameteriv(GLuint sampler, GLenum pname, const GLint* param)
9129{
9130 EVENT("(GLuint sampler = %u, GLenum pname = 0x%X, const GLint* param = 0x%0.8p)",
9131 sampler, pname, param);
9132
9133 try
9134 {
9135 gl::Context *context = gl::getNonLostContext();
9136
9137 if (context)
9138 {
9139 if (context->getClientVersion() < 3)
9140 {
9141 return gl::error(GL_INVALID_OPERATION);
9142 }
9143 }
9144
9145 UNIMPLEMENTED();
9146 }
9147 catch(std::bad_alloc&)
9148 {
9149 return gl::error(GL_OUT_OF_MEMORY);
9150 }
9151}
9152
9153void __stdcall glSamplerParameterf(GLuint sampler, GLenum pname, GLfloat param)
9154{
9155 EVENT("(GLuint sampler = %u, GLenum pname = 0x%X, GLfloat param = %g)", sampler, pname, param);
9156
9157 try
9158 {
9159 gl::Context *context = gl::getNonLostContext();
9160
9161 if (context)
9162 {
9163 if (context->getClientVersion() < 3)
9164 {
9165 return gl::error(GL_INVALID_OPERATION);
9166 }
9167 }
9168
9169 UNIMPLEMENTED();
9170 }
9171 catch(std::bad_alloc&)
9172 {
9173 return gl::error(GL_OUT_OF_MEMORY);
9174 }
9175}
9176
9177void __stdcall glSamplerParameterfv(GLuint sampler, GLenum pname, const GLfloat* param)
9178{
9179 EVENT("(GLuint sampler = %u, GLenum pname = 0x%X, const GLfloat* param = 0x%0.8p)", sampler, pname, param);
9180
9181 try
9182 {
9183 gl::Context *context = gl::getNonLostContext();
9184
9185 if (context)
9186 {
9187 if (context->getClientVersion() < 3)
9188 {
9189 return gl::error(GL_INVALID_OPERATION);
9190 }
9191 }
9192
9193 UNIMPLEMENTED();
9194 }
9195 catch(std::bad_alloc&)
9196 {
9197 return gl::error(GL_OUT_OF_MEMORY);
9198 }
9199}
9200
9201void __stdcall glGetSamplerParameteriv(GLuint sampler, GLenum pname, GLint* params)
9202{
9203 EVENT("(GLuint sampler = %u, GLenum pname = 0x%X, GLint* params = 0x%0.8p)", sampler, pname, params);
9204
9205 try
9206 {
9207 gl::Context *context = gl::getNonLostContext();
9208
9209 if (context)
9210 {
9211 if (context->getClientVersion() < 3)
9212 {
9213 return gl::error(GL_INVALID_OPERATION);
9214 }
9215 }
9216
9217 UNIMPLEMENTED();
9218 }
9219 catch(std::bad_alloc&)
9220 {
9221 return gl::error(GL_OUT_OF_MEMORY);
9222 }
9223}
9224
9225void __stdcall glGetSamplerParameterfv(GLuint sampler, GLenum pname, GLfloat* params)
9226{
9227 EVENT("(GLuint sample = %ur, GLenum pname = 0x%X, GLfloat* params = 0x%0.8p)", sampler, pname, params);
9228
9229 try
9230 {
9231 gl::Context *context = gl::getNonLostContext();
9232
9233 if (context)
9234 {
9235 if (context->getClientVersion() < 3)
9236 {
9237 return gl::error(GL_INVALID_OPERATION);
9238 }
9239 }
9240
9241 UNIMPLEMENTED();
9242 }
9243 catch(std::bad_alloc&)
9244 {
9245 return gl::error(GL_OUT_OF_MEMORY);
9246 }
9247}
9248
9249void __stdcall glVertexAttribDivisor(GLuint index, GLuint divisor)
9250{
9251 EVENT("(GLuint index = %u, GLuint divisor = %u)", index, divisor);
9252
9253 try
9254 {
shannon.woods%transgaming.com@gtempaccount.com8736bd62013-04-13 03:35:41 +00009255 if (index >= gl::MAX_VERTEX_ATTRIBS)
9256 {
9257 return gl::error(GL_INVALID_VALUE);
9258 }
9259
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009260 gl::Context *context = gl::getNonLostContext();
9261
9262 if (context)
9263 {
9264 if (context->getClientVersion() < 3)
9265 {
9266 return gl::error(GL_INVALID_OPERATION);
9267 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009268
shannon.woods%transgaming.com@gtempaccount.com8736bd62013-04-13 03:35:41 +00009269 context->setVertexAttribDivisor(index, divisor);
9270 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009271 }
9272 catch(std::bad_alloc&)
9273 {
9274 return gl::error(GL_OUT_OF_MEMORY);
9275 }
9276}
9277
9278void __stdcall glBindTransformFeedback(GLenum target, GLuint id)
9279{
9280 EVENT("(GLenum target = 0x%X, GLuint id = %u)", target, id);
9281
9282 try
9283 {
9284 gl::Context *context = gl::getNonLostContext();
9285
9286 if (context)
9287 {
9288 if (context->getClientVersion() < 3)
9289 {
9290 return gl::error(GL_INVALID_OPERATION);
9291 }
9292 }
9293
9294 UNIMPLEMENTED();
9295 }
9296 catch(std::bad_alloc&)
9297 {
9298 return gl::error(GL_OUT_OF_MEMORY);
9299 }
9300}
9301
9302void __stdcall glDeleteTransformFeedbacks(GLsizei n, const GLuint* ids)
9303{
9304 EVENT("(GLsizei n = %d, const GLuint* ids = 0x%0.8p)", n, ids);
9305
9306 try
9307 {
9308 gl::Context *context = gl::getNonLostContext();
9309
9310 if (context)
9311 {
9312 if (context->getClientVersion() < 3)
9313 {
9314 return gl::error(GL_INVALID_OPERATION);
9315 }
9316 }
9317
9318 UNIMPLEMENTED();
9319 }
9320 catch(std::bad_alloc&)
9321 {
9322 return gl::error(GL_OUT_OF_MEMORY);
9323 }
9324}
9325
9326void __stdcall glGenTransformFeedbacks(GLsizei n, GLuint* ids)
9327{
9328 EVENT("(GLsizei n = %d, GLuint* ids = 0x%0.8p)", n, ids);
9329
9330 try
9331 {
9332 gl::Context *context = gl::getNonLostContext();
9333
9334 if (context)
9335 {
9336 if (context->getClientVersion() < 3)
9337 {
9338 return gl::error(GL_INVALID_OPERATION);
9339 }
9340 }
9341
9342 UNIMPLEMENTED();
9343 }
9344 catch(std::bad_alloc&)
9345 {
9346 return gl::error(GL_OUT_OF_MEMORY);
9347 }
9348}
9349
9350GLboolean __stdcall glIsTransformFeedback(GLuint id)
9351{
9352 EVENT("(GLuint id = %u)", id);
9353
9354 try
9355 {
9356 gl::Context *context = gl::getNonLostContext();
9357
9358 if (context)
9359 {
9360 if (context->getClientVersion() < 3)
9361 {
9362 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
9363 }
9364 }
9365
9366 UNIMPLEMENTED();
9367 }
9368 catch(std::bad_alloc&)
9369 {
9370 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
9371 }
9372
9373 return GL_FALSE;
9374}
9375
9376void __stdcall glPauseTransformFeedback(void)
9377{
9378 EVENT("(void)");
9379
9380 try
9381 {
9382 gl::Context *context = gl::getNonLostContext();
9383
9384 if (context)
9385 {
9386 if (context->getClientVersion() < 3)
9387 {
9388 return gl::error(GL_INVALID_OPERATION);
9389 }
9390 }
9391
9392 UNIMPLEMENTED();
9393 }
9394 catch(std::bad_alloc&)
9395 {
9396 return gl::error(GL_OUT_OF_MEMORY);
9397 }
9398}
9399
9400void __stdcall glResumeTransformFeedback(void)
9401{
9402 EVENT("(void)");
9403
9404 try
9405 {
9406 gl::Context *context = gl::getNonLostContext();
9407
9408 if (context)
9409 {
9410 if (context->getClientVersion() < 3)
9411 {
9412 return gl::error(GL_INVALID_OPERATION);
9413 }
9414 }
9415
9416 UNIMPLEMENTED();
9417 }
9418 catch(std::bad_alloc&)
9419 {
9420 return gl::error(GL_OUT_OF_MEMORY);
9421 }
9422}
9423
9424void __stdcall glGetProgramBinary(GLuint program, GLsizei bufSize, GLsizei* length, GLenum* binaryFormat, GLvoid* binary)
9425{
9426 EVENT("(GLuint program = %u, GLsizei bufSize = %d, GLsizei* length = 0x%0.8p, GLenum* binaryFormat = 0x%0.8p, GLvoid* binary = 0x%0.8p)",
9427 program, bufSize, length, binaryFormat, binary);
9428
9429 try
9430 {
9431 gl::Context *context = gl::getNonLostContext();
9432
9433 if (context)
9434 {
9435 if (context->getClientVersion() < 3)
9436 {
9437 return gl::error(GL_INVALID_OPERATION);
9438 }
9439 }
9440
9441 UNIMPLEMENTED();
9442 }
9443 catch(std::bad_alloc&)
9444 {
9445 return gl::error(GL_OUT_OF_MEMORY);
9446 }
9447}
9448
9449void __stdcall glProgramBinary(GLuint program, GLenum binaryFormat, const GLvoid* binary, GLsizei length)
9450{
9451 EVENT("(GLuint program = %u, GLenum binaryFormat = 0x%X, const GLvoid* binary = 0x%0.8p, GLsizei length = %d)",
9452 program, binaryFormat, binary, length);
9453
9454 try
9455 {
9456 gl::Context *context = gl::getNonLostContext();
9457
9458 if (context)
9459 {
9460 if (context->getClientVersion() < 3)
9461 {
9462 return gl::error(GL_INVALID_OPERATION);
9463 }
9464 }
9465
9466 UNIMPLEMENTED();
9467 }
9468 catch(std::bad_alloc&)
9469 {
9470 return gl::error(GL_OUT_OF_MEMORY);
9471 }
9472}
9473
9474void __stdcall glProgramParameteri(GLuint program, GLenum pname, GLint value)
9475{
9476 EVENT("(GLuint program = %u, GLenum pname = 0x%X, GLint value = %d)",
9477 program, pname, value);
9478
9479 try
9480 {
9481 gl::Context *context = gl::getNonLostContext();
9482
9483 if (context)
9484 {
9485 if (context->getClientVersion() < 3)
9486 {
9487 return gl::error(GL_INVALID_OPERATION);
9488 }
9489 }
9490
9491 UNIMPLEMENTED();
9492 }
9493 catch(std::bad_alloc&)
9494 {
9495 return gl::error(GL_OUT_OF_MEMORY);
9496 }
9497}
9498
9499void __stdcall glInvalidateFramebuffer(GLenum target, GLsizei numAttachments, const GLenum* attachments)
9500{
9501 EVENT("(GLenum target = 0x%X, GLsizei numAttachments = %d, const GLenum* attachments = 0x%0.8p)",
9502 target, numAttachments, attachments);
9503
9504 try
9505 {
9506 gl::Context *context = gl::getNonLostContext();
9507
9508 if (context)
9509 {
9510 if (context->getClientVersion() < 3)
9511 {
9512 return gl::error(GL_INVALID_OPERATION);
9513 }
9514 }
9515
9516 UNIMPLEMENTED();
9517 }
9518 catch(std::bad_alloc&)
9519 {
9520 return gl::error(GL_OUT_OF_MEMORY);
9521 }
9522}
9523
9524void __stdcall glInvalidateSubFramebuffer(GLenum target, GLsizei numAttachments, const GLenum* attachments, GLint x, GLint y, GLsizei width, GLsizei height)
9525{
9526 EVENT("(GLenum target = 0x%X, GLsizei numAttachments = %d, const GLenum* attachments = 0x%0.8p, GLint x = %d, "
9527 "GLint y = %d, GLsizei width = %d, GLsizei height = %d)",
9528 target, numAttachments, attachments, x, y, width, height);
9529
9530 try
9531 {
9532 gl::Context *context = gl::getNonLostContext();
9533
9534 if (context)
9535 {
9536 if (context->getClientVersion() < 3)
9537 {
9538 return gl::error(GL_INVALID_OPERATION);
9539 }
9540 }
9541
9542 UNIMPLEMENTED();
9543 }
9544 catch(std::bad_alloc&)
9545 {
9546 return gl::error(GL_OUT_OF_MEMORY);
9547 }
9548}
9549
9550void __stdcall glTexStorage2D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height)
9551{
9552 EVENT("(GLenum target = 0x%X, GLsizei levels = %d, GLenum internalformat = 0x%X, GLsizei width = %d, GLsizei height = %d)",
9553 target, levels, internalformat, width, height);
9554
9555 try
9556 {
9557 gl::Context *context = gl::getNonLostContext();
9558
9559 if (context)
9560 {
9561 if (context->getClientVersion() < 3)
9562 {
9563 return gl::error(GL_INVALID_OPERATION);
9564 }
9565 }
9566
9567 UNIMPLEMENTED();
9568 }
9569 catch(std::bad_alloc&)
9570 {
9571 return gl::error(GL_OUT_OF_MEMORY);
9572 }
9573}
9574
9575void __stdcall glTexStorage3D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth)
9576{
9577 EVENT("(GLenum target = 0x%X, GLsizei levels = %d, GLenum internalformat = 0x%X, GLsizei width = %d, "
9578 "GLsizei height = %d, GLsizei depth = %d)",
9579 target, levels, internalformat, width, height, depth);
9580
9581 try
9582 {
9583 gl::Context *context = gl::getNonLostContext();
9584
9585 if (context)
9586 {
9587 if (context->getClientVersion() < 3)
9588 {
9589 return gl::error(GL_INVALID_OPERATION);
9590 }
shannon.woods%transgaming.com@gtempaccount.com14eb55e2013-04-13 03:35:06 +00009591 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009592 }
9593 catch(std::bad_alloc&)
9594 {
9595 return gl::error(GL_OUT_OF_MEMORY);
9596 }
9597}
9598
9599void __stdcall glGetInternalformativ(GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize, GLint* params)
9600{
9601 EVENT("(GLenum target = 0x%X, GLenum internalformat = 0x%X, GLenum pname = 0x%X, GLsizei bufSize = %d, "
9602 "GLint* params = 0x%0.8p)",
9603 target, internalformat, pname, bufSize, params);
9604
9605 try
9606 {
9607 gl::Context *context = gl::getNonLostContext();
9608
9609 if (context)
9610 {
9611 if (context->getClientVersion() < 3)
9612 {
9613 return gl::error(GL_INVALID_OPERATION);
9614 }
9615 }
9616
9617 UNIMPLEMENTED();
9618 }
9619 catch(std::bad_alloc&)
9620 {
9621 return gl::error(GL_OUT_OF_MEMORY);
9622 }
9623}
9624
9625// Extension functions
9626
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +00009627void __stdcall glBlitFramebufferANGLE(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1,
9628 GLbitfield mask, GLenum filter)
9629{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00009630 EVENT("(GLint srcX0 = %d, GLint srcY0 = %d, GLint srcX1 = %d, GLint srcY1 = %d, "
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +00009631 "GLint dstX0 = %d, GLint dstY0 = %d, GLint dstX1 = %d, GLint dstY1 = %d, "
9632 "GLbitfield mask = 0x%X, GLenum filter = 0x%X)",
9633 srcX0, srcY0, srcX1, srcX1, dstX0, dstY0, dstX1, dstY1, mask, filter);
9634
9635 try
9636 {
9637 switch (filter)
9638 {
9639 case GL_NEAREST:
9640 break;
9641 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00009642 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +00009643 }
9644
9645 if ((mask & ~(GL_COLOR_BUFFER_BIT | GL_STENCIL_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)) != 0)
9646 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00009647 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +00009648 }
9649
9650 if (srcX1 - srcX0 != dstX1 - dstX0 || srcY1 - srcY0 != dstY1 - dstY0)
9651 {
9652 ERR("Scaling and flipping in BlitFramebufferANGLE not supported by this implementation");
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00009653 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +00009654 }
9655
daniel@transgaming.com9d788502011-11-09 17:46:55 +00009656 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +00009657
9658 if (context)
9659 {
9660 if (context->getReadFramebufferHandle() == context->getDrawFramebufferHandle())
9661 {
9662 ERR("Blits with the same source and destination framebuffer are not supported by this implementation.");
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00009663 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +00009664 }
9665
9666 context->blitFramebuffer(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask);
9667 }
9668 }
9669 catch(std::bad_alloc&)
9670 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00009671 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +00009672 }
9673}
9674
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00009675void __stdcall glTexImage3DOES(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth,
9676 GLint border, GLenum format, GLenum type, const GLvoid* pixels)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00009677{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00009678 EVENT("(GLenum target = 0x%X, GLint level = %d, GLenum internalformat = 0x%X, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00009679 "GLsizei width = %d, GLsizei height = %d, GLsizei depth = %d, GLint border = %d, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00009680 "GLenum format = 0x%X, GLenum type = 0x%x, const GLvoid* pixels = 0x%0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00009681 target, level, internalformat, width, height, depth, border, format, type, pixels);
9682
9683 try
9684 {
9685 UNIMPLEMENTED(); // FIXME
9686 }
9687 catch(std::bad_alloc&)
9688 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00009689 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00009690 }
9691}
daniel@transgaming.comce3d0f22010-05-04 03:35:14 +00009692
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00009693void __stdcall glGetProgramBinaryOES(GLuint program, GLsizei bufSize, GLsizei *length,
9694 GLenum *binaryFormat, void *binary)
9695{
apatrick@chromium.org90080e32012-07-09 22:15:33 +00009696 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 +00009697 program, bufSize, length, binaryFormat, binary);
9698
9699 try
9700 {
9701 gl::Context *context = gl::getNonLostContext();
9702
9703 if (context)
9704 {
9705 gl::Program *programObject = context->getProgram(program);
9706
daniel@transgaming.com716056c2012-07-24 18:38:59 +00009707 if (!programObject || !programObject->isLinked())
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 }
9711
9712 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
9713
9714 if (!programBinary)
9715 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00009716 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00009717 }
9718
apatrick@chromium.org90080e32012-07-09 22:15:33 +00009719 if (!programBinary->save(binary, bufSize, length))
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00009720 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00009721 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00009722 }
apatrick@chromium.org90080e32012-07-09 22:15:33 +00009723
9724 *binaryFormat = GL_PROGRAM_BINARY_ANGLE;
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00009725 }
9726 }
9727 catch(std::bad_alloc&)
9728 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00009729 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00009730 }
9731}
9732
9733void __stdcall glProgramBinaryOES(GLuint program, GLenum binaryFormat,
9734 const void *binary, GLint length)
9735{
9736 EVENT("(GLenum program = 0x%X, binaryFormat = 0x%x, binary = 0x%0.8p, length = %d)",
9737 program, binaryFormat, binary, length);
9738
9739 try
9740 {
9741 gl::Context *context = gl::getNonLostContext();
9742
9743 if (context)
9744 {
9745 if (binaryFormat != GL_PROGRAM_BINARY_ANGLE)
9746 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00009747 return gl::error(GL_INVALID_ENUM);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00009748 }
9749
9750 gl::Program *programObject = context->getProgram(program);
9751
9752 if (!programObject)
9753 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00009754 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00009755 }
9756
daniel@transgaming.com95d29422012-07-24 18:36:10 +00009757 context->setProgramBinary(program, binary, length);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00009758 }
9759 }
9760 catch(std::bad_alloc&)
9761 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00009762 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00009763 }
9764}
9765
shannon.woods%transgaming.com@gtempaccount.com4059a382013-04-13 03:31:16 +00009766void __stdcall glDrawBuffersEXT(GLsizei n, const GLenum *bufs)
9767{
9768 EVENT("(GLenum n = %d, bufs = 0x%0.8p)", n, bufs);
9769
9770 try
9771 {
9772 gl::Context *context = gl::getNonLostContext();
9773
9774 if (context)
9775 {
9776 if (n < 0 || (unsigned int)n > context->getMaximumRenderTargets())
9777 {
9778 return gl::error(GL_INVALID_VALUE);
9779 }
9780
9781 if (context->getDrawFramebufferHandle() == 0)
9782 {
shannon.woods%transgaming.com@gtempaccount.com2fa73c52013-04-13 03:37:20 +00009783 if (n != 1)
shannon.woods%transgaming.com@gtempaccount.com4059a382013-04-13 03:31:16 +00009784 {
9785 return gl::error(GL_INVALID_OPERATION);
9786 }
9787
shannon.woods%transgaming.com@gtempaccount.com2fa73c52013-04-13 03:37:20 +00009788 if (bufs[0] != GL_NONE && bufs[0] != GL_BACK)
shannon.woods%transgaming.com@gtempaccount.com4059a382013-04-13 03:31:16 +00009789 {
shannon.woods%transgaming.com@gtempaccount.com2fa73c52013-04-13 03:37:20 +00009790 return gl::error(GL_INVALID_OPERATION);
shannon.woods%transgaming.com@gtempaccount.com4059a382013-04-13 03:31:16 +00009791 }
9792 }
9793 else
9794 {
9795 for (int colorAttachment = 0; colorAttachment < n; colorAttachment++)
9796 {
9797 const GLenum attachment = GL_COLOR_ATTACHMENT0_EXT + colorAttachment;
9798 if (bufs[colorAttachment] != GL_NONE && bufs[colorAttachment] != attachment)
9799 {
9800 return gl::error(GL_INVALID_OPERATION);
9801 }
9802 }
9803 }
9804
9805 gl::Framebuffer *framebuffer = context->getDrawFramebuffer();
9806
9807 for (int colorAttachment = 0; colorAttachment < n; colorAttachment++)
9808 {
9809 framebuffer->setDrawBufferState(colorAttachment, bufs[colorAttachment]);
9810 }
shannon.woods%transgaming.com@gtempaccount.com2fa73c52013-04-13 03:37:20 +00009811
9812 for (int colorAttachment = n; colorAttachment < (int)context->getMaximumRenderTargets(); colorAttachment++)
9813 {
9814 framebuffer->setDrawBufferState(colorAttachment, GL_NONE);
9815 }
shannon.woods%transgaming.com@gtempaccount.com4059a382013-04-13 03:31:16 +00009816 }
9817 }
9818 catch (std::bad_alloc&)
9819 {
9820 return gl::error(GL_OUT_OF_MEMORY);
9821 }
9822}
9823
daniel@transgaming.comce3d0f22010-05-04 03:35:14 +00009824__eglMustCastToProperFunctionPointerType __stdcall glGetProcAddress(const char *procname)
9825{
9826 struct Extension
9827 {
9828 const char *name;
9829 __eglMustCastToProperFunctionPointerType address;
9830 };
9831
9832 static const Extension glExtensions[] =
9833 {
9834 {"glTexImage3DOES", (__eglMustCastToProperFunctionPointerType)glTexImage3DOES},
daniel@transgaming.com01868132010-08-24 19:21:17 +00009835 {"glBlitFramebufferANGLE", (__eglMustCastToProperFunctionPointerType)glBlitFramebufferANGLE},
daniel@transgaming.com1fe96c92011-01-14 15:08:44 +00009836 {"glRenderbufferStorageMultisampleANGLE", (__eglMustCastToProperFunctionPointerType)glRenderbufferStorageMultisampleANGLE},
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00009837 {"glDeleteFencesNV", (__eglMustCastToProperFunctionPointerType)glDeleteFencesNV},
9838 {"glGenFencesNV", (__eglMustCastToProperFunctionPointerType)glGenFencesNV},
9839 {"glIsFenceNV", (__eglMustCastToProperFunctionPointerType)glIsFenceNV},
9840 {"glTestFenceNV", (__eglMustCastToProperFunctionPointerType)glTestFenceNV},
9841 {"glGetFenceivNV", (__eglMustCastToProperFunctionPointerType)glGetFenceivNV},
9842 {"glFinishFenceNV", (__eglMustCastToProperFunctionPointerType)glFinishFenceNV},
9843 {"glSetFenceNV", (__eglMustCastToProperFunctionPointerType)glSetFenceNV},
zmo@google.coma574f782011-10-03 21:45:23 +00009844 {"glGetTranslatedShaderSourceANGLE", (__eglMustCastToProperFunctionPointerType)glGetTranslatedShaderSourceANGLE},
daniel@transgaming.com0bd1f2f2011-11-11 04:19:03 +00009845 {"glTexStorage2DEXT", (__eglMustCastToProperFunctionPointerType)glTexStorage2DEXT},
daniel@transgaming.com709ed112011-11-12 03:18:10 +00009846 {"glGetGraphicsResetStatusEXT", (__eglMustCastToProperFunctionPointerType)glGetGraphicsResetStatusEXT},
9847 {"glReadnPixelsEXT", (__eglMustCastToProperFunctionPointerType)glReadnPixelsEXT},
9848 {"glGetnUniformfvEXT", (__eglMustCastToProperFunctionPointerType)glGetnUniformfvEXT},
9849 {"glGetnUniformivEXT", (__eglMustCastToProperFunctionPointerType)glGetnUniformivEXT},
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00009850 {"glGenQueriesEXT", (__eglMustCastToProperFunctionPointerType)glGenQueriesEXT},
9851 {"glDeleteQueriesEXT", (__eglMustCastToProperFunctionPointerType)glDeleteQueriesEXT},
9852 {"glIsQueryEXT", (__eglMustCastToProperFunctionPointerType)glIsQueryEXT},
9853 {"glBeginQueryEXT", (__eglMustCastToProperFunctionPointerType)glBeginQueryEXT},
9854 {"glEndQueryEXT", (__eglMustCastToProperFunctionPointerType)glEndQueryEXT},
9855 {"glGetQueryivEXT", (__eglMustCastToProperFunctionPointerType)glGetQueryivEXT},
9856 {"glGetQueryObjectuivEXT", (__eglMustCastToProperFunctionPointerType)glGetQueryObjectuivEXT},
shannon.woods%transgaming.com@gtempaccount.com77d94722013-04-13 03:34:22 +00009857 {"glDrawBuffersEXT", (__eglMustCastToProperFunctionPointerType)glDrawBuffersEXT},
daniel@transgaming.comdce02fd2012-01-27 15:39:51 +00009858 {"glVertexAttribDivisorANGLE", (__eglMustCastToProperFunctionPointerType)glVertexAttribDivisorANGLE},
9859 {"glDrawArraysInstancedANGLE", (__eglMustCastToProperFunctionPointerType)glDrawArraysInstancedANGLE},
9860 {"glDrawElementsInstancedANGLE", (__eglMustCastToProperFunctionPointerType)glDrawElementsInstancedANGLE},
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00009861 {"glGetProgramBinaryOES", (__eglMustCastToProperFunctionPointerType)glGetProgramBinaryOES},
9862 {"glProgramBinaryOES", (__eglMustCastToProperFunctionPointerType)glProgramBinaryOES}, };
daniel@transgaming.comce3d0f22010-05-04 03:35:14 +00009863
shannon.woods@transgaming.comd438fd42013-02-28 23:17:45 +00009864 for (unsigned int ext = 0; ext < ArraySize(glExtensions); ext++)
daniel@transgaming.comce3d0f22010-05-04 03:35:14 +00009865 {
9866 if (strcmp(procname, glExtensions[ext].name) == 0)
9867 {
9868 return (__eglMustCastToProperFunctionPointerType)glExtensions[ext].address;
9869 }
9870 }
9871
9872 return NULL;
9873}
9874
daniel@transgaming.com17f548c2011-11-09 17:47:02 +00009875// Non-public functions used by EGL
9876
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00009877bool __stdcall glBindTexImage(egl::Surface *surface)
jbauman@chromium.orgae345802011-03-30 22:04:25 +00009878{
9879 EVENT("(egl::Surface* surface = 0x%0.8p)",
9880 surface);
9881
9882 try
9883 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00009884 gl::Context *context = gl::getNonLostContext();
jbauman@chromium.orgae345802011-03-30 22:04:25 +00009885
9886 if (context)
9887 {
9888 gl::Texture2D *textureObject = context->getTexture2D();
9889
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00009890 if (textureObject->isImmutable())
9891 {
9892 return false;
9893 }
9894
jbauman@chromium.orgae345802011-03-30 22:04:25 +00009895 if (textureObject)
9896 {
9897 textureObject->bindTexImage(surface);
9898 }
9899 }
9900 }
9901 catch(std::bad_alloc&)
9902 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00009903 return gl::error(GL_OUT_OF_MEMORY, false);
jbauman@chromium.orgae345802011-03-30 22:04:25 +00009904 }
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00009905
9906 return true;
jbauman@chromium.orgae345802011-03-30 22:04:25 +00009907}
9908
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00009909}