blob: 1baba69e219e8d18d68583b6814cf611d27812f8 [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 {
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +0000420 // Check ES3 specific targets
421 switch (target)
422 {
423 case GL_UNIFORM_BUFFER:
424 case GL_TRANSFORM_FEEDBACK_BUFFER:
425 if (context->getClientVersion() < 3)
426 {
427 return gl::error(GL_INVALID_ENUM);
428 }
429 }
430
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000431 switch (target)
432 {
433 case GL_ARRAY_BUFFER:
434 context->bindArrayBuffer(buffer);
435 return;
436 case GL_ELEMENT_ARRAY_BUFFER:
437 context->bindElementArrayBuffer(buffer);
438 return;
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +0000439 case GL_UNIFORM_BUFFER:
440 context->bindGenericUniformBuffer(buffer);
441 return;
442 case GL_TRANSFORM_FEEDBACK_BUFFER:
443 context->bindGenericUniformBuffer(buffer);
444 return;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000445 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000446 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000447 }
448 }
449 }
450 catch(std::bad_alloc&)
451 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000452 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000453 }
454}
455
456void __stdcall glBindFramebuffer(GLenum target, GLuint framebuffer)
457{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000458 EVENT("(GLenum target = 0x%X, GLuint framebuffer = %d)", target, framebuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000459
460 try
461 {
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +0000462 if (target != GL_FRAMEBUFFER && target != GL_DRAW_FRAMEBUFFER_ANGLE && target != GL_READ_FRAMEBUFFER_ANGLE)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000463 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000464 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000465 }
466
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000467 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000468
469 if (context)
470 {
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +0000471 if (target == GL_READ_FRAMEBUFFER_ANGLE || target == GL_FRAMEBUFFER)
472 {
473 context->bindReadFramebuffer(framebuffer);
474 }
475
476 if (target == GL_DRAW_FRAMEBUFFER_ANGLE || target == GL_FRAMEBUFFER)
477 {
478 context->bindDrawFramebuffer(framebuffer);
479 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000480 }
481 }
482 catch(std::bad_alloc&)
483 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000484 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000485 }
486}
487
488void __stdcall glBindRenderbuffer(GLenum target, GLuint renderbuffer)
489{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000490 EVENT("(GLenum target = 0x%X, GLuint renderbuffer = %d)", target, renderbuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000491
492 try
493 {
494 if (target != GL_RENDERBUFFER)
495 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000496 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000497 }
498
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000499 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000500
501 if (context)
502 {
503 context->bindRenderbuffer(renderbuffer);
504 }
505 }
506 catch(std::bad_alloc&)
507 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000508 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000509 }
510}
511
512void __stdcall glBindTexture(GLenum target, GLuint texture)
513{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000514 EVENT("(GLenum target = 0x%X, GLuint texture = %d)", target, texture);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000515
516 try
517 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000518 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000519
520 if (context)
521 {
522 gl::Texture *textureObject = context->getTexture(texture);
523
524 if (textureObject && textureObject->getTarget() != target && texture != 0)
525 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000526 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000527 }
528
529 switch (target)
530 {
531 case GL_TEXTURE_2D:
532 context->bindTexture2D(texture);
533 return;
534 case GL_TEXTURE_CUBE_MAP:
535 context->bindTextureCubeMap(texture);
536 return;
537 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000538 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000539 }
540 }
541 }
542 catch(std::bad_alloc&)
543 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000544 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000545 }
546}
547
548void __stdcall glBlendColor(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha)
549{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000550 EVENT("(GLclampf red = %f, GLclampf green = %f, GLclampf blue = %f, GLclampf alpha = %f)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +0000551 red, green, blue, alpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000552
553 try
554 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000555 gl::Context* context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000556
557 if (context)
558 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +0000559 context->setBlendColor(gl::clamp01(red), gl::clamp01(green), gl::clamp01(blue), gl::clamp01(alpha));
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000560 }
561 }
562 catch(std::bad_alloc&)
563 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000564 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000565 }
566}
567
568void __stdcall glBlendEquation(GLenum mode)
569{
570 glBlendEquationSeparate(mode, mode);
571}
572
573void __stdcall glBlendEquationSeparate(GLenum modeRGB, GLenum modeAlpha)
574{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000575 EVENT("(GLenum modeRGB = 0x%X, GLenum modeAlpha = 0x%X)", modeRGB, modeAlpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000576
577 try
578 {
shannon.woods%transgaming.com@gtempaccount.com00b6a0e2013-04-13 03:38:00 +0000579 gl::Context *context = gl::getNonLostContext();
580
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000581 switch (modeRGB)
582 {
583 case GL_FUNC_ADD:
584 case GL_FUNC_SUBTRACT:
585 case GL_FUNC_REVERSE_SUBTRACT:
586 break;
shannon.woods%transgaming.com@gtempaccount.com00b6a0e2013-04-13 03:38:00 +0000587
588 case GL_MIN:
589 case GL_MAX:
590 if (context && context->getClientVersion() < 3)
591 {
592 return gl::error(GL_INVALID_ENUM);
593 }
594 break;
595
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000596 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000597 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000598 }
599
600 switch (modeAlpha)
601 {
602 case GL_FUNC_ADD:
603 case GL_FUNC_SUBTRACT:
604 case GL_FUNC_REVERSE_SUBTRACT:
605 break;
shannon.woods%transgaming.com@gtempaccount.com00b6a0e2013-04-13 03:38:00 +0000606
607 case GL_MIN:
608 case GL_MAX:
609 if (context && context->getClientVersion() < 3)
610 {
611 return gl::error(GL_INVALID_ENUM);
612 }
613 break;
614
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000615 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000616 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000617 }
618
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000619 if (context)
620 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +0000621 context->setBlendEquation(modeRGB, modeAlpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000622 }
623 }
624 catch(std::bad_alloc&)
625 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000626 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000627 }
628}
629
630void __stdcall glBlendFunc(GLenum sfactor, GLenum dfactor)
631{
632 glBlendFuncSeparate(sfactor, dfactor, sfactor, dfactor);
633}
634
635void __stdcall glBlendFuncSeparate(GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha)
636{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000637 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 +0000638 srcRGB, dstRGB, srcAlpha, dstAlpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000639
640 try
641 {
642 switch (srcRGB)
643 {
644 case GL_ZERO:
645 case GL_ONE:
646 case GL_SRC_COLOR:
647 case GL_ONE_MINUS_SRC_COLOR:
648 case GL_DST_COLOR:
649 case GL_ONE_MINUS_DST_COLOR:
650 case GL_SRC_ALPHA:
651 case GL_ONE_MINUS_SRC_ALPHA:
652 case GL_DST_ALPHA:
653 case GL_ONE_MINUS_DST_ALPHA:
654 case GL_CONSTANT_COLOR:
655 case GL_ONE_MINUS_CONSTANT_COLOR:
656 case GL_CONSTANT_ALPHA:
657 case GL_ONE_MINUS_CONSTANT_ALPHA:
658 case GL_SRC_ALPHA_SATURATE:
659 break;
660 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000661 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000662 }
663
664 switch (dstRGB)
665 {
666 case GL_ZERO:
667 case GL_ONE:
668 case GL_SRC_COLOR:
669 case GL_ONE_MINUS_SRC_COLOR:
670 case GL_DST_COLOR:
671 case GL_ONE_MINUS_DST_COLOR:
672 case GL_SRC_ALPHA:
673 case GL_ONE_MINUS_SRC_ALPHA:
674 case GL_DST_ALPHA:
675 case GL_ONE_MINUS_DST_ALPHA:
676 case GL_CONSTANT_COLOR:
677 case GL_ONE_MINUS_CONSTANT_COLOR:
678 case GL_CONSTANT_ALPHA:
679 case GL_ONE_MINUS_CONSTANT_ALPHA:
680 break;
681 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000682 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000683 }
684
685 switch (srcAlpha)
686 {
687 case GL_ZERO:
688 case GL_ONE:
689 case GL_SRC_COLOR:
690 case GL_ONE_MINUS_SRC_COLOR:
691 case GL_DST_COLOR:
692 case GL_ONE_MINUS_DST_COLOR:
693 case GL_SRC_ALPHA:
694 case GL_ONE_MINUS_SRC_ALPHA:
695 case GL_DST_ALPHA:
696 case GL_ONE_MINUS_DST_ALPHA:
697 case GL_CONSTANT_COLOR:
698 case GL_ONE_MINUS_CONSTANT_COLOR:
699 case GL_CONSTANT_ALPHA:
700 case GL_ONE_MINUS_CONSTANT_ALPHA:
701 case GL_SRC_ALPHA_SATURATE:
702 break;
703 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000704 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000705 }
706
707 switch (dstAlpha)
708 {
709 case GL_ZERO:
710 case GL_ONE:
711 case GL_SRC_COLOR:
712 case GL_ONE_MINUS_SRC_COLOR:
713 case GL_DST_COLOR:
714 case GL_ONE_MINUS_DST_COLOR:
715 case GL_SRC_ALPHA:
716 case GL_ONE_MINUS_SRC_ALPHA:
717 case GL_DST_ALPHA:
718 case GL_ONE_MINUS_DST_ALPHA:
719 case GL_CONSTANT_COLOR:
720 case GL_ONE_MINUS_CONSTANT_COLOR:
721 case GL_CONSTANT_ALPHA:
722 case GL_ONE_MINUS_CONSTANT_ALPHA:
723 break;
724 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000725 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000726 }
727
daniel@transgaming.comfe453652010-03-16 06:23:28 +0000728 bool constantColorUsed = (srcRGB == GL_CONSTANT_COLOR || srcRGB == GL_ONE_MINUS_CONSTANT_COLOR ||
729 dstRGB == GL_CONSTANT_COLOR || dstRGB == GL_ONE_MINUS_CONSTANT_COLOR);
730
731 bool constantAlphaUsed = (srcRGB == GL_CONSTANT_ALPHA || srcRGB == GL_ONE_MINUS_CONSTANT_ALPHA ||
732 dstRGB == GL_CONSTANT_ALPHA || dstRGB == GL_ONE_MINUS_CONSTANT_ALPHA);
733
734 if (constantColorUsed && constantAlphaUsed)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000735 {
daniel@transgaming.comfe453652010-03-16 06:23:28 +0000736 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 +0000737 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000738 }
739
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000740 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000741
742 if (context)
743 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +0000744 context->setBlendFactors(srcRGB, dstRGB, srcAlpha, dstAlpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000745 }
746 }
747 catch(std::bad_alloc&)
748 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000749 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000750 }
751}
752
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +0000753void __stdcall glBufferData(GLenum target, GLsizeiptr size, const GLvoid* data, GLenum usage)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000754{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000755 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 +0000756 target, size, data, usage);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000757
758 try
759 {
760 if (size < 0)
761 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000762 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000763 }
764
shannon.woods%transgaming.com@gtempaccount.comf2db40b2013-04-13 03:37:09 +0000765 gl::Context *context = gl::getNonLostContext();
766
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000767 switch (usage)
768 {
769 case GL_STREAM_DRAW:
770 case GL_STATIC_DRAW:
771 case GL_DYNAMIC_DRAW:
772 break;
shannon.woods%transgaming.com@gtempaccount.comf2db40b2013-04-13 03:37:09 +0000773
774 case GL_STREAM_READ:
775 case GL_STREAM_COPY:
776 case GL_STATIC_READ:
777 case GL_STATIC_COPY:
778 case GL_DYNAMIC_READ:
779 case GL_DYNAMIC_COPY:
780 if (context && context->getClientVersion() < 3)
781 {
782 return gl::error(GL_INVALID_ENUM);
783 }
784 break;
785
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000786 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000787 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000788 }
789
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000790 if (context)
791 {
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +0000792 // Check ES3 specific targets
793 switch (target)
794 {
795 case GL_UNIFORM_BUFFER:
796 case GL_TRANSFORM_FEEDBACK_BUFFER:
797 if (context->getClientVersion() < 3)
798 {
799 return gl::error(GL_INVALID_ENUM);
800 }
801 }
802
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000803 gl::Buffer *buffer;
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +0000804
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000805 switch (target)
806 {
807 case GL_ARRAY_BUFFER:
808 buffer = context->getArrayBuffer();
809 break;
810 case GL_ELEMENT_ARRAY_BUFFER:
811 buffer = context->getElementArrayBuffer();
812 break;
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +0000813 case GL_TRANSFORM_FEEDBACK_BUFFER:
814 buffer = context->getGenericTransformFeedbackBuffer();
815 break;
816 case GL_UNIFORM_BUFFER:
817 buffer = context->getGenericUniformBuffer();
818 break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000819 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000820 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000821 }
822
823 if (!buffer)
824 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000825 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000826 }
827
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +0000828 buffer->bufferData(data, size, usage);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000829 }
830 }
831 catch(std::bad_alloc&)
832 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000833 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000834 }
835}
836
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +0000837void __stdcall glBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid* data)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000838{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000839 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 +0000840 target, offset, size, data);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000841
842 try
843 {
daniel@transgaming.comdefa1c32010-05-18 18:51:45 +0000844 if (size < 0 || offset < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000845 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000846 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000847 }
848
daniel@transgaming.comd4620a32010-03-21 04:31:28 +0000849 if (data == NULL)
850 {
851 return;
852 }
853
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000854 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +0000855
856 if (context)
857 {
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +0000858 // Check ES3 specific targets
859 switch (target)
860 {
861 case GL_UNIFORM_BUFFER:
862 case GL_TRANSFORM_FEEDBACK_BUFFER:
863 if (context->getClientVersion() < 3)
864 {
865 return gl::error(GL_INVALID_ENUM);
866 }
867 }
868
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +0000869 gl::Buffer *buffer;
870
871 switch (target)
872 {
873 case GL_ARRAY_BUFFER:
874 buffer = context->getArrayBuffer();
875 break;
876 case GL_ELEMENT_ARRAY_BUFFER:
877 buffer = context->getElementArrayBuffer();
878 break;
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +0000879 case GL_TRANSFORM_FEEDBACK_BUFFER:
880 buffer = context->getGenericTransformFeedbackBuffer();
881 break;
882 case GL_UNIFORM_BUFFER:
883 buffer = context->getGenericUniformBuffer();
884 break;
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +0000885 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000886 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +0000887 }
888
889 if (!buffer)
890 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000891 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +0000892 }
893
daniel@transgaming.comdefa1c32010-05-18 18:51:45 +0000894 if ((size_t)size + offset > buffer->size())
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +0000895 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000896 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +0000897 }
daniel@transgaming.comdefa1c32010-05-18 18:51:45 +0000898
899 buffer->bufferSubData(data, size, offset);
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +0000900 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000901 }
902 catch(std::bad_alloc&)
903 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000904 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000905 }
906}
907
908GLenum __stdcall glCheckFramebufferStatus(GLenum target)
909{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000910 EVENT("(GLenum target = 0x%X)", target);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000911
912 try
913 {
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +0000914 if (target != GL_FRAMEBUFFER && target != GL_DRAW_FRAMEBUFFER_ANGLE && target != GL_READ_FRAMEBUFFER_ANGLE)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000915 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000916 return gl::error(GL_INVALID_ENUM, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000917 }
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 {
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +0000923 gl::Framebuffer *framebuffer = NULL;
924 if (target == GL_READ_FRAMEBUFFER_ANGLE)
925 {
926 framebuffer = context->getReadFramebuffer();
927 }
928 else
929 {
930 framebuffer = context->getDrawFramebuffer();
931 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000932
933 return framebuffer->completeness();
934 }
935 }
936 catch(std::bad_alloc&)
937 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000938 return gl::error(GL_OUT_OF_MEMORY, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000939 }
940
941 return 0;
942}
943
944void __stdcall glClear(GLbitfield mask)
945{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +0000946 EVENT("(GLbitfield mask = 0x%X)", mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000947
948 try
949 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000950 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000951
952 if (context)
953 {
954 context->clear(mask);
955 }
956 }
957 catch(std::bad_alloc&)
958 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000959 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000960 }
961}
962
963void __stdcall glClearColor(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha)
964{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000965 EVENT("(GLclampf red = %f, GLclampf green = %f, GLclampf blue = %f, GLclampf alpha = %f)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +0000966 red, green, blue, alpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000967
968 try
969 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000970 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000971
972 if (context)
973 {
974 context->setClearColor(red, green, blue, alpha);
975 }
976 }
977 catch(std::bad_alloc&)
978 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000979 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000980 }
981}
982
983void __stdcall glClearDepthf(GLclampf depth)
984{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000985 EVENT("(GLclampf depth = %f)", depth);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000986
987 try
988 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000989 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000990
991 if (context)
992 {
993 context->setClearDepth(depth);
994 }
995 }
996 catch(std::bad_alloc&)
997 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000998 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000999 }
1000}
1001
1002void __stdcall glClearStencil(GLint s)
1003{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001004 EVENT("(GLint s = %d)", s);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001005
1006 try
1007 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001008 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001009
1010 if (context)
1011 {
1012 context->setClearStencil(s);
1013 }
1014 }
1015 catch(std::bad_alloc&)
1016 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001017 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001018 }
1019}
1020
1021void __stdcall glColorMask(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha)
1022{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00001023 EVENT("(GLboolean red = %d, GLboolean green = %u, GLboolean blue = %u, GLboolean alpha = %u)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001024 red, green, blue, alpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001025
1026 try
1027 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001028 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001029
1030 if (context)
1031 {
daniel@transgaming.coma36f98e2010-05-18 18:51:09 +00001032 context->setColorMask(red == GL_TRUE, green == GL_TRUE, blue == GL_TRUE, alpha == GL_TRUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001033 }
1034 }
1035 catch(std::bad_alloc&)
1036 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001037 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001038 }
1039}
1040
1041void __stdcall glCompileShader(GLuint shader)
1042{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001043 EVENT("(GLuint shader = %d)", shader);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001044
1045 try
1046 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001047 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001048
1049 if (context)
1050 {
1051 gl::Shader *shaderObject = context->getShader(shader);
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00001052
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001053 if (!shaderObject)
1054 {
daniel@transgaming.com0cefaf42010-04-13 03:26:36 +00001055 if (context->getProgram(shader))
1056 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001057 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com0cefaf42010-04-13 03:26:36 +00001058 }
1059 else
1060 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001061 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com0cefaf42010-04-13 03:26:36 +00001062 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001063 }
1064
1065 shaderObject->compile();
1066 }
1067 }
1068 catch(std::bad_alloc&)
1069 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001070 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001071 }
1072}
1073
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00001074void __stdcall glCompressedTexImage2D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height,
1075 GLint border, GLsizei imageSize, const GLvoid* data)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001076{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001077 EVENT("(GLenum target = 0x%X, GLint level = %d, GLenum internalformat = 0x%X, GLsizei width = %d, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00001078 "GLsizei height = %d, GLint border = %d, GLsizei imageSize = %d, const GLvoid* data = 0x%0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001079 target, level, internalformat, width, height, border, imageSize, data);
1080
1081 try
1082 {
daniel@transgaming.com4f9ef0d2011-05-30 23:51:19 +00001083 if (!validImageSize(level, width, height) || border != 0 || imageSize < 0)
daniel@transgaming.com41430492010-03-11 20:36:18 +00001084 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001085 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com41430492010-03-11 20:36:18 +00001086 }
1087
daniel@transgaming.com01868132010-08-24 19:21:17 +00001088 switch (internalformat)
1089 {
1090 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
1091 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
gman@chromium.org50c526d2011-08-10 05:19:44 +00001092 case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
1093 case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
daniel@transgaming.com01868132010-08-24 19:21:17 +00001094 break;
1095 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001096 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com01868132010-08-24 19:21:17 +00001097 }
1098
1099 if (border != 0)
1100 {
shannon.woods@transgaming.com0efef902013-02-28 23:21:09 +00001101 return gl::error(GL_INVALID_OPERATION);
1102 }
1103
1104 if (width != 1 && width != 2 && width % 4 != 0)
1105 {
1106 return gl::error(GL_INVALID_OPERATION);
1107 }
1108
1109 if (height != 1 && height != 2 && height % 4 != 0)
1110 {
1111 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com01868132010-08-24 19:21:17 +00001112 }
1113
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001114 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com01868132010-08-24 19:21:17 +00001115
1116 if (context)
1117 {
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001118 if (level > context->getMaximumTextureLevel())
1119 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001120 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001121 }
1122
1123 switch (target)
1124 {
1125 case GL_TEXTURE_2D:
1126 if (width > (context->getMaximumTextureDimension() >> level) ||
1127 height > (context->getMaximumTextureDimension() >> level))
1128 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001129 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001130 }
1131 break;
1132 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
1133 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
1134 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
1135 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
1136 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
1137 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
1138 if (width != height)
1139 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001140 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001141 }
1142
1143 if (width > (context->getMaximumCubeTextureDimension() >> level) ||
1144 height > (context->getMaximumCubeTextureDimension() >> level))
1145 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001146 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001147 }
1148 break;
1149 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001150 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001151 }
1152
gman@chromium.org50c526d2011-08-10 05:19:44 +00001153 switch (internalformat) {
1154 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
1155 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
1156 if (!context->supportsDXT1Textures())
1157 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001158 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 +00001159 }
1160 break;
1161 case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
1162 if (!context->supportsDXT3Textures())
1163 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001164 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 +00001165 }
1166 break;
1167 case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
1168 if (!context->supportsDXT5Textures())
1169 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001170 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 +00001171 }
1172 break;
1173 default: UNREACHABLE();
daniel@transgaming.com01868132010-08-24 19:21:17 +00001174 }
1175
1176 if (imageSize != gl::ComputeCompressedSize(width, height, internalformat))
1177 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001178 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com01868132010-08-24 19:21:17 +00001179 }
1180
1181 if (target == GL_TEXTURE_2D)
1182 {
1183 gl::Texture2D *texture = context->getTexture2D();
1184
1185 if (!texture)
1186 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001187 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com01868132010-08-24 19:21:17 +00001188 }
1189
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00001190 if (texture->isImmutable())
1191 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001192 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00001193 }
1194
daniel@transgaming.com01868132010-08-24 19:21:17 +00001195 texture->setCompressedImage(level, internalformat, width, height, imageSize, data);
1196 }
1197 else
1198 {
1199 gl::TextureCubeMap *texture = context->getTextureCubeMap();
1200
1201 if (!texture)
1202 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001203 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com01868132010-08-24 19:21:17 +00001204 }
1205
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00001206 if (texture->isImmutable())
1207 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001208 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00001209 }
1210
daniel@transgaming.com01868132010-08-24 19:21:17 +00001211 switch (target)
1212 {
1213 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
1214 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
1215 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
1216 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
1217 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
1218 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
1219 texture->setCompressedImage(target, level, internalformat, width, height, imageSize, data);
1220 break;
1221 default: UNREACHABLE();
1222 }
1223 }
1224 }
1225
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001226 }
1227 catch(std::bad_alloc&)
1228 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001229 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001230 }
1231}
1232
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00001233void __stdcall glCompressedTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height,
1234 GLenum format, GLsizei imageSize, const GLvoid* data)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001235{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001236 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001237 "GLsizei width = %d, GLsizei height = %d, GLenum format = 0x%X, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00001238 "GLsizei imageSize = %d, const GLvoid* data = 0x%0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001239 target, level, xoffset, yoffset, width, height, format, imageSize, data);
1240
1241 try
1242 {
apatrick@chromium.org551022e2012-01-23 19:56:54 +00001243 if (!gl::IsInternalTextureTarget(target))
daniel@transgaming.com41430492010-03-11 20:36:18 +00001244 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001245 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com41430492010-03-11 20:36:18 +00001246 }
1247
daniel@transgaming.com4f9ef0d2011-05-30 23:51:19 +00001248 if (xoffset < 0 || yoffset < 0 || !validImageSize(level, width, height) || imageSize < 0)
daniel@transgaming.com41430492010-03-11 20:36:18 +00001249 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001250 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com41430492010-03-11 20:36:18 +00001251 }
1252
daniel@transgaming.com01868132010-08-24 19:21:17 +00001253 switch (format)
daniel@transgaming.com41430492010-03-11 20:36:18 +00001254 {
daniel@transgaming.com01868132010-08-24 19:21:17 +00001255 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
1256 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
gman@chromium.org50c526d2011-08-10 05:19:44 +00001257 case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
1258 case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
daniel@transgaming.com01868132010-08-24 19:21:17 +00001259 break;
1260 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001261 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com41430492010-03-11 20:36:18 +00001262 }
1263
daniel@transgaming.com01868132010-08-24 19:21:17 +00001264 if (width == 0 || height == 0 || data == NULL)
1265 {
1266 return;
1267 }
1268
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001269 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com01868132010-08-24 19:21:17 +00001270
1271 if (context)
1272 {
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001273 if (level > context->getMaximumTextureLevel())
1274 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001275 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001276 }
1277
gman@chromium.org50c526d2011-08-10 05:19:44 +00001278 switch (format) {
1279 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
1280 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
1281 if (!context->supportsDXT1Textures())
1282 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001283 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 +00001284 }
1285 break;
1286 case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
1287 if (!context->supportsDXT3Textures())
1288 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001289 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 +00001290 }
1291 break;
1292 case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
1293 if (!context->supportsDXT5Textures())
1294 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001295 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 +00001296 }
1297 break;
1298 default: UNREACHABLE();
daniel@transgaming.com01868132010-08-24 19:21:17 +00001299 }
1300
1301 if (imageSize != gl::ComputeCompressedSize(width, height, format))
1302 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001303 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com01868132010-08-24 19:21:17 +00001304 }
1305
1306 if (xoffset % 4 != 0 || yoffset % 4 != 0)
1307 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001308 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 +00001309 // does not exist unless DXT textures are supported.
daniel@transgaming.com01868132010-08-24 19:21:17 +00001310 }
1311
1312 if (target == GL_TEXTURE_2D)
1313 {
1314 gl::Texture2D *texture = context->getTexture2D();
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00001315 if (validateSubImageParams2D(true, width, height, xoffset, yoffset, level, format, GL_NONE, texture))
daniel@transgaming.com01868132010-08-24 19:21:17 +00001316 {
daniel@transgaming.com343373a2011-11-29 19:42:32 +00001317 texture->subImageCompressed(level, xoffset, yoffset, width, height, format, imageSize, data);
daniel@transgaming.com01868132010-08-24 19:21:17 +00001318 }
daniel@transgaming.com01868132010-08-24 19:21:17 +00001319 }
1320 else if (gl::IsCubemapTextureTarget(target))
1321 {
1322 gl::TextureCubeMap *texture = context->getTextureCubeMap();
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00001323 if (validateSubImageParamsCube(true, width, height, xoffset, yoffset, target, level, format, GL_NONE, texture))
daniel@transgaming.com01868132010-08-24 19:21:17 +00001324 {
daniel@transgaming.com343373a2011-11-29 19:42:32 +00001325 texture->subImageCompressed(target, level, xoffset, yoffset, width, height, format, imageSize, data);
daniel@transgaming.com01868132010-08-24 19:21:17 +00001326 }
daniel@transgaming.com01868132010-08-24 19:21:17 +00001327 }
1328 else
1329 {
1330 UNREACHABLE();
1331 }
1332 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001333 }
1334 catch(std::bad_alloc&)
1335 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001336 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001337 }
1338}
1339
1340void __stdcall glCopyTexImage2D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border)
1341{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001342 EVENT("(GLenum target = 0x%X, GLint level = %d, GLenum internalformat = 0x%X, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001343 "GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d, GLint border = %d)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001344 target, level, internalformat, x, y, width, height, border);
1345
1346 try
1347 {
daniel@transgaming.com4f9ef0d2011-05-30 23:51:19 +00001348 if (!validImageSize(level, width, height))
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001349 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001350 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001351 }
1352
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001353 if (border != 0)
1354 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001355 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001356 }
1357
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001358 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001359
1360 if (context)
1361 {
daniel@transgaming.com32b11442011-11-19 02:42:48 +00001362 if (level > context->getMaximumTextureLevel())
1363 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001364 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com32b11442011-11-19 02:42:48 +00001365 }
1366
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001367 switch (target)
1368 {
1369 case GL_TEXTURE_2D:
1370 if (width > (context->getMaximumTextureDimension() >> level) ||
1371 height > (context->getMaximumTextureDimension() >> level))
1372 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001373 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001374 }
1375 break;
1376 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
1377 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
1378 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
1379 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
1380 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
1381 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
1382 if (width != height)
1383 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001384 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001385 }
1386
1387 if (width > (context->getMaximumCubeTextureDimension() >> level) ||
1388 height > (context->getMaximumCubeTextureDimension() >> level))
1389 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001390 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001391 }
1392 break;
1393 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001394 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001395 }
1396
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00001397 gl::Framebuffer *framebuffer = context->getReadFramebuffer();
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001398
daniel@transgaming.combbc57792010-07-28 19:21:05 +00001399 if (framebuffer->completeness() != GL_FRAMEBUFFER_COMPLETE)
1400 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001401 return gl::error(GL_INVALID_FRAMEBUFFER_OPERATION);
daniel@transgaming.combbc57792010-07-28 19:21:05 +00001402 }
1403
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00001404 if (context->getReadFramebufferHandle() != 0 && framebuffer->getSamples() != 0)
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00001405 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001406 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00001407 }
1408
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00001409 gl::Renderbuffer *source = framebuffer->getReadColorbuffer();
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +00001410 GLenum colorbufferFormat = source->getInternalFormat();
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001411
1412 // [OpenGL ES 2.0.24] table 3.9
1413 switch (internalformat)
1414 {
1415 case GL_ALPHA:
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00001416 if (colorbufferFormat != GL_ALPHA8_EXT &&
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001417 colorbufferFormat != GL_RGBA4 &&
1418 colorbufferFormat != GL_RGB5_A1 &&
shannon.woods@transgaming.com28e7ba02013-02-28 23:09:28 +00001419 colorbufferFormat != GL_BGRA8_EXT &&
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001420 colorbufferFormat != GL_RGBA8_OES)
1421 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001422 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001423 }
1424 break;
1425 case GL_LUMINANCE:
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00001426 case GL_RGB:
1427 if (colorbufferFormat != GL_RGB565 &&
1428 colorbufferFormat != GL_RGB8_OES &&
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001429 colorbufferFormat != GL_RGBA4 &&
1430 colorbufferFormat != GL_RGB5_A1 &&
shannon.woods@transgaming.com28e7ba02013-02-28 23:09:28 +00001431 colorbufferFormat != GL_BGRA8_EXT &&
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001432 colorbufferFormat != GL_RGBA8_OES)
1433 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001434 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001435 }
1436 break;
1437 case GL_LUMINANCE_ALPHA:
1438 case GL_RGBA:
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00001439 if (colorbufferFormat != GL_RGBA4 &&
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001440 colorbufferFormat != GL_RGB5_A1 &&
shannon.woods@transgaming.com28e7ba02013-02-28 23:09:28 +00001441 colorbufferFormat != GL_BGRA8_EXT &&
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001442 colorbufferFormat != GL_RGBA8_OES)
1443 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001444 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001445 }
1446 break;
1447 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
1448 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
gman@chromium.org50c526d2011-08-10 05:19:44 +00001449 if (context->supportsDXT1Textures())
1450 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001451 return gl::error(GL_INVALID_OPERATION);
gman@chromium.org50c526d2011-08-10 05:19:44 +00001452 }
1453 else
1454 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001455 return gl::error(GL_INVALID_ENUM);
gman@chromium.org50c526d2011-08-10 05:19:44 +00001456 }
1457 break;
1458 case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
1459 if (context->supportsDXT3Textures())
1460 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001461 return gl::error(GL_INVALID_OPERATION);
gman@chromium.org50c526d2011-08-10 05:19:44 +00001462 }
1463 else
1464 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001465 return gl::error(GL_INVALID_ENUM);
gman@chromium.org50c526d2011-08-10 05:19:44 +00001466 }
1467 break;
1468 case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
1469 if (context->supportsDXT5Textures())
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001470 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001471 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001472 }
1473 else
1474 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001475 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001476 }
1477 break;
daniel@transgaming.com0c854682012-05-31 01:14:11 +00001478 case GL_DEPTH_COMPONENT:
1479 case GL_DEPTH_COMPONENT16:
1480 case GL_DEPTH_COMPONENT32_OES:
1481 case GL_DEPTH_STENCIL_OES:
1482 case GL_DEPTH24_STENCIL8_OES:
1483 if (context->supportsDepthTextures())
1484 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001485 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com0c854682012-05-31 01:14:11 +00001486 }
1487 else
1488 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001489 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com0c854682012-05-31 01:14:11 +00001490 }
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001491 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001492 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001493 }
1494
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001495 if (target == GL_TEXTURE_2D)
1496 {
1497 gl::Texture2D *texture = context->getTexture2D();
1498
1499 if (!texture)
1500 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001501 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001502 }
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00001503
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00001504 if (texture->isImmutable())
1505 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001506 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00001507 }
1508
apatrick@chromium.orgb31f5322011-01-19 19:02:52 +00001509 texture->copyImage(level, internalformat, x, y, width, height, framebuffer);
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001510 }
daniel@transgaming.com19ffc242010-05-04 03:35:21 +00001511 else if (gl::IsCubemapTextureTarget(target))
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001512 {
1513 gl::TextureCubeMap *texture = context->getTextureCubeMap();
1514
1515 if (!texture)
1516 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001517 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001518 }
1519
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00001520 if (texture->isImmutable())
1521 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001522 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00001523 }
1524
apatrick@chromium.orgb31f5322011-01-19 19:02:52 +00001525 texture->copyImage(target, level, internalformat, x, y, width, height, framebuffer);
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001526 }
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001527 else UNREACHABLE();
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001528 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001529 }
1530 catch(std::bad_alloc&)
1531 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001532 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001533 }
1534}
1535
1536void __stdcall glCopyTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height)
1537{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001538 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001539 "GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001540 target, level, xoffset, yoffset, x, y, width, height);
1541
1542 try
1543 {
apatrick@chromium.org551022e2012-01-23 19:56:54 +00001544 if (!gl::IsInternalTextureTarget(target))
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001545 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001546 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001547 }
1548
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001549 if (level < 0 || xoffset < 0 || yoffset < 0 || width < 0 || height < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001550 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001551 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001552 }
1553
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001554 if (std::numeric_limits<GLsizei>::max() - xoffset < width || std::numeric_limits<GLsizei>::max() - yoffset < height)
1555 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001556 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001557 }
1558
1559 if (width == 0 || height == 0)
1560 {
1561 return;
1562 }
1563
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001564 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001565
1566 if (context)
1567 {
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001568 if (level > context->getMaximumTextureLevel())
1569 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001570 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001571 }
1572
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00001573 gl::Framebuffer *framebuffer = context->getReadFramebuffer();
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001574
daniel@transgaming.combbc57792010-07-28 19:21:05 +00001575 if (framebuffer->completeness() != GL_FRAMEBUFFER_COMPLETE)
1576 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001577 return gl::error(GL_INVALID_FRAMEBUFFER_OPERATION);
daniel@transgaming.combbc57792010-07-28 19:21:05 +00001578 }
1579
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00001580 if (context->getReadFramebufferHandle() != 0 && framebuffer->getSamples() != 0)
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00001581 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001582 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00001583 }
1584
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00001585 gl::Renderbuffer *source = framebuffer->getReadColorbuffer();
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +00001586 GLenum colorbufferFormat = source->getInternalFormat();
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001587 gl::Texture *texture = NULL;
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +00001588 GLenum textureFormat = GL_RGBA;
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001589
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001590 if (target == GL_TEXTURE_2D)
1591 {
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +00001592 gl::Texture2D *tex2d = context->getTexture2D();
1593
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00001594 if (!validateSubImageParams2D(false, width, height, xoffset, yoffset, level, GL_NONE, GL_NONE, tex2d))
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +00001595 {
1596 return; // error already registered by validateSubImageParams
1597 }
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00001598 textureFormat = gl::ExtractFormat(tex2d->getInternalFormat(level));
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +00001599 texture = tex2d;
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001600 }
daniel@transgaming.com19ffc242010-05-04 03:35:21 +00001601 else if (gl::IsCubemapTextureTarget(target))
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001602 {
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +00001603 gl::TextureCubeMap *texcube = context->getTextureCubeMap();
1604
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00001605 if (!validateSubImageParamsCube(false, width, height, xoffset, yoffset, target, level, GL_NONE, GL_NONE, texcube))
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +00001606 {
1607 return; // error already registered by validateSubImageParams
1608 }
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00001609 textureFormat = gl::ExtractFormat(texcube->getInternalFormat(target, level));
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +00001610 texture = texcube;
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001611 }
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001612 else UNREACHABLE();
1613
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001614 // [OpenGL ES 2.0.24] table 3.9
1615 switch (textureFormat)
1616 {
1617 case GL_ALPHA:
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00001618 if (colorbufferFormat != GL_ALPHA8_EXT &&
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001619 colorbufferFormat != GL_RGBA4 &&
1620 colorbufferFormat != GL_RGB5_A1 &&
1621 colorbufferFormat != GL_RGBA8_OES)
1622 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001623 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001624 }
1625 break;
1626 case GL_LUMINANCE:
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00001627 case GL_RGB:
1628 if (colorbufferFormat != GL_RGB565 &&
1629 colorbufferFormat != GL_RGB8_OES &&
1630 colorbufferFormat != GL_RGBA4 &&
1631 colorbufferFormat != GL_RGB5_A1 &&
1632 colorbufferFormat != GL_RGBA8_OES)
1633 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001634 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00001635 }
1636 break;
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001637 case GL_LUMINANCE_ALPHA:
1638 case GL_RGBA:
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00001639 if (colorbufferFormat != GL_RGBA4 &&
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001640 colorbufferFormat != GL_RGB5_A1 &&
1641 colorbufferFormat != GL_RGBA8_OES)
1642 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001643 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001644 }
1645 break;
1646 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
1647 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
gman@chromium.org50c526d2011-08-10 05:19:44 +00001648 case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
1649 case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001650 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com0c854682012-05-31 01:14:11 +00001651 case GL_DEPTH_COMPONENT:
1652 case GL_DEPTH_STENCIL_OES:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001653 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001654 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001655 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001656 }
1657
apatrick@chromium.orgb31f5322011-01-19 19:02:52 +00001658 texture->copySubImage(target, level, xoffset, yoffset, x, y, width, height, framebuffer);
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001659 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001660 }
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001661
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001662 catch(std::bad_alloc&)
1663 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001664 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001665 }
1666}
1667
1668GLuint __stdcall glCreateProgram(void)
1669{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001670 EVENT("()");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001671
1672 try
1673 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001674 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001675
1676 if (context)
1677 {
1678 return context->createProgram();
1679 }
1680 }
1681 catch(std::bad_alloc&)
1682 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001683 return gl::error(GL_OUT_OF_MEMORY, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001684 }
1685
1686 return 0;
1687}
1688
1689GLuint __stdcall glCreateShader(GLenum type)
1690{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001691 EVENT("(GLenum type = 0x%X)", type);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001692
1693 try
1694 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001695 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001696
1697 if (context)
1698 {
1699 switch (type)
1700 {
1701 case GL_FRAGMENT_SHADER:
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00001702 case GL_VERTEX_SHADER:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001703 return context->createShader(type);
1704 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001705 return gl::error(GL_INVALID_ENUM, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001706 }
1707 }
1708 }
1709 catch(std::bad_alloc&)
1710 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001711 return gl::error(GL_OUT_OF_MEMORY, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001712 }
1713
1714 return 0;
1715}
1716
1717void __stdcall glCullFace(GLenum mode)
1718{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001719 EVENT("(GLenum mode = 0x%X)", mode);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001720
1721 try
1722 {
1723 switch (mode)
1724 {
1725 case GL_FRONT:
1726 case GL_BACK:
1727 case GL_FRONT_AND_BACK:
1728 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001729 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001730
1731 if (context)
1732 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00001733 context->setCullMode(mode);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001734 }
1735 }
1736 break;
1737 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001738 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001739 }
1740 }
1741 catch(std::bad_alloc&)
1742 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001743 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001744 }
1745}
1746
1747void __stdcall glDeleteBuffers(GLsizei n, const GLuint* buffers)
1748{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001749 EVENT("(GLsizei n = %d, const GLuint* buffers = 0x%0.8p)", n, buffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001750
1751 try
1752 {
1753 if (n < 0)
1754 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001755 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001756 }
1757
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001758 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001759
1760 if (context)
1761 {
1762 for (int i = 0; i < n; i++)
1763 {
1764 context->deleteBuffer(buffers[i]);
1765 }
1766 }
1767 }
1768 catch(std::bad_alloc&)
1769 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001770 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001771 }
1772}
1773
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001774void __stdcall glDeleteFencesNV(GLsizei n, const GLuint* fences)
1775{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001776 EVENT("(GLsizei n = %d, const GLuint* fences = 0x%0.8p)", n, fences);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001777
1778 try
1779 {
1780 if (n < 0)
1781 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001782 return gl::error(GL_INVALID_VALUE);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001783 }
1784
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001785 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001786
1787 if (context)
1788 {
1789 for (int i = 0; i < n; i++)
1790 {
1791 context->deleteFence(fences[i]);
1792 }
1793 }
1794 }
1795 catch(std::bad_alloc&)
1796 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001797 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001798 }
1799}
1800
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001801void __stdcall glDeleteFramebuffers(GLsizei n, const GLuint* framebuffers)
1802{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001803 EVENT("(GLsizei n = %d, const GLuint* framebuffers = 0x%0.8p)", n, framebuffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001804
1805 try
1806 {
1807 if (n < 0)
1808 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001809 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001810 }
1811
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001812 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001813
1814 if (context)
1815 {
1816 for (int i = 0; i < n; i++)
1817 {
1818 if (framebuffers[i] != 0)
1819 {
1820 context->deleteFramebuffer(framebuffers[i]);
1821 }
1822 }
1823 }
1824 }
1825 catch(std::bad_alloc&)
1826 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001827 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001828 }
1829}
1830
1831void __stdcall glDeleteProgram(GLuint program)
1832{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001833 EVENT("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001834
1835 try
1836 {
daniel@transgaming.com75401e62010-04-13 03:26:39 +00001837 if (program == 0)
1838 {
1839 return;
1840 }
1841
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001842 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001843
1844 if (context)
1845 {
daniel@transgaming.com75401e62010-04-13 03:26:39 +00001846 if (!context->getProgram(program))
1847 {
1848 if(context->getShader(program))
1849 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001850 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com75401e62010-04-13 03:26:39 +00001851 }
1852 else
1853 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001854 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com75401e62010-04-13 03:26:39 +00001855 }
1856 }
1857
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001858 context->deleteProgram(program);
1859 }
1860 }
1861 catch(std::bad_alloc&)
1862 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001863 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001864 }
1865}
1866
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00001867void __stdcall glDeleteQueriesEXT(GLsizei n, const GLuint *ids)
1868{
1869 EVENT("(GLsizei n = %d, const GLuint *ids = 0x%0.8p)", n, ids);
1870
1871 try
1872 {
1873 if (n < 0)
1874 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001875 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00001876 }
1877
1878 gl::Context *context = gl::getNonLostContext();
1879
1880 if (context)
1881 {
1882 for (int i = 0; i < n; i++)
1883 {
1884 context->deleteQuery(ids[i]);
1885 }
1886 }
1887 }
1888 catch(std::bad_alloc&)
1889 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001890 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00001891 }
1892}
1893
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001894void __stdcall glDeleteRenderbuffers(GLsizei n, const GLuint* renderbuffers)
1895{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001896 EVENT("(GLsizei n = %d, const GLuint* renderbuffers = 0x%0.8p)", n, renderbuffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001897
1898 try
1899 {
1900 if (n < 0)
1901 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001902 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001903 }
1904
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001905 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001906
1907 if (context)
1908 {
daniel@transgaming.come2b22122010-03-11 19:22:14 +00001909 for (int i = 0; i < n; i++)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001910 {
1911 context->deleteRenderbuffer(renderbuffers[i]);
1912 }
1913 }
1914 }
1915 catch(std::bad_alloc&)
1916 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001917 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001918 }
1919}
1920
1921void __stdcall glDeleteShader(GLuint shader)
1922{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001923 EVENT("(GLuint shader = %d)", shader);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001924
1925 try
1926 {
daniel@transgaming.com75401e62010-04-13 03:26:39 +00001927 if (shader == 0)
1928 {
1929 return;
1930 }
1931
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001932 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001933
1934 if (context)
1935 {
daniel@transgaming.com75401e62010-04-13 03:26:39 +00001936 if (!context->getShader(shader))
1937 {
1938 if(context->getProgram(shader))
1939 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001940 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com75401e62010-04-13 03:26:39 +00001941 }
1942 else
1943 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001944 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com75401e62010-04-13 03:26:39 +00001945 }
1946 }
1947
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001948 context->deleteShader(shader);
1949 }
1950 }
1951 catch(std::bad_alloc&)
1952 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001953 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001954 }
1955}
1956
1957void __stdcall glDeleteTextures(GLsizei n, const GLuint* textures)
1958{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001959 EVENT("(GLsizei n = %d, const GLuint* textures = 0x%0.8p)", n, textures);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001960
1961 try
1962 {
1963 if (n < 0)
1964 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001965 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001966 }
1967
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001968 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001969
1970 if (context)
1971 {
1972 for (int i = 0; i < n; i++)
1973 {
1974 if (textures[i] != 0)
1975 {
1976 context->deleteTexture(textures[i]);
1977 }
1978 }
1979 }
1980 }
1981 catch(std::bad_alloc&)
1982 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001983 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001984 }
1985}
1986
1987void __stdcall glDepthFunc(GLenum func)
1988{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001989 EVENT("(GLenum func = 0x%X)", func);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001990
1991 try
1992 {
1993 switch (func)
1994 {
1995 case GL_NEVER:
1996 case GL_ALWAYS:
1997 case GL_LESS:
1998 case GL_LEQUAL:
1999 case GL_EQUAL:
2000 case GL_GREATER:
2001 case GL_GEQUAL:
2002 case GL_NOTEQUAL:
2003 break;
2004 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002005 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002006 }
2007
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002008 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002009
2010 if (context)
2011 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00002012 context->setDepthFunc(func);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002013 }
2014 }
2015 catch(std::bad_alloc&)
2016 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002017 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002018 }
2019}
2020
2021void __stdcall glDepthMask(GLboolean flag)
2022{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00002023 EVENT("(GLboolean flag = %u)", flag);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002024
2025 try
2026 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002027 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002028
2029 if (context)
2030 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00002031 context->setDepthMask(flag != GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002032 }
2033 }
2034 catch(std::bad_alloc&)
2035 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002036 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002037 }
2038}
2039
2040void __stdcall glDepthRangef(GLclampf zNear, GLclampf zFar)
2041{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002042 EVENT("(GLclampf zNear = %f, GLclampf zFar = %f)", zNear, zFar);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002043
2044 try
2045 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002046 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002047
2048 if (context)
2049 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00002050 context->setDepthRange(zNear, zFar);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002051 }
2052 }
2053 catch(std::bad_alloc&)
2054 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002055 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002056 }
2057}
2058
2059void __stdcall glDetachShader(GLuint program, GLuint shader)
2060{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002061 EVENT("(GLuint program = %d, GLuint shader = %d)", program, shader);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002062
2063 try
2064 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002065 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002066
2067 if (context)
2068 {
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00002069
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002070 gl::Program *programObject = context->getProgram(program);
2071 gl::Shader *shaderObject = context->getShader(shader);
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00002072
2073 if (!programObject)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002074 {
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00002075 gl::Shader *shaderByProgramHandle;
2076 shaderByProgramHandle = context->getShader(program);
2077 if (!shaderByProgramHandle)
2078 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002079 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00002080 }
2081 else
2082 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002083 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00002084 }
2085 }
2086
2087 if (!shaderObject)
2088 {
2089 gl::Program *programByShaderHandle = context->getProgram(shader);
2090 if (!programByShaderHandle)
2091 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002092 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00002093 }
2094 else
2095 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002096 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00002097 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002098 }
2099
2100 if (!programObject->detachShader(shaderObject))
2101 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002102 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002103 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002104 }
2105 }
2106 catch(std::bad_alloc&)
2107 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002108 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002109 }
2110}
2111
2112void __stdcall glDisable(GLenum cap)
2113{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002114 EVENT("(GLenum cap = 0x%X)", cap);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002115
2116 try
2117 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002118 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002119
2120 if (context)
2121 {
2122 switch (cap)
2123 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00002124 case GL_CULL_FACE: context->setCullFace(false); break;
2125 case GL_POLYGON_OFFSET_FILL: context->setPolygonOffsetFill(false); break;
2126 case GL_SAMPLE_ALPHA_TO_COVERAGE: context->setSampleAlphaToCoverage(false); break;
2127 case GL_SAMPLE_COVERAGE: context->setSampleCoverage(false); break;
2128 case GL_SCISSOR_TEST: context->setScissorTest(false); break;
2129 case GL_STENCIL_TEST: context->setStencilTest(false); break;
2130 case GL_DEPTH_TEST: context->setDepthTest(false); break;
2131 case GL_BLEND: context->setBlend(false); break;
2132 case GL_DITHER: context->setDither(false); break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002133 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002134 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002135 }
2136 }
2137 }
2138 catch(std::bad_alloc&)
2139 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002140 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002141 }
2142}
2143
2144void __stdcall glDisableVertexAttribArray(GLuint index)
2145{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002146 EVENT("(GLuint index = %d)", index);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002147
2148 try
2149 {
2150 if (index >= gl::MAX_VERTEX_ATTRIBS)
2151 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002152 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002153 }
2154
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002155 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002156
2157 if (context)
2158 {
daniel@transgaming.com83921382011-01-08 05:46:00 +00002159 context->setEnableVertexAttribArray(index, false);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +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.com4f39fd92010-03-08 20:26:45 +00002165 }
2166}
2167
2168void __stdcall glDrawArrays(GLenum mode, GLint first, GLsizei count)
2169{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002170 EVENT("(GLenum mode = 0x%X, GLint first = %d, GLsizei count = %d)", mode, first, count);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002171
2172 try
2173 {
2174 if (count < 0 || first < 0)
2175 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002176 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002177 }
2178
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002179 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002180
2181 if (context)
2182 {
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00002183 context->drawArrays(mode, first, count, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002184 }
2185 }
2186 catch(std::bad_alloc&)
2187 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002188 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002189 }
2190}
2191
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002192void __stdcall glDrawArraysInstancedANGLE(GLenum mode, GLint first, GLsizei count, GLsizei primcount)
2193{
2194 EVENT("(GLenum mode = 0x%X, GLint first = %d, GLsizei count = %d, GLsizei primcount = %d)", mode, first, count, primcount);
2195
2196 try
2197 {
2198 if (count < 0 || first < 0 || primcount < 0)
2199 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002200 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002201 }
2202
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00002203 if (primcount > 0)
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002204 {
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00002205 gl::Context *context = gl::getNonLostContext();
2206
2207 if (context)
2208 {
2209 context->drawArrays(mode, first, count, primcount);
2210 }
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002211 }
2212 }
2213 catch(std::bad_alloc&)
2214 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002215 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002216 }
2217}
2218
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00002219void __stdcall glDrawElements(GLenum mode, GLsizei count, GLenum type, const GLvoid* indices)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002220{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002221 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 +00002222 mode, count, type, indices);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002223
2224 try
2225 {
2226 if (count < 0)
2227 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002228 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002229 }
2230
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002231 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002232
2233 if (context)
2234 {
daniel@transgaming.com83921382011-01-08 05:46:00 +00002235 switch (type)
2236 {
2237 case GL_UNSIGNED_BYTE:
2238 case GL_UNSIGNED_SHORT:
2239 break;
2240 case GL_UNSIGNED_INT:
2241 if (!context->supports32bitIndices())
2242 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002243 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com83921382011-01-08 05:46:00 +00002244 }
2245 break;
2246 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002247 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com83921382011-01-08 05:46:00 +00002248 }
2249
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00002250 context->drawElements(mode, count, type, indices, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002251 }
2252 }
2253 catch(std::bad_alloc&)
2254 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002255 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002256 }
2257}
2258
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002259void __stdcall glDrawElementsInstancedANGLE(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLsizei primcount)
2260{
2261 EVENT("(GLenum mode = 0x%X, GLsizei count = %d, GLenum type = 0x%X, const GLvoid* indices = 0x%0.8p, GLsizei primcount = %d)",
2262 mode, count, type, indices, primcount);
2263
2264 try
2265 {
2266 if (count < 0 || primcount < 0)
2267 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002268 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002269 }
2270
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00002271 if (primcount > 0)
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002272 {
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00002273 gl::Context *context = gl::getNonLostContext();
2274
2275 if (context)
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002276 {
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00002277 switch (type)
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002278 {
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00002279 case GL_UNSIGNED_BYTE:
2280 case GL_UNSIGNED_SHORT:
2281 break;
2282 case GL_UNSIGNED_INT:
2283 if (!context->supports32bitIndices())
2284 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002285 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00002286 }
2287 break;
2288 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002289 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002290 }
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00002291
2292 context->drawElements(mode, count, type, indices, primcount);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002293 }
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002294 }
2295 }
2296 catch(std::bad_alloc&)
2297 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002298 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002299 }
2300}
2301
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002302void __stdcall glEnable(GLenum cap)
2303{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002304 EVENT("(GLenum cap = 0x%X)", cap);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002305
2306 try
2307 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002308 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002309
2310 if (context)
2311 {
2312 switch (cap)
2313 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00002314 case GL_CULL_FACE: context->setCullFace(true); break;
2315 case GL_POLYGON_OFFSET_FILL: context->setPolygonOffsetFill(true); break;
2316 case GL_SAMPLE_ALPHA_TO_COVERAGE: context->setSampleAlphaToCoverage(true); break;
2317 case GL_SAMPLE_COVERAGE: context->setSampleCoverage(true); break;
2318 case GL_SCISSOR_TEST: context->setScissorTest(true); break;
2319 case GL_STENCIL_TEST: context->setStencilTest(true); break;
2320 case GL_DEPTH_TEST: context->setDepthTest(true); break;
2321 case GL_BLEND: context->setBlend(true); break;
2322 case GL_DITHER: context->setDither(true); break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002323 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002324 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002325 }
2326 }
2327 }
2328 catch(std::bad_alloc&)
2329 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002330 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002331 }
2332}
2333
2334void __stdcall glEnableVertexAttribArray(GLuint index)
2335{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002336 EVENT("(GLuint index = %d)", index);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002337
2338 try
2339 {
2340 if (index >= gl::MAX_VERTEX_ATTRIBS)
2341 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002342 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002343 }
2344
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002345 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002346
2347 if (context)
2348 {
daniel@transgaming.com83921382011-01-08 05:46:00 +00002349 context->setEnableVertexAttribArray(index, true);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002350 }
2351 }
2352 catch(std::bad_alloc&)
2353 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002354 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002355 }
2356}
2357
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00002358void __stdcall glEndQueryEXT(GLenum target)
2359{
2360 EVENT("GLenum target = 0x%X)", target);
2361
2362 try
2363 {
2364 switch (target)
2365 {
2366 case GL_ANY_SAMPLES_PASSED_EXT:
2367 case GL_ANY_SAMPLES_PASSED_CONSERVATIVE_EXT:
2368 break;
2369 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002370 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00002371 }
2372
2373 gl::Context *context = gl::getNonLostContext();
2374
2375 if (context)
2376 {
2377 context->endQuery(target);
2378 }
2379 }
2380 catch(std::bad_alloc&)
2381 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002382 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00002383 }
2384}
2385
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002386void __stdcall glFinishFenceNV(GLuint fence)
2387{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002388 EVENT("(GLuint fence = %d)", fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002389
2390 try
2391 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002392 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002393
2394 if (context)
2395 {
2396 gl::Fence* fenceObject = context->getFence(fence);
2397
2398 if (fenceObject == NULL)
2399 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002400 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002401 }
2402
2403 fenceObject->finishFence();
2404 }
2405 }
2406 catch(std::bad_alloc&)
2407 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002408 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002409 }
2410}
2411
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002412void __stdcall glFinish(void)
2413{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002414 EVENT("()");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002415
2416 try
2417 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002418 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002419
2420 if (context)
2421 {
daniel@transgaming.com0d86aa72011-10-26 02:35:10 +00002422 context->sync(true);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002423 }
2424 }
2425 catch(std::bad_alloc&)
2426 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002427 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002428 }
2429}
2430
2431void __stdcall glFlush(void)
2432{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002433 EVENT("()");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002434
2435 try
2436 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002437 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002438
2439 if (context)
2440 {
daniel@transgaming.com0d86aa72011-10-26 02:35:10 +00002441 context->sync(false);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002442 }
2443 }
2444 catch(std::bad_alloc&)
2445 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002446 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002447 }
2448}
2449
2450void __stdcall glFramebufferRenderbuffer(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer)
2451{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002452 EVENT("(GLenum target = 0x%X, GLenum attachment = 0x%X, GLenum renderbuffertarget = 0x%X, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00002453 "GLuint renderbuffer = %d)", target, attachment, renderbuffertarget, renderbuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002454
2455 try
2456 {
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002457 if ((target != GL_FRAMEBUFFER && target != GL_DRAW_FRAMEBUFFER_ANGLE && target != GL_READ_FRAMEBUFFER_ANGLE)
daniel@transgaming.com2fa45512011-10-04 18:43:18 +00002458 || (renderbuffertarget != GL_RENDERBUFFER && renderbuffer != 0))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002459 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002460 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002461 }
2462
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002463 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002464
2465 if (context)
2466 {
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002467 gl::Framebuffer *framebuffer = NULL;
2468 GLuint framebufferHandle = 0;
2469 if (target == GL_READ_FRAMEBUFFER_ANGLE)
2470 {
2471 framebuffer = context->getReadFramebuffer();
2472 framebufferHandle = context->getReadFramebufferHandle();
2473 }
daniel@transgaming.com2fa45512011-10-04 18:43:18 +00002474 else
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002475 {
2476 framebuffer = context->getDrawFramebuffer();
2477 framebufferHandle = context->getDrawFramebufferHandle();
2478 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002479
daniel@transgaming.com2fa45512011-10-04 18:43:18 +00002480 if (!framebuffer || (framebufferHandle == 0 && renderbuffer != 0))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002481 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002482 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002483 }
2484
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002485 if (attachment >= GL_COLOR_ATTACHMENT0_EXT && attachment <= GL_COLOR_ATTACHMENT15_EXT)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002486 {
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002487 const unsigned int colorAttachment = (attachment - GL_COLOR_ATTACHMENT0_EXT);
2488
2489 if (colorAttachment >= context->getMaximumRenderTargets())
2490 {
2491 return gl::error(GL_INVALID_VALUE);
2492 }
2493
2494 framebuffer->setColorbuffer(colorAttachment, GL_RENDERBUFFER, renderbuffer);
2495 }
2496 else
2497 {
2498 switch (attachment)
2499 {
2500 case GL_DEPTH_ATTACHMENT:
2501 framebuffer->setDepthbuffer(GL_RENDERBUFFER, renderbuffer);
2502 break;
2503 case GL_STENCIL_ATTACHMENT:
2504 framebuffer->setStencilbuffer(GL_RENDERBUFFER, renderbuffer);
2505 break;
2506 default:
2507 return gl::error(GL_INVALID_ENUM);
2508 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002509 }
2510 }
2511 }
2512 catch(std::bad_alloc&)
2513 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002514 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002515 }
2516}
2517
2518void __stdcall glFramebufferTexture2D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level)
2519{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002520 EVENT("(GLenum target = 0x%X, GLenum attachment = 0x%X, GLenum textarget = 0x%X, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00002521 "GLuint texture = %d, GLint level = %d)", target, attachment, textarget, texture, level);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002522
2523 try
2524 {
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002525 if (target != GL_FRAMEBUFFER && target != GL_DRAW_FRAMEBUFFER_ANGLE && target != GL_READ_FRAMEBUFFER_ANGLE)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002526 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002527 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002528 }
2529
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002530 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002531
2532 if (context)
2533 {
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002534 if (attachment >= GL_COLOR_ATTACHMENT0_EXT && attachment <= GL_COLOR_ATTACHMENT15_EXT)
2535 {
2536 const unsigned int colorAttachment = (attachment - GL_COLOR_ATTACHMENT0_EXT);
2537
2538 if (colorAttachment >= context->getMaximumRenderTargets())
2539 {
2540 return gl::error(GL_INVALID_VALUE);
2541 }
2542 }
2543 else
2544 {
2545 switch (attachment)
2546 {
2547 case GL_DEPTH_ATTACHMENT:
2548 case GL_STENCIL_ATTACHMENT:
2549 break;
2550 default:
2551 return gl::error(GL_INVALID_ENUM);
2552 }
2553 }
2554
daniel@transgaming.com93a81472010-04-20 18:52:58 +00002555 if (texture == 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002556 {
daniel@transgaming.com93a81472010-04-20 18:52:58 +00002557 textarget = GL_NONE;
2558 }
2559 else
2560 {
2561 gl::Texture *tex = context->getTexture(texture);
2562
2563 if (tex == NULL)
2564 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002565 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com93a81472010-04-20 18:52:58 +00002566 }
2567
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002568 switch (textarget)
2569 {
2570 case GL_TEXTURE_2D:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002571 {
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00002572 if (tex->getTarget() != GL_TEXTURE_2D)
2573 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002574 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00002575 }
2576 gl::Texture2D *tex2d = static_cast<gl::Texture2D *>(tex);
daniel@transgaming.com92f49922012-05-09 15:49:19 +00002577 if (tex2d->isCompressed(0))
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00002578 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002579 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00002580 }
2581 break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002582 }
daniel@transgaming.com93a81472010-04-20 18:52:58 +00002583
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002584 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002585 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002586 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002587 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002588 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002589 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
daniel@transgaming.com93a81472010-04-20 18:52:58 +00002590 {
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00002591 if (tex->getTarget() != GL_TEXTURE_CUBE_MAP)
2592 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002593 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00002594 }
2595 gl::TextureCubeMap *texcube = static_cast<gl::TextureCubeMap *>(tex);
daniel@transgaming.com4df88e82012-05-09 15:49:24 +00002596 if (texcube->isCompressed(textarget, level))
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00002597 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002598 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00002599 }
2600 break;
daniel@transgaming.com93a81472010-04-20 18:52:58 +00002601 }
daniel@transgaming.com93a81472010-04-20 18:52:58 +00002602
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002603 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002604 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002605 }
2606
2607 if (level != 0)
2608 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002609 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002610 }
2611 }
2612
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002613 gl::Framebuffer *framebuffer = NULL;
2614 GLuint framebufferHandle = 0;
2615 if (target == GL_READ_FRAMEBUFFER_ANGLE)
2616 {
2617 framebuffer = context->getReadFramebuffer();
2618 framebufferHandle = context->getReadFramebufferHandle();
2619 }
2620 else
2621 {
2622 framebuffer = context->getDrawFramebuffer();
2623 framebufferHandle = context->getDrawFramebufferHandle();
2624 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002625
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002626 if (framebufferHandle == 0 || !framebuffer)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002627 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002628 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002629 }
2630
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002631 if (attachment >= GL_COLOR_ATTACHMENT0_EXT && attachment <= GL_COLOR_ATTACHMENT15_EXT)
daniel@transgaming.comfbc09532010-04-26 15:33:41 +00002632 {
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002633 const unsigned int colorAttachment = (attachment - GL_COLOR_ATTACHMENT0_EXT);
2634
2635 if (colorAttachment >= context->getMaximumRenderTargets())
2636 {
2637 return gl::error(GL_INVALID_VALUE);
2638 }
2639
2640 framebuffer->setColorbuffer(colorAttachment, textarget, texture);
2641 }
2642 else
2643 {
2644 switch (attachment)
2645 {
2646 case GL_DEPTH_ATTACHMENT: framebuffer->setDepthbuffer(textarget, texture); break;
2647 case GL_STENCIL_ATTACHMENT: framebuffer->setStencilbuffer(textarget, texture); break;
2648 }
daniel@transgaming.comfbc09532010-04-26 15:33:41 +00002649 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002650 }
2651 }
2652 catch(std::bad_alloc&)
2653 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002654 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002655 }
2656}
2657
2658void __stdcall glFrontFace(GLenum mode)
2659{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002660 EVENT("(GLenum mode = 0x%X)", mode);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002661
2662 try
2663 {
2664 switch (mode)
2665 {
2666 case GL_CW:
2667 case GL_CCW:
2668 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002669 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002670
2671 if (context)
2672 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00002673 context->setFrontFace(mode);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002674 }
2675 }
2676 break;
2677 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002678 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002679 }
2680 }
2681 catch(std::bad_alloc&)
2682 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002683 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002684 }
2685}
2686
2687void __stdcall glGenBuffers(GLsizei n, GLuint* buffers)
2688{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002689 EVENT("(GLsizei n = %d, GLuint* buffers = 0x%0.8p)", n, buffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002690
2691 try
2692 {
2693 if (n < 0)
2694 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002695 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002696 }
2697
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002698 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002699
2700 if (context)
2701 {
2702 for (int i = 0; i < n; i++)
2703 {
2704 buffers[i] = context->createBuffer();
2705 }
2706 }
2707 }
2708 catch(std::bad_alloc&)
2709 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002710 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002711 }
2712}
2713
2714void __stdcall glGenerateMipmap(GLenum target)
2715{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002716 EVENT("(GLenum target = 0x%X)", target);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002717
2718 try
2719 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002720 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com8fd99e22010-04-20 18:52:00 +00002721
2722 if (context)
2723 {
daniel@transgaming.com8fd99e22010-04-20 18:52:00 +00002724 switch (target)
2725 {
2726 case GL_TEXTURE_2D:
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00002727 {
2728 gl::Texture2D *tex2d = context->getTexture2D();
2729
daniel@transgaming.com92f49922012-05-09 15:49:19 +00002730 if (tex2d->isCompressed(0))
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00002731 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002732 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00002733 }
daniel@transgaming.com0c854682012-05-31 01:14:11 +00002734 if (tex2d->isDepth(0))
2735 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002736 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com0c854682012-05-31 01:14:11 +00002737 }
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00002738
2739 tex2d->generateMipmaps();
2740 break;
2741 }
daniel@transgaming.com8fd99e22010-04-20 18:52:00 +00002742
2743 case GL_TEXTURE_CUBE_MAP:
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00002744 {
2745 gl::TextureCubeMap *texcube = context->getTextureCubeMap();
2746
daniel@transgaming.com4df88e82012-05-09 15:49:24 +00002747 if (texcube->isCompressed(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0))
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00002748 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002749 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00002750 }
2751
2752 texcube->generateMipmaps();
2753 break;
2754 }
daniel@transgaming.com8fd99e22010-04-20 18:52:00 +00002755
2756 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002757 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com8fd99e22010-04-20 18:52:00 +00002758 }
daniel@transgaming.com8fd99e22010-04-20 18:52:00 +00002759 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002760 }
2761 catch(std::bad_alloc&)
2762 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002763 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002764 }
2765}
2766
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002767void __stdcall glGenFencesNV(GLsizei n, GLuint* fences)
2768{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002769 EVENT("(GLsizei n = %d, GLuint* fences = 0x%0.8p)", n, fences);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002770
2771 try
2772 {
2773 if (n < 0)
2774 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002775 return gl::error(GL_INVALID_VALUE);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002776 }
2777
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002778 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002779
2780 if (context)
2781 {
2782 for (int i = 0; i < n; i++)
2783 {
2784 fences[i] = context->createFence();
2785 }
2786 }
2787 }
2788 catch(std::bad_alloc&)
2789 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002790 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002791 }
2792}
2793
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002794void __stdcall glGenFramebuffers(GLsizei n, GLuint* framebuffers)
2795{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002796 EVENT("(GLsizei n = %d, GLuint* framebuffers = 0x%0.8p)", n, framebuffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002797
2798 try
2799 {
2800 if (n < 0)
2801 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002802 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002803 }
2804
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002805 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002806
2807 if (context)
2808 {
2809 for (int i = 0; i < n; i++)
2810 {
2811 framebuffers[i] = context->createFramebuffer();
2812 }
2813 }
2814 }
2815 catch(std::bad_alloc&)
2816 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002817 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002818 }
2819}
2820
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00002821void __stdcall glGenQueriesEXT(GLsizei n, GLuint* ids)
2822{
2823 EVENT("(GLsizei n = %d, GLuint* ids = 0x%0.8p)", n, ids);
2824
2825 try
2826 {
2827 if (n < 0)
2828 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002829 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00002830 }
2831
2832 gl::Context *context = gl::getNonLostContext();
2833
2834 if (context)
2835 {
2836 for (int i = 0; i < n; i++)
2837 {
2838 ids[i] = context->createQuery();
2839 }
2840 }
2841 }
2842 catch(std::bad_alloc&)
2843 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002844 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00002845 }
2846}
2847
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002848void __stdcall glGenRenderbuffers(GLsizei n, GLuint* renderbuffers)
2849{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002850 EVENT("(GLsizei n = %d, GLuint* renderbuffers = 0x%0.8p)", n, renderbuffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002851
2852 try
2853 {
2854 if (n < 0)
2855 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002856 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002857 }
2858
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002859 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002860
2861 if (context)
2862 {
2863 for (int i = 0; i < n; i++)
2864 {
2865 renderbuffers[i] = context->createRenderbuffer();
2866 }
2867 }
2868 }
2869 catch(std::bad_alloc&)
2870 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002871 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002872 }
2873}
2874
2875void __stdcall glGenTextures(GLsizei n, GLuint* textures)
2876{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002877 EVENT("(GLsizei n = %d, GLuint* textures = 0x%0.8p)", n, textures);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002878
2879 try
2880 {
2881 if (n < 0)
2882 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002883 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002884 }
2885
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002886 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002887
2888 if (context)
2889 {
2890 for (int i = 0; i < n; i++)
2891 {
2892 textures[i] = context->createTexture();
2893 }
2894 }
2895 }
2896 catch(std::bad_alloc&)
2897 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002898 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002899 }
2900}
2901
daniel@transgaming.com85423182010-04-22 13:35:27 +00002902void __stdcall glGetActiveAttrib(GLuint program, GLuint index, GLsizei bufsize, GLsizei *length, GLint *size, GLenum *type, GLchar *name)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002903{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002904 EVENT("(GLuint program = %d, GLuint index = %d, GLsizei bufsize = %d, GLsizei *length = 0x%0.8p, "
daniel@transgaming.com85423182010-04-22 13:35:27 +00002905 "GLint *size = 0x%0.8p, GLenum *type = %0.8p, GLchar *name = %0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002906 program, index, bufsize, length, size, type, name);
2907
2908 try
2909 {
2910 if (bufsize < 0)
2911 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002912 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002913 }
2914
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002915 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com85423182010-04-22 13:35:27 +00002916
2917 if (context)
2918 {
2919 gl::Program *programObject = context->getProgram(program);
2920
2921 if (!programObject)
2922 {
2923 if (context->getShader(program))
2924 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002925 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com85423182010-04-22 13:35:27 +00002926 }
2927 else
2928 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002929 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com85423182010-04-22 13:35:27 +00002930 }
2931 }
2932
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00002933 if (index >= (GLuint)programObject->getActiveAttributeCount())
daniel@transgaming.com85423182010-04-22 13:35:27 +00002934 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002935 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com85423182010-04-22 13:35:27 +00002936 }
2937
2938 programObject->getActiveAttribute(index, bufsize, length, size, type, name);
2939 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002940 }
2941 catch(std::bad_alloc&)
2942 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002943 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002944 }
2945}
2946
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00002947void __stdcall glGetActiveUniform(GLuint program, GLuint index, GLsizei bufsize, GLsizei* length, GLint* size, GLenum* type, GLchar* name)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002948{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002949 EVENT("(GLuint program = %d, GLuint index = %d, GLsizei bufsize = %d, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00002950 "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 +00002951 program, index, bufsize, length, size, type, name);
2952
2953 try
2954 {
2955 if (bufsize < 0)
2956 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002957 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002958 }
2959
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002960 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00002961
2962 if (context)
2963 {
2964 gl::Program *programObject = context->getProgram(program);
2965
2966 if (!programObject)
2967 {
2968 if (context->getShader(program))
2969 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002970 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00002971 }
2972 else
2973 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002974 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00002975 }
2976 }
2977
2978 if (index >= (GLuint)programObject->getActiveUniformCount())
2979 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002980 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00002981 }
2982
2983 programObject->getActiveUniform(index, bufsize, length, size, type, name);
2984 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002985 }
2986 catch(std::bad_alloc&)
2987 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002988 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002989 }
2990}
2991
2992void __stdcall glGetAttachedShaders(GLuint program, GLsizei maxcount, GLsizei* count, GLuint* shaders)
2993{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002994 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 +00002995 program, maxcount, count, shaders);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002996
2997 try
2998 {
2999 if (maxcount < 0)
3000 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003001 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003002 }
3003
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003004 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com6c785212010-03-30 03:36:17 +00003005
3006 if (context)
3007 {
3008 gl::Program *programObject = context->getProgram(program);
3009
3010 if (!programObject)
3011 {
daniel@transgaming.com23953e32010-04-13 19:53:31 +00003012 if (context->getShader(program))
3013 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003014 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com23953e32010-04-13 19:53:31 +00003015 }
3016 else
3017 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003018 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com23953e32010-04-13 19:53:31 +00003019 }
daniel@transgaming.com6c785212010-03-30 03:36:17 +00003020 }
3021
3022 return programObject->getAttachedShaders(maxcount, count, shaders);
3023 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003024 }
3025 catch(std::bad_alloc&)
3026 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003027 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003028 }
3029}
3030
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00003031int __stdcall glGetAttribLocation(GLuint program, const GLchar* name)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003032{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003033 EVENT("(GLuint program = %d, const GLchar* name = %s)", program, name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003034
3035 try
3036 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003037 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003038
3039 if (context)
3040 {
daniel@transgaming.combb274c32010-04-13 03:26:21 +00003041
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003042 gl::Program *programObject = context->getProgram(program);
3043
3044 if (!programObject)
3045 {
daniel@transgaming.combb274c32010-04-13 03:26:21 +00003046 if (context->getShader(program))
3047 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003048 return gl::error(GL_INVALID_OPERATION, -1);
daniel@transgaming.combb274c32010-04-13 03:26:21 +00003049 }
3050 else
3051 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003052 return gl::error(GL_INVALID_VALUE, -1);
daniel@transgaming.combb274c32010-04-13 03:26:21 +00003053 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003054 }
3055
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003056 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
daniel@transgaming.com716056c2012-07-24 18:38:59 +00003057 if (!programObject->isLinked() || !programBinary)
daniel@transgaming.comcf4aa872010-04-13 03:26:27 +00003058 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003059 return gl::error(GL_INVALID_OPERATION, -1);
daniel@transgaming.comcf4aa872010-04-13 03:26:27 +00003060 }
3061
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003062 return programBinary->getAttributeLocation(name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003063 }
3064 }
3065 catch(std::bad_alloc&)
3066 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003067 return gl::error(GL_OUT_OF_MEMORY, -1);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003068 }
3069
3070 return -1;
3071}
3072
3073void __stdcall glGetBooleanv(GLenum pname, GLboolean* params)
3074{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003075 EVENT("(GLenum pname = 0x%X, GLboolean* params = 0x%0.8p)", pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003076
3077 try
3078 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003079 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003080
3081 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003082 {
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003083 if (!(context->getBooleanv(pname, params)))
3084 {
3085 GLenum nativeType;
3086 unsigned int numParams = 0;
3087 if (!context->getQueryParameterInfo(pname, &nativeType, &numParams))
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003088 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003089
3090 if (numParams == 0)
3091 return; // it is known that the pname is valid, but there are no parameters to return
3092
3093 if (nativeType == GL_FLOAT)
3094 {
3095 GLfloat *floatParams = NULL;
3096 floatParams = new GLfloat[numParams];
3097
3098 context->getFloatv(pname, floatParams);
3099
3100 for (unsigned int i = 0; i < numParams; ++i)
3101 {
3102 if (floatParams[i] == 0.0f)
3103 params[i] = GL_FALSE;
3104 else
3105 params[i] = GL_TRUE;
3106 }
3107
3108 delete [] floatParams;
3109 }
3110 else if (nativeType == GL_INT)
3111 {
3112 GLint *intParams = NULL;
3113 intParams = new GLint[numParams];
3114
3115 context->getIntegerv(pname, intParams);
3116
3117 for (unsigned int i = 0; i < numParams; ++i)
3118 {
3119 if (intParams[i] == 0)
3120 params[i] = GL_FALSE;
3121 else
3122 params[i] = GL_TRUE;
3123 }
3124
3125 delete [] intParams;
3126 }
3127 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003128 }
3129 }
3130 catch(std::bad_alloc&)
3131 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003132 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003133 }
3134}
3135
3136void __stdcall glGetBufferParameteriv(GLenum target, GLenum pname, GLint* params)
3137{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003138 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 +00003139
3140 try
3141 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003142 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comaa0ccbd2010-04-15 20:45:05 +00003143
3144 if (context)
3145 {
3146 gl::Buffer *buffer;
3147
3148 switch (target)
3149 {
3150 case GL_ARRAY_BUFFER:
3151 buffer = context->getArrayBuffer();
3152 break;
3153 case GL_ELEMENT_ARRAY_BUFFER:
3154 buffer = context->getElementArrayBuffer();
3155 break;
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003156 default: return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comaa0ccbd2010-04-15 20:45:05 +00003157 }
3158
3159 if (!buffer)
3160 {
3161 // A null buffer means that "0" is bound to the requested buffer target
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003162 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comaa0ccbd2010-04-15 20:45:05 +00003163 }
3164
3165 switch (pname)
3166 {
3167 case GL_BUFFER_USAGE:
3168 *params = buffer->usage();
3169 break;
3170 case GL_BUFFER_SIZE:
3171 *params = buffer->size();
3172 break;
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003173 default: return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comaa0ccbd2010-04-15 20:45:05 +00003174 }
3175 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003176 }
3177 catch(std::bad_alloc&)
3178 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003179 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003180 }
3181}
3182
3183GLenum __stdcall glGetError(void)
3184{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003185 EVENT("()");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003186
3187 gl::Context *context = gl::getContext();
3188
3189 if (context)
3190 {
daniel@transgaming.com82b28912011-12-12 21:01:35 +00003191 return context->getError();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003192 }
3193
3194 return GL_NO_ERROR;
3195}
3196
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00003197void __stdcall glGetFenceivNV(GLuint fence, GLenum pname, GLint *params)
3198{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003199 EVENT("(GLuint fence = %d, GLenum pname = 0x%X, GLint *params = 0x%0.8p)", fence, pname, params);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00003200
3201 try
3202 {
3203
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003204 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00003205
3206 if (context)
3207 {
3208 gl::Fence *fenceObject = context->getFence(fence);
3209
3210 if (fenceObject == NULL)
3211 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003212 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00003213 }
3214
3215 fenceObject->getFenceiv(pname, params);
3216 }
3217 }
3218 catch(std::bad_alloc&)
3219 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003220 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00003221 }
3222}
3223
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003224void __stdcall glGetFloatv(GLenum pname, GLfloat* params)
3225{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003226 EVENT("(GLenum pname = 0x%X, GLfloat* params = 0x%0.8p)", pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003227
3228 try
3229 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003230 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com32e58cd2010-03-24 09:44:10 +00003231
3232 if (context)
3233 {
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003234 if (!(context->getFloatv(pname, params)))
daniel@transgaming.com32e58cd2010-03-24 09:44:10 +00003235 {
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003236 GLenum nativeType;
3237 unsigned int numParams = 0;
3238 if (!context->getQueryParameterInfo(pname, &nativeType, &numParams))
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003239 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003240
3241 if (numParams == 0)
3242 return; // it is known that the pname is valid, but that there are no parameters to return.
3243
3244 if (nativeType == GL_BOOL)
3245 {
3246 GLboolean *boolParams = NULL;
3247 boolParams = new GLboolean[numParams];
3248
3249 context->getBooleanv(pname, boolParams);
3250
3251 for (unsigned int i = 0; i < numParams; ++i)
3252 {
3253 if (boolParams[i] == GL_FALSE)
3254 params[i] = 0.0f;
3255 else
3256 params[i] = 1.0f;
3257 }
3258
3259 delete [] boolParams;
3260 }
3261 else if (nativeType == GL_INT)
3262 {
3263 GLint *intParams = NULL;
3264 intParams = new GLint[numParams];
3265
3266 context->getIntegerv(pname, intParams);
3267
3268 for (unsigned int i = 0; i < numParams; ++i)
3269 {
3270 params[i] = (GLfloat)intParams[i];
3271 }
3272
3273 delete [] intParams;
3274 }
daniel@transgaming.com32e58cd2010-03-24 09:44:10 +00003275 }
3276 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003277 }
3278 catch(std::bad_alloc&)
3279 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003280 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003281 }
3282}
3283
3284void __stdcall glGetFramebufferAttachmentParameteriv(GLenum target, GLenum attachment, GLenum pname, GLint* params)
3285{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003286 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 +00003287 target, attachment, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003288
3289 try
3290 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003291 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003292
3293 if (context)
3294 {
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00003295 if (target != GL_FRAMEBUFFER && target != GL_DRAW_FRAMEBUFFER_ANGLE && target != GL_READ_FRAMEBUFFER_ANGLE)
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003296 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003297 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003298 }
3299
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00003300 gl::Framebuffer *framebuffer = NULL;
3301 if (target == GL_READ_FRAMEBUFFER_ANGLE)
3302 {
3303 if(context->getReadFramebufferHandle() == 0)
3304 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003305 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00003306 }
3307
3308 framebuffer = context->getReadFramebuffer();
3309 }
3310 else
3311 {
3312 if (context->getDrawFramebufferHandle() == 0)
3313 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003314 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00003315 }
3316
3317 framebuffer = context->getDrawFramebuffer();
3318 }
3319
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003320 GLenum attachmentType;
3321 GLuint attachmentHandle;
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00003322
3323 if (attachment >= GL_COLOR_ATTACHMENT0_EXT && attachment <= GL_COLOR_ATTACHMENT15_EXT)
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003324 {
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00003325 const unsigned int colorAttachment = (attachment - GL_COLOR_ATTACHMENT0_EXT);
3326
3327 if (colorAttachment >= context->getMaximumRenderTargets())
3328 {
3329 return gl::error(GL_INVALID_ENUM);
3330 }
3331
3332 attachmentType = framebuffer->getColorbufferType(colorAttachment);
3333 attachmentHandle = framebuffer->getColorbufferHandle(colorAttachment);
3334 }
3335 else
3336 {
3337 switch (attachment)
3338 {
3339 case GL_DEPTH_ATTACHMENT:
3340 attachmentType = framebuffer->getDepthbufferType();
3341 attachmentHandle = framebuffer->getDepthbufferHandle();
3342 break;
3343 case GL_STENCIL_ATTACHMENT:
3344 attachmentType = framebuffer->getStencilbufferType();
3345 attachmentHandle = framebuffer->getStencilbufferHandle();
3346 break;
3347 default: return gl::error(GL_INVALID_ENUM);
3348 }
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003349 }
3350
3351 GLenum attachmentObjectType; // Type category
daniel@transgaming.comfbc09532010-04-26 15:33:41 +00003352 if (attachmentType == GL_NONE || attachmentType == GL_RENDERBUFFER)
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003353 {
3354 attachmentObjectType = attachmentType;
3355 }
apatrick@chromium.org551022e2012-01-23 19:56:54 +00003356 else if (gl::IsInternalTextureTarget(attachmentType))
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003357 {
3358 attachmentObjectType = GL_TEXTURE;
3359 }
apatrick@chromium.orga1d80592012-01-25 21:52:10 +00003360 else
3361 {
3362 UNREACHABLE();
3363 return;
3364 }
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003365
3366 switch (pname)
3367 {
3368 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE:
3369 *params = attachmentObjectType;
3370 break;
3371 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME:
3372 if (attachmentObjectType == GL_RENDERBUFFER || attachmentObjectType == GL_TEXTURE)
3373 {
3374 *params = attachmentHandle;
3375 }
3376 else
3377 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003378 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003379 }
3380 break;
3381 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL:
3382 if (attachmentObjectType == GL_TEXTURE)
3383 {
3384 *params = 0; // FramebufferTexture2D will not allow level to be set to anything else in GL ES 2.0
3385 }
3386 else
3387 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003388 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003389 }
3390 break;
3391 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE:
3392 if (attachmentObjectType == GL_TEXTURE)
3393 {
daniel@transgaming.com19ffc242010-05-04 03:35:21 +00003394 if (gl::IsCubemapTextureTarget(attachmentType))
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003395 {
3396 *params = attachmentType;
3397 }
3398 else
3399 {
3400 *params = 0;
3401 }
3402 }
3403 else
3404 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003405 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003406 }
3407 break;
3408 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003409 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003410 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003411 }
3412 }
3413 catch(std::bad_alloc&)
3414 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003415 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003416 }
3417}
3418
daniel@transgaming.com17f548c2011-11-09 17:47:02 +00003419GLenum __stdcall glGetGraphicsResetStatusEXT(void)
3420{
3421 EVENT("()");
3422
3423 try
3424 {
3425 gl::Context *context = gl::getContext();
3426
3427 if (context)
3428 {
3429 return context->getResetStatus();
3430 }
3431
3432 return GL_NO_ERROR;
3433 }
3434 catch(std::bad_alloc&)
3435 {
3436 return GL_OUT_OF_MEMORY;
3437 }
3438}
3439
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003440void __stdcall glGetIntegerv(GLenum pname, GLint* params)
3441{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003442 EVENT("(GLenum pname = 0x%X, GLint* params = 0x%0.8p)", pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003443
3444 try
3445 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003446 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003447
3448 if (context)
3449 {
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003450 if (!(context->getIntegerv(pname, params)))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003451 {
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003452 GLenum nativeType;
3453 unsigned int numParams = 0;
3454 if (!context->getQueryParameterInfo(pname, &nativeType, &numParams))
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003455 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003456
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003457 if (numParams == 0)
3458 return; // it is known that pname is valid, but there are no parameters to return
3459
3460 if (nativeType == GL_BOOL)
3461 {
3462 GLboolean *boolParams = NULL;
3463 boolParams = new GLboolean[numParams];
3464
3465 context->getBooleanv(pname, boolParams);
3466
3467 for (unsigned int i = 0; i < numParams; ++i)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003468 {
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003469 if (boolParams[i] == GL_FALSE)
3470 params[i] = 0;
3471 else
3472 params[i] = 1;
3473 }
3474
3475 delete [] boolParams;
3476 }
3477 else if (nativeType == GL_FLOAT)
3478 {
3479 GLfloat *floatParams = NULL;
3480 floatParams = new GLfloat[numParams];
3481
3482 context->getFloatv(pname, floatParams);
3483
3484 for (unsigned int i = 0; i < numParams; ++i)
3485 {
daniel@transgaming.comc1641352010-04-26 15:33:36 +00003486 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 +00003487 {
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003488 params[i] = (GLint)(((GLfloat)(0xFFFFFFFF) * floatParams[i] - 1.0f) / 2.0f);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003489 }
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003490 else
3491 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 +00003492 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003493
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003494 delete [] floatParams;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003495 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003496 }
3497 }
3498 }
3499 catch(std::bad_alloc&)
3500 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003501 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003502 }
3503}
3504
3505void __stdcall glGetProgramiv(GLuint program, GLenum pname, GLint* params)
3506{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003507 EVENT("(GLuint program = %d, GLenum pname = %d, GLint* params = 0x%0.8p)", program, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003508
3509 try
3510 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003511 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003512
3513 if (context)
3514 {
3515 gl::Program *programObject = context->getProgram(program);
3516
3517 if (!programObject)
3518 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003519 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003520 }
3521
3522 switch (pname)
3523 {
3524 case GL_DELETE_STATUS:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003525 *params = programObject->isFlaggedForDeletion();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003526 return;
3527 case GL_LINK_STATUS:
daniel@transgaming.com716056c2012-07-24 18:38:59 +00003528 *params = programObject->isLinked();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003529 return;
3530 case GL_VALIDATE_STATUS:
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00003531 *params = programObject->isValidated();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003532 return;
3533 case GL_INFO_LOG_LENGTH:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003534 *params = programObject->getInfoLogLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003535 return;
3536 case GL_ATTACHED_SHADERS:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003537 *params = programObject->getAttachedShadersCount();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003538 return;
3539 case GL_ACTIVE_ATTRIBUTES:
daniel@transgaming.com85423182010-04-22 13:35:27 +00003540 *params = programObject->getActiveAttributeCount();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003541 return;
3542 case GL_ACTIVE_ATTRIBUTE_MAX_LENGTH:
daniel@transgaming.com85423182010-04-22 13:35:27 +00003543 *params = programObject->getActiveAttributeMaxLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003544 return;
3545 case GL_ACTIVE_UNIFORMS:
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00003546 *params = programObject->getActiveUniformCount();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003547 return;
3548 case GL_ACTIVE_UNIFORM_MAX_LENGTH:
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00003549 *params = programObject->getActiveUniformMaxLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003550 return;
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00003551 case GL_PROGRAM_BINARY_LENGTH_OES:
apatrick@chromium.org90080e32012-07-09 22:15:33 +00003552 *params = programObject->getProgramBinaryLength();
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00003553 return;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003554 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003555 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003556 }
3557 }
3558 }
3559 catch(std::bad_alloc&)
3560 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003561 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003562 }
3563}
3564
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00003565void __stdcall glGetProgramInfoLog(GLuint program, GLsizei bufsize, GLsizei* length, GLchar* infolog)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003566{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003567 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 +00003568 program, bufsize, length, infolog);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003569
3570 try
3571 {
3572 if (bufsize < 0)
3573 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003574 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003575 }
3576
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003577 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003578
3579 if (context)
3580 {
3581 gl::Program *programObject = context->getProgram(program);
3582
3583 if (!programObject)
3584 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003585 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003586 }
3587
3588 programObject->getInfoLog(bufsize, length, infolog);
3589 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003590 }
3591 catch(std::bad_alloc&)
3592 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003593 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003594 }
3595}
3596
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003597void __stdcall glGetQueryivEXT(GLenum target, GLenum pname, GLint *params)
3598{
3599 EVENT("GLenum target = 0x%X, GLenum pname = 0x%X, GLint *params = 0x%0.8p)", target, pname, params);
3600
3601 try
3602 {
3603 switch (pname)
3604 {
3605 case GL_CURRENT_QUERY_EXT:
3606 break;
3607 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003608 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003609 }
3610
3611 gl::Context *context = gl::getNonLostContext();
3612
3613 if (context)
3614 {
3615 params[0] = context->getActiveQuery(target);
3616 }
3617 }
3618 catch(std::bad_alloc&)
3619 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003620 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003621 }
3622}
3623
3624void __stdcall glGetQueryObjectuivEXT(GLuint id, GLenum pname, GLuint *params)
3625{
3626 EVENT("(GLuint id = %d, GLenum pname = 0x%X, GLuint *params = 0x%0.8p)", id, pname, params);
3627
3628 try
3629 {
3630 switch (pname)
3631 {
3632 case GL_QUERY_RESULT_EXT:
3633 case GL_QUERY_RESULT_AVAILABLE_EXT:
3634 break;
3635 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003636 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003637 }
3638 gl::Context *context = gl::getNonLostContext();
3639
3640 if (context)
3641 {
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003642 gl::Query *queryObject = context->getQuery(id, false, GL_NONE);
3643
3644 if (!queryObject)
3645 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003646 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003647 }
3648
3649 if (context->getActiveQuery(queryObject->getType()) == id)
3650 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003651 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003652 }
3653
3654 switch(pname)
3655 {
3656 case GL_QUERY_RESULT_EXT:
3657 params[0] = queryObject->getResult();
3658 break;
3659 case GL_QUERY_RESULT_AVAILABLE_EXT:
3660 params[0] = queryObject->isResultAvailable();
3661 break;
3662 default:
3663 ASSERT(false);
3664 }
3665 }
3666 }
3667 catch(std::bad_alloc&)
3668 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003669 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003670 }
3671}
3672
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003673void __stdcall glGetRenderbufferParameteriv(GLenum target, GLenum pname, GLint* params)
3674{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003675 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 +00003676
3677 try
3678 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003679 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003680
3681 if (context)
3682 {
3683 if (target != GL_RENDERBUFFER)
3684 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003685 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003686 }
3687
daniel@transgaming.com428d1582010-05-04 03:35:25 +00003688 if (context->getRenderbufferHandle() == 0)
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003689 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003690 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003691 }
3692
daniel@transgaming.com428d1582010-05-04 03:35:25 +00003693 gl::Renderbuffer *renderbuffer = context->getRenderbuffer(context->getRenderbufferHandle());
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003694
3695 switch (pname)
3696 {
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +00003697 case GL_RENDERBUFFER_WIDTH: *params = renderbuffer->getWidth(); break;
3698 case GL_RENDERBUFFER_HEIGHT: *params = renderbuffer->getHeight(); break;
3699 case GL_RENDERBUFFER_INTERNAL_FORMAT: *params = renderbuffer->getInternalFormat(); break;
3700 case GL_RENDERBUFFER_RED_SIZE: *params = renderbuffer->getRedSize(); break;
3701 case GL_RENDERBUFFER_GREEN_SIZE: *params = renderbuffer->getGreenSize(); break;
3702 case GL_RENDERBUFFER_BLUE_SIZE: *params = renderbuffer->getBlueSize(); break;
3703 case GL_RENDERBUFFER_ALPHA_SIZE: *params = renderbuffer->getAlphaSize(); break;
3704 case GL_RENDERBUFFER_DEPTH_SIZE: *params = renderbuffer->getDepthSize(); break;
3705 case GL_RENDERBUFFER_STENCIL_SIZE: *params = renderbuffer->getStencilSize(); break;
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00003706 case GL_RENDERBUFFER_SAMPLES_ANGLE:
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +00003707 if (context->getMaxSupportedSamples() != 0)
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00003708 {
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +00003709 *params = renderbuffer->getSamples();
3710 }
3711 else
3712 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003713 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00003714 }
3715 break;
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003716 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003717 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003718 }
3719 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003720 }
3721 catch(std::bad_alloc&)
3722 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003723 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003724 }
3725}
3726
3727void __stdcall glGetShaderiv(GLuint shader, GLenum pname, GLint* params)
3728{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003729 EVENT("(GLuint shader = %d, GLenum pname = %d, GLint* params = 0x%0.8p)", shader, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003730
3731 try
3732 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003733 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003734
3735 if (context)
3736 {
3737 gl::Shader *shaderObject = context->getShader(shader);
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00003738
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003739 if (!shaderObject)
3740 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003741 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003742 }
3743
3744 switch (pname)
3745 {
3746 case GL_SHADER_TYPE:
3747 *params = shaderObject->getType();
3748 return;
3749 case GL_DELETE_STATUS:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003750 *params = shaderObject->isFlaggedForDeletion();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003751 return;
3752 case GL_COMPILE_STATUS:
3753 *params = shaderObject->isCompiled() ? GL_TRUE : GL_FALSE;
3754 return;
3755 case GL_INFO_LOG_LENGTH:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003756 *params = shaderObject->getInfoLogLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003757 return;
3758 case GL_SHADER_SOURCE_LENGTH:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003759 *params = shaderObject->getSourceLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003760 return;
zmo@google.coma574f782011-10-03 21:45:23 +00003761 case GL_TRANSLATED_SHADER_SOURCE_LENGTH_ANGLE:
3762 *params = shaderObject->getTranslatedSourceLength();
3763 return;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003764 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003765 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003766 }
3767 }
3768 }
3769 catch(std::bad_alloc&)
3770 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003771 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003772 }
3773}
3774
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00003775void __stdcall glGetShaderInfoLog(GLuint shader, GLsizei bufsize, GLsizei* length, GLchar* infolog)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003776{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003777 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 +00003778 shader, bufsize, length, infolog);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003779
3780 try
3781 {
3782 if (bufsize < 0)
3783 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003784 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003785 }
3786
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003787 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003788
3789 if (context)
3790 {
3791 gl::Shader *shaderObject = context->getShader(shader);
3792
3793 if (!shaderObject)
3794 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003795 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003796 }
3797
3798 shaderObject->getInfoLog(bufsize, length, infolog);
3799 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003800 }
3801 catch(std::bad_alloc&)
3802 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003803 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003804 }
3805}
3806
3807void __stdcall glGetShaderPrecisionFormat(GLenum shadertype, GLenum precisiontype, GLint* range, GLint* precision)
3808{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003809 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 +00003810 shadertype, precisiontype, range, precision);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003811
3812 try
3813 {
daniel@transgaming.com6c785212010-03-30 03:36:17 +00003814 switch (shadertype)
3815 {
3816 case GL_VERTEX_SHADER:
3817 case GL_FRAGMENT_SHADER:
3818 break;
3819 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003820 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com6c785212010-03-30 03:36:17 +00003821 }
3822
3823 switch (precisiontype)
3824 {
3825 case GL_LOW_FLOAT:
3826 case GL_MEDIUM_FLOAT:
3827 case GL_HIGH_FLOAT:
3828 // Assume IEEE 754 precision
3829 range[0] = 127;
3830 range[1] = 127;
daniel@transgaming.comc5c15382010-04-23 18:34:49 +00003831 *precision = 23;
daniel@transgaming.com6c785212010-03-30 03:36:17 +00003832 break;
3833 case GL_LOW_INT:
3834 case GL_MEDIUM_INT:
3835 case GL_HIGH_INT:
3836 // Some (most) hardware only supports single-precision floating-point numbers,
3837 // which can accurately represent integers up to +/-16777216
3838 range[0] = 24;
3839 range[1] = 24;
daniel@transgaming.comc5c15382010-04-23 18:34:49 +00003840 *precision = 0;
daniel@transgaming.com6c785212010-03-30 03:36:17 +00003841 break;
3842 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003843 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com6c785212010-03-30 03:36:17 +00003844 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003845 }
3846 catch(std::bad_alloc&)
3847 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003848 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003849 }
3850}
3851
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00003852void __stdcall glGetShaderSource(GLuint shader, GLsizei bufsize, GLsizei* length, GLchar* source)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003853{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003854 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 +00003855 shader, bufsize, length, source);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003856
3857 try
3858 {
3859 if (bufsize < 0)
3860 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003861 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003862 }
3863
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003864 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003865
3866 if (context)
3867 {
3868 gl::Shader *shaderObject = context->getShader(shader);
3869
3870 if (!shaderObject)
3871 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003872 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003873 }
3874
3875 shaderObject->getSource(bufsize, length, source);
3876 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003877 }
3878 catch(std::bad_alloc&)
3879 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003880 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003881 }
3882}
3883
zmo@google.coma574f782011-10-03 21:45:23 +00003884void __stdcall glGetTranslatedShaderSourceANGLE(GLuint shader, GLsizei bufsize, GLsizei* length, GLchar* source)
3885{
3886 EVENT("(GLuint shader = %d, GLsizei bufsize = %d, GLsizei* length = 0x%0.8p, GLchar* source = 0x%0.8p)",
3887 shader, bufsize, length, source);
3888
3889 try
3890 {
3891 if (bufsize < 0)
3892 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003893 return gl::error(GL_INVALID_VALUE);
zmo@google.coma574f782011-10-03 21:45:23 +00003894 }
3895
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003896 gl::Context *context = gl::getNonLostContext();
zmo@google.coma574f782011-10-03 21:45:23 +00003897
3898 if (context)
3899 {
3900 gl::Shader *shaderObject = context->getShader(shader);
3901
3902 if (!shaderObject)
3903 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003904 return gl::error(GL_INVALID_OPERATION);
zmo@google.coma574f782011-10-03 21:45:23 +00003905 }
3906
3907 shaderObject->getTranslatedSource(bufsize, length, source);
3908 }
3909 }
3910 catch(std::bad_alloc&)
3911 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003912 return gl::error(GL_OUT_OF_MEMORY);
zmo@google.coma574f782011-10-03 21:45:23 +00003913 }
3914}
3915
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003916const GLubyte* __stdcall glGetString(GLenum name)
3917{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003918 EVENT("(GLenum name = 0x%X)", name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003919
3920 try
3921 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003922 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com3e4c6002010-05-05 18:50:13 +00003923
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003924 switch (name)
3925 {
3926 case GL_VENDOR:
daniel@transgaming.coma0ce7e62011-01-25 14:47:16 +00003927 return (GLubyte*)"Google Inc.";
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003928 case GL_RENDERER:
daniel@transgaming.comc23ff642011-08-16 20:28:45 +00003929 return (GLubyte*)((context != NULL) ? context->getRendererString() : "ANGLE");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003930 case GL_VERSION:
daniel@transgaming.com1825d8e2012-08-27 16:25:29 +00003931 return (GLubyte*)"OpenGL ES 2.0 (ANGLE " VERSION_STRING ")";
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003932 case GL_SHADING_LANGUAGE_VERSION:
daniel@transgaming.com1825d8e2012-08-27 16:25:29 +00003933 return (GLubyte*)"OpenGL ES GLSL ES 1.00 (ANGLE " VERSION_STRING ")";
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003934 case GL_EXTENSIONS:
daniel@transgaming.com3e4c6002010-05-05 18:50:13 +00003935 return (GLubyte*)((context != NULL) ? context->getExtensionString() : "");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003936 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003937 return gl::error(GL_INVALID_ENUM, (GLubyte*)NULL);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003938 }
3939 }
3940 catch(std::bad_alloc&)
3941 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003942 return gl::error(GL_OUT_OF_MEMORY, (GLubyte*)NULL);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003943 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003944}
3945
3946void __stdcall glGetTexParameterfv(GLenum target, GLenum pname, GLfloat* params)
3947{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003948 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 +00003949
3950 try
3951 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003952 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003953
3954 if (context)
3955 {
3956 gl::Texture *texture;
3957
3958 switch (target)
3959 {
3960 case GL_TEXTURE_2D:
3961 texture = context->getTexture2D();
3962 break;
3963 case GL_TEXTURE_CUBE_MAP:
3964 texture = context->getTextureCubeMap();
3965 break;
3966 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003967 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003968 }
3969
3970 switch (pname)
3971 {
3972 case GL_TEXTURE_MAG_FILTER:
3973 *params = (GLfloat)texture->getMagFilter();
3974 break;
3975 case GL_TEXTURE_MIN_FILTER:
3976 *params = (GLfloat)texture->getMinFilter();
3977 break;
3978 case GL_TEXTURE_WRAP_S:
3979 *params = (GLfloat)texture->getWrapS();
3980 break;
3981 case GL_TEXTURE_WRAP_T:
3982 *params = (GLfloat)texture->getWrapT();
3983 break;
daniel@transgaming.comd30bd0a2011-11-11 04:10:34 +00003984 case GL_TEXTURE_IMMUTABLE_FORMAT_EXT:
3985 *params = (GLfloat)(texture->isImmutable() ? GL_TRUE : GL_FALSE);
3986 break;
daniel@transgaming.com7d18c172011-11-11 04:18:21 +00003987 case GL_TEXTURE_USAGE_ANGLE:
3988 *params = (GLfloat)texture->getUsage();
3989 break;
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00003990 case GL_TEXTURE_MAX_ANISOTROPY_EXT:
3991 if (!context->supportsTextureFilterAnisotropy())
3992 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003993 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00003994 }
3995 *params = (GLfloat)texture->getMaxAnisotropy();
3996 break;
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003997 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003998 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003999 }
4000 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004001 }
4002 catch(std::bad_alloc&)
4003 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004004 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004005 }
4006}
4007
4008void __stdcall glGetTexParameteriv(GLenum target, GLenum pname, GLint* params)
4009{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004010 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 +00004011
4012 try
4013 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004014 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00004015
4016 if (context)
4017 {
4018 gl::Texture *texture;
4019
4020 switch (target)
4021 {
4022 case GL_TEXTURE_2D:
4023 texture = context->getTexture2D();
4024 break;
4025 case GL_TEXTURE_CUBE_MAP:
4026 texture = context->getTextureCubeMap();
4027 break;
4028 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004029 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00004030 }
4031
4032 switch (pname)
4033 {
4034 case GL_TEXTURE_MAG_FILTER:
4035 *params = texture->getMagFilter();
4036 break;
4037 case GL_TEXTURE_MIN_FILTER:
4038 *params = texture->getMinFilter();
4039 break;
4040 case GL_TEXTURE_WRAP_S:
4041 *params = texture->getWrapS();
4042 break;
4043 case GL_TEXTURE_WRAP_T:
4044 *params = texture->getWrapT();
4045 break;
daniel@transgaming.comd30bd0a2011-11-11 04:10:34 +00004046 case GL_TEXTURE_IMMUTABLE_FORMAT_EXT:
4047 *params = texture->isImmutable() ? GL_TRUE : GL_FALSE;
4048 break;
daniel@transgaming.com7d18c172011-11-11 04:18:21 +00004049 case GL_TEXTURE_USAGE_ANGLE:
4050 *params = texture->getUsage();
4051 break;
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00004052 case GL_TEXTURE_MAX_ANISOTROPY_EXT:
4053 if (!context->supportsTextureFilterAnisotropy())
4054 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004055 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00004056 }
4057 *params = (GLint)texture->getMaxAnisotropy();
4058 break;
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00004059 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004060 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00004061 }
4062 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004063 }
4064 catch(std::bad_alloc&)
4065 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004066 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004067 }
4068}
4069
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004070void __stdcall glGetnUniformfvEXT(GLuint program, GLint location, GLsizei bufSize, GLfloat* params)
4071{
4072 EVENT("(GLuint program = %d, GLint location = %d, GLsizei bufSize = %d, GLfloat* params = 0x%0.8p)",
4073 program, location, bufSize, params);
4074
4075 try
4076 {
4077 if (bufSize < 0)
4078 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004079 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004080 }
4081
4082 gl::Context *context = gl::getNonLostContext();
4083
4084 if (context)
4085 {
4086 if (program == 0)
4087 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004088 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004089 }
4090
4091 gl::Program *programObject = context->getProgram(program);
4092
daniel@transgaming.com716056c2012-07-24 18:38:59 +00004093 if (!programObject || !programObject->isLinked())
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
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00004098 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
4099 if (!programBinary)
4100 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004101 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00004102 }
4103
4104 if (!programBinary->getUniformfv(location, &bufSize, params))
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004105 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004106 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004107 }
4108 }
4109 }
4110 catch(std::bad_alloc&)
4111 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004112 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004113 }
4114}
4115
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004116void __stdcall glGetUniformfv(GLuint program, GLint location, GLfloat* params)
4117{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004118 EVENT("(GLuint program = %d, GLint location = %d, GLfloat* params = 0x%0.8p)", program, location, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004119
4120 try
4121 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004122 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004123
4124 if (context)
4125 {
4126 if (program == 0)
4127 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004128 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004129 }
4130
4131 gl::Program *programObject = context->getProgram(program);
4132
daniel@transgaming.com716056c2012-07-24 18:38:59 +00004133 if (!programObject || !programObject->isLinked())
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004134 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004135 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004136 }
4137
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00004138 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
4139 if (!programBinary)
4140 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004141 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00004142 }
4143
4144 if (!programBinary->getUniformfv(location, NULL, params))
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004145 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004146 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004147 }
4148 }
4149 }
4150 catch(std::bad_alloc&)
4151 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004152 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004153 }
4154}
4155
4156void __stdcall glGetnUniformivEXT(GLuint program, GLint location, GLsizei bufSize, GLint* params)
4157{
4158 EVENT("(GLuint program = %d, GLint location = %d, GLsizei bufSize = %d, GLint* params = 0x%0.8p)",
4159 program, location, bufSize, params);
4160
4161 try
4162 {
4163 if (bufSize < 0)
4164 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004165 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004166 }
4167
4168 gl::Context *context = gl::getNonLostContext();
4169
4170 if (context)
4171 {
4172 if (program == 0)
4173 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004174 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004175 }
4176
4177 gl::Program *programObject = context->getProgram(program);
4178
daniel@transgaming.com716056c2012-07-24 18:38:59 +00004179 if (!programObject || !programObject->isLinked())
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004180 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004181 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004182 }
4183
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00004184 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
4185 if (!programBinary)
4186 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004187 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00004188 }
4189
4190 if (!programBinary->getUniformiv(location, &bufSize, params))
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004191 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004192 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004193 }
4194 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004195 }
4196 catch(std::bad_alloc&)
4197 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004198 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004199 }
4200}
4201
4202void __stdcall glGetUniformiv(GLuint program, GLint location, GLint* params)
4203{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004204 EVENT("(GLuint program = %d, GLint location = %d, GLint* params = 0x%0.8p)", program, location, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004205
4206 try
4207 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004208 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004209
4210 if (context)
4211 {
4212 if (program == 0)
4213 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004214 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004215 }
4216
4217 gl::Program *programObject = context->getProgram(program);
4218
daniel@transgaming.com716056c2012-07-24 18:38:59 +00004219 if (!programObject || !programObject->isLinked())
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004220 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004221 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004222 }
4223
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00004224 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
4225 if (!programBinary)
4226 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004227 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00004228 }
4229
4230 if (!programBinary->getUniformiv(location, NULL, params))
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004231 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004232 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004233 }
4234 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004235 }
4236 catch(std::bad_alloc&)
4237 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004238 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004239 }
4240}
4241
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00004242int __stdcall glGetUniformLocation(GLuint program, const GLchar* name)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004243{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004244 EVENT("(GLuint program = %d, const GLchar* name = 0x%0.8p)", program, name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004245
4246 try
4247 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004248 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004249
4250 if (strstr(name, "gl_") == name)
4251 {
4252 return -1;
4253 }
4254
4255 if (context)
4256 {
4257 gl::Program *programObject = context->getProgram(program);
4258
4259 if (!programObject)
4260 {
daniel@transgaming.comd1abe5b2010-04-13 19:53:33 +00004261 if (context->getShader(program))
4262 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004263 return gl::error(GL_INVALID_OPERATION, -1);
daniel@transgaming.comd1abe5b2010-04-13 19:53:33 +00004264 }
4265 else
4266 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004267 return gl::error(GL_INVALID_VALUE, -1);
daniel@transgaming.comd1abe5b2010-04-13 19:53:33 +00004268 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004269 }
4270
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00004271 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
daniel@transgaming.com716056c2012-07-24 18:38:59 +00004272 if (!programObject->isLinked() || !programBinary)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004273 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004274 return gl::error(GL_INVALID_OPERATION, -1);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004275 }
4276
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00004277 return programBinary->getUniformLocation(name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004278 }
4279 }
4280 catch(std::bad_alloc&)
4281 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004282 return gl::error(GL_OUT_OF_MEMORY, -1);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004283 }
4284
4285 return -1;
4286}
4287
4288void __stdcall glGetVertexAttribfv(GLuint index, GLenum pname, GLfloat* params)
4289{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004290 EVENT("(GLuint index = %d, GLenum pname = 0x%X, GLfloat* params = 0x%0.8p)", index, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004291
4292 try
4293 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004294 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004295
daniel@transgaming.come0078962010-04-15 20:45:08 +00004296 if (context)
4297 {
4298 if (index >= gl::MAX_VERTEX_ATTRIBS)
4299 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004300 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004301 }
4302
daniel@transgaming.com83921382011-01-08 05:46:00 +00004303 const gl::VertexAttribute &attribState = context->getVertexAttribState(index);
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004304
daniel@transgaming.come0078962010-04-15 20:45:08 +00004305 switch (pname)
4306 {
4307 case GL_VERTEX_ATTRIB_ARRAY_ENABLED:
daniel@transgaming.com83921382011-01-08 05:46:00 +00004308 *params = (GLfloat)(attribState.mArrayEnabled ? GL_TRUE : GL_FALSE);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004309 break;
4310 case GL_VERTEX_ATTRIB_ARRAY_SIZE:
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004311 *params = (GLfloat)attribState.mSize;
daniel@transgaming.come0078962010-04-15 20:45:08 +00004312 break;
4313 case GL_VERTEX_ATTRIB_ARRAY_STRIDE:
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004314 *params = (GLfloat)attribState.mStride;
daniel@transgaming.come0078962010-04-15 20:45:08 +00004315 break;
4316 case GL_VERTEX_ATTRIB_ARRAY_TYPE:
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004317 *params = (GLfloat)attribState.mType;
daniel@transgaming.come0078962010-04-15 20:45:08 +00004318 break;
4319 case GL_VERTEX_ATTRIB_ARRAY_NORMALIZED:
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004320 *params = (GLfloat)(attribState.mNormalized ? GL_TRUE : GL_FALSE);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004321 break;
4322 case GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING:
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +00004323 *params = (GLfloat)attribState.mBoundBuffer.id();
daniel@transgaming.come0078962010-04-15 20:45:08 +00004324 break;
4325 case GL_CURRENT_VERTEX_ATTRIB:
4326 for (int i = 0; i < 4; ++i)
4327 {
shannon.woods%transgaming.com@gtempaccount.com3026dc72013-04-13 03:37:27 +00004328 params[i] = attribState.mCurrentValue.FloatValues[i];
daniel@transgaming.come0078962010-04-15 20:45:08 +00004329 }
4330 break;
shannon.woods%transgaming.com@gtempaccount.com14eb55e2013-04-13 03:35:06 +00004331 case GL_VERTEX_ATTRIB_ARRAY_DIVISOR:
4332 // Don't verify ES3 context because GL_VERTEX_ATTRIB_ARRAY_DIVISOR_ANGLE uses
4333 // the same constant.
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00004334 *params = (GLfloat)attribState.mDivisor;
4335 break;
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004336 default: return gl::error(GL_INVALID_ENUM);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004337 }
4338 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004339 }
4340 catch(std::bad_alloc&)
4341 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004342 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004343 }
4344}
4345
4346void __stdcall glGetVertexAttribiv(GLuint index, GLenum pname, GLint* params)
4347{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004348 EVENT("(GLuint index = %d, GLenum pname = 0x%X, GLint* params = 0x%0.8p)", index, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004349
4350 try
4351 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004352 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004353
daniel@transgaming.come0078962010-04-15 20:45:08 +00004354 if (context)
4355 {
4356 if (index >= gl::MAX_VERTEX_ATTRIBS)
4357 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004358 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004359 }
4360
daniel@transgaming.com83921382011-01-08 05:46:00 +00004361 const gl::VertexAttribute &attribState = context->getVertexAttribState(index);
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004362
daniel@transgaming.come0078962010-04-15 20:45:08 +00004363 switch (pname)
4364 {
4365 case GL_VERTEX_ATTRIB_ARRAY_ENABLED:
daniel@transgaming.com83921382011-01-08 05:46:00 +00004366 *params = (attribState.mArrayEnabled ? GL_TRUE : GL_FALSE);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004367 break;
4368 case GL_VERTEX_ATTRIB_ARRAY_SIZE:
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004369 *params = attribState.mSize;
daniel@transgaming.come0078962010-04-15 20:45:08 +00004370 break;
4371 case GL_VERTEX_ATTRIB_ARRAY_STRIDE:
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004372 *params = attribState.mStride;
daniel@transgaming.come0078962010-04-15 20:45:08 +00004373 break;
4374 case GL_VERTEX_ATTRIB_ARRAY_TYPE:
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004375 *params = attribState.mType;
daniel@transgaming.come0078962010-04-15 20:45:08 +00004376 break;
4377 case GL_VERTEX_ATTRIB_ARRAY_NORMALIZED:
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004378 *params = (attribState.mNormalized ? GL_TRUE : GL_FALSE);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004379 break;
4380 case GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING:
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +00004381 *params = attribState.mBoundBuffer.id();
daniel@transgaming.come0078962010-04-15 20:45:08 +00004382 break;
4383 case GL_CURRENT_VERTEX_ATTRIB:
4384 for (int i = 0; i < 4; ++i)
4385 {
shannon.woods%transgaming.com@gtempaccount.com3026dc72013-04-13 03:37:27 +00004386 float currentValue = attribState.mCurrentValue.FloatValues[i];
daniel@transgaming.come0078962010-04-15 20:45:08 +00004387 params[i] = (GLint)(currentValue > 0.0f ? floor(currentValue + 0.5f) : ceil(currentValue - 0.5f));
4388 }
4389 break;
shannon.woods%transgaming.com@gtempaccount.com14eb55e2013-04-13 03:35:06 +00004390 case GL_VERTEX_ATTRIB_ARRAY_DIVISOR:
4391 // Don't verify ES3 context because GL_VERTEX_ATTRIB_ARRAY_DIVISOR_ANGLE uses
4392 // the same constant.
4393 META_ASSERT(GL_VERTEX_ATTRIB_ARRAY_DIVISOR == GL_VERTEX_ATTRIB_ARRAY_DIVISOR_ANGLE);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00004394 *params = (GLint)attribState.mDivisor;
4395 break;
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004396 default: return gl::error(GL_INVALID_ENUM);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004397 }
4398 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004399 }
4400 catch(std::bad_alloc&)
4401 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004402 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004403 }
4404}
4405
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00004406void __stdcall glGetVertexAttribPointerv(GLuint index, GLenum pname, GLvoid** pointer)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004407{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004408 EVENT("(GLuint index = %d, GLenum pname = 0x%X, GLvoid** pointer = 0x%0.8p)", index, pname, pointer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004409
4410 try
4411 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004412 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004413
daniel@transgaming.come0078962010-04-15 20:45:08 +00004414 if (context)
4415 {
4416 if (index >= gl::MAX_VERTEX_ATTRIBS)
4417 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004418 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004419 }
4420
4421 if (pname != GL_VERTEX_ATTRIB_ARRAY_POINTER)
4422 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004423 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004424 }
4425
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004426 *pointer = const_cast<GLvoid*>(context->getVertexAttribPointer(index));
daniel@transgaming.come0078962010-04-15 20:45:08 +00004427 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004428 }
4429 catch(std::bad_alloc&)
4430 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004431 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004432 }
4433}
4434
4435void __stdcall glHint(GLenum target, GLenum mode)
4436{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004437 EVENT("(GLenum target = 0x%X, GLenum mode = 0x%X)", target, mode);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004438
4439 try
4440 {
alokp@chromium.orgd303ef92010-09-09 17:30:15 +00004441 switch (mode)
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00004442 {
alokp@chromium.orgd303ef92010-09-09 17:30:15 +00004443 case GL_FASTEST:
4444 case GL_NICEST:
4445 case GL_DONT_CARE:
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00004446 break;
4447 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004448 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00004449 }
4450
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004451 gl::Context *context = gl::getNonLostContext();
alokp@chromium.orgd303ef92010-09-09 17:30:15 +00004452 switch (target)
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00004453 {
alokp@chromium.orgd303ef92010-09-09 17:30:15 +00004454 case GL_GENERATE_MIPMAP_HINT:
4455 if (context) context->setGenerateMipmapHint(mode);
4456 break;
4457 case GL_FRAGMENT_SHADER_DERIVATIVE_HINT_OES:
4458 if (context) context->setFragmentShaderDerivativeHint(mode);
4459 break;
4460 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004461 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00004462 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004463 }
4464 catch(std::bad_alloc&)
4465 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004466 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004467 }
4468}
4469
4470GLboolean __stdcall glIsBuffer(GLuint buffer)
4471{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004472 EVENT("(GLuint buffer = %d)", buffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004473
4474 try
4475 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004476 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004477
4478 if (context && buffer)
4479 {
4480 gl::Buffer *bufferObject = context->getBuffer(buffer);
4481
4482 if (bufferObject)
4483 {
4484 return GL_TRUE;
4485 }
4486 }
4487 }
4488 catch(std::bad_alloc&)
4489 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004490 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004491 }
4492
4493 return GL_FALSE;
4494}
4495
4496GLboolean __stdcall glIsEnabled(GLenum cap)
4497{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004498 EVENT("(GLenum cap = 0x%X)", cap);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004499
4500 try
4501 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004502 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004503
4504 if (context)
4505 {
4506 switch (cap)
4507 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004508 case GL_CULL_FACE: return context->isCullFaceEnabled();
4509 case GL_POLYGON_OFFSET_FILL: return context->isPolygonOffsetFillEnabled();
4510 case GL_SAMPLE_ALPHA_TO_COVERAGE: return context->isSampleAlphaToCoverageEnabled();
4511 case GL_SAMPLE_COVERAGE: return context->isSampleCoverageEnabled();
4512 case GL_SCISSOR_TEST: return context->isScissorTestEnabled();
4513 case GL_STENCIL_TEST: return context->isStencilTestEnabled();
4514 case GL_DEPTH_TEST: return context->isDepthTestEnabled();
4515 case GL_BLEND: return context->isBlendEnabled();
4516 case GL_DITHER: return context->isDitherEnabled();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004517 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004518 return gl::error(GL_INVALID_ENUM, false);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004519 }
4520 }
4521 }
4522 catch(std::bad_alloc&)
4523 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004524 return gl::error(GL_OUT_OF_MEMORY, false);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004525 }
4526
4527 return false;
4528}
4529
daniel@transgaming.comfe208882010-09-01 15:47:57 +00004530GLboolean __stdcall glIsFenceNV(GLuint fence)
4531{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004532 EVENT("(GLuint fence = %d)", fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004533
4534 try
4535 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004536 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004537
4538 if (context)
4539 {
4540 gl::Fence *fenceObject = context->getFence(fence);
4541
4542 if (fenceObject == NULL)
4543 {
4544 return GL_FALSE;
4545 }
4546
4547 return fenceObject->isFence();
4548 }
4549 }
4550 catch(std::bad_alloc&)
4551 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004552 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004553 }
4554
4555 return GL_FALSE;
daniel@transgaming.comfe208882010-09-01 15:47:57 +00004556}
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004557
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004558GLboolean __stdcall glIsFramebuffer(GLuint framebuffer)
4559{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004560 EVENT("(GLuint framebuffer = %d)", framebuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004561
4562 try
4563 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004564 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004565
4566 if (context && framebuffer)
4567 {
4568 gl::Framebuffer *framebufferObject = context->getFramebuffer(framebuffer);
4569
4570 if (framebufferObject)
4571 {
4572 return GL_TRUE;
4573 }
4574 }
4575 }
4576 catch(std::bad_alloc&)
4577 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004578 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004579 }
4580
4581 return GL_FALSE;
4582}
4583
4584GLboolean __stdcall glIsProgram(GLuint program)
4585{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004586 EVENT("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004587
4588 try
4589 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004590 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004591
4592 if (context && program)
4593 {
4594 gl::Program *programObject = context->getProgram(program);
4595
4596 if (programObject)
4597 {
4598 return GL_TRUE;
4599 }
4600 }
4601 }
4602 catch(std::bad_alloc&)
4603 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004604 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004605 }
4606
4607 return GL_FALSE;
4608}
4609
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00004610GLboolean __stdcall glIsQueryEXT(GLuint id)
4611{
4612 EVENT("(GLuint id = %d)", id);
4613
4614 try
4615 {
4616 if (id == 0)
4617 {
4618 return GL_FALSE;
4619 }
4620
4621 gl::Context *context = gl::getNonLostContext();
4622
4623 if (context)
4624 {
4625 gl::Query *queryObject = context->getQuery(id, false, GL_NONE);
4626
4627 if (queryObject)
4628 {
4629 return GL_TRUE;
4630 }
4631 }
4632 }
4633 catch(std::bad_alloc&)
4634 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004635 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00004636 }
4637
4638 return GL_FALSE;
4639}
4640
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004641GLboolean __stdcall glIsRenderbuffer(GLuint renderbuffer)
4642{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004643 EVENT("(GLuint renderbuffer = %d)", renderbuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004644
4645 try
4646 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004647 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004648
4649 if (context && renderbuffer)
4650 {
4651 gl::Renderbuffer *renderbufferObject = context->getRenderbuffer(renderbuffer);
4652
4653 if (renderbufferObject)
4654 {
4655 return GL_TRUE;
4656 }
4657 }
4658 }
4659 catch(std::bad_alloc&)
4660 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004661 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004662 }
4663
4664 return GL_FALSE;
4665}
4666
4667GLboolean __stdcall glIsShader(GLuint shader)
4668{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004669 EVENT("(GLuint shader = %d)", shader);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004670
4671 try
4672 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004673 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004674
4675 if (context && shader)
4676 {
4677 gl::Shader *shaderObject = context->getShader(shader);
4678
4679 if (shaderObject)
4680 {
4681 return GL_TRUE;
4682 }
4683 }
4684 }
4685 catch(std::bad_alloc&)
4686 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004687 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004688 }
4689
4690 return GL_FALSE;
4691}
4692
4693GLboolean __stdcall glIsTexture(GLuint texture)
4694{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004695 EVENT("(GLuint texture = %d)", texture);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004696
4697 try
4698 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004699 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004700
4701 if (context && texture)
4702 {
4703 gl::Texture *textureObject = context->getTexture(texture);
4704
4705 if (textureObject)
4706 {
4707 return GL_TRUE;
4708 }
4709 }
4710 }
4711 catch(std::bad_alloc&)
4712 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004713 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004714 }
4715
4716 return GL_FALSE;
4717}
4718
4719void __stdcall glLineWidth(GLfloat width)
4720{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004721 EVENT("(GLfloat width = %f)", width);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004722
4723 try
4724 {
4725 if (width <= 0.0f)
4726 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004727 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004728 }
4729
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004730 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com32e58cd2010-03-24 09:44:10 +00004731
4732 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004733 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004734 context->setLineWidth(width);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004735 }
4736 }
4737 catch(std::bad_alloc&)
4738 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004739 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004740 }
4741}
4742
4743void __stdcall glLinkProgram(GLuint program)
4744{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004745 EVENT("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004746
4747 try
4748 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004749 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004750
4751 if (context)
4752 {
4753 gl::Program *programObject = context->getProgram(program);
4754
4755 if (!programObject)
4756 {
daniel@transgaming.com277b7142010-04-13 03:26:44 +00004757 if (context->getShader(program))
4758 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004759 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com277b7142010-04-13 03:26:44 +00004760 }
4761 else
4762 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004763 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com277b7142010-04-13 03:26:44 +00004764 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004765 }
4766
daniel@transgaming.com95d29422012-07-24 18:36:10 +00004767 context->linkProgram(program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004768 }
4769 }
4770 catch(std::bad_alloc&)
4771 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004772 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004773 }
4774}
4775
4776void __stdcall glPixelStorei(GLenum pname, GLint param)
4777{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004778 EVENT("(GLenum pname = 0x%X, GLint param = %d)", pname, param);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004779
4780 try
4781 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004782 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004783
4784 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004785 {
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004786 switch (pname)
4787 {
4788 case GL_UNPACK_ALIGNMENT:
4789 if (param != 1 && param != 2 && param != 4 && param != 8)
4790 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004791 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004792 }
4793
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004794 context->setUnpackAlignment(param);
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004795 break;
4796
4797 case GL_PACK_ALIGNMENT:
4798 if (param != 1 && param != 2 && param != 4 && param != 8)
4799 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004800 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004801 }
4802
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004803 context->setPackAlignment(param);
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004804 break;
4805
bsalomon@google.com56d46ab2011-11-23 14:53:10 +00004806 case GL_PACK_REVERSE_ROW_ORDER_ANGLE:
4807 context->setPackReverseRowOrder(param != 0);
4808 break;
4809
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004810 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004811 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004812 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004813 }
4814 }
4815 catch(std::bad_alloc&)
4816 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004817 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004818 }
4819}
4820
4821void __stdcall glPolygonOffset(GLfloat factor, GLfloat units)
4822{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004823 EVENT("(GLfloat factor = %f, GLfloat units = %f)", factor, units);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004824
4825 try
4826 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004827 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comaede6302010-04-29 03:35:48 +00004828
4829 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004830 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004831 context->setPolygonOffsetParams(factor, units);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004832 }
4833 }
4834 catch(std::bad_alloc&)
4835 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004836 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004837 }
4838}
4839
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00004840void __stdcall glReadnPixelsEXT(GLint x, GLint y, GLsizei width, GLsizei height,
4841 GLenum format, GLenum type, GLsizei bufSize,
4842 GLvoid *data)
4843{
4844 EVENT("(GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d, "
4845 "GLenum format = 0x%X, GLenum type = 0x%X, GLsizei bufSize = 0x%d, GLvoid *data = 0x%0.8p)",
4846 x, y, width, height, format, type, bufSize, data);
4847
4848 try
4849 {
4850 if (width < 0 || height < 0 || bufSize < 0)
4851 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004852 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00004853 }
4854
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00004855 gl::Context *context = gl::getNonLostContext();
4856
4857 if (context)
4858 {
daniel@transgaming.com42944b02012-09-27 17:45:57 +00004859 GLenum currentFormat, currentType;
4860
4861 // Failure in getCurrentReadFormatType indicates that no color attachment is currently bound,
4862 // and attempting to read back if that's the case is an error. The error will be registered
4863 // by getCurrentReadFormat.
4864 if (!context->getCurrentReadFormatType(&currentFormat, &currentType))
4865 return;
4866
4867 if (!(currentFormat == format && currentType == type) && !validReadFormatType(format, type))
4868 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004869 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com42944b02012-09-27 17:45:57 +00004870 }
4871
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00004872 context->readPixels(x, y, width, height, format, type, &bufSize, data);
4873 }
4874 }
4875 catch(std::bad_alloc&)
4876 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004877 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00004878 }
4879}
4880
4881void __stdcall glReadPixels(GLint x, GLint y, GLsizei width, GLsizei height,
4882 GLenum format, GLenum type, GLvoid* pixels)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004883{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004884 EVENT("(GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00004885 "GLenum format = 0x%X, GLenum type = 0x%X, GLvoid* pixels = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00004886 x, y, width, height, format, type, pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004887
4888 try
4889 {
4890 if (width < 0 || height < 0)
4891 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004892 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004893 }
4894
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004895 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004896
4897 if (context)
4898 {
daniel@transgaming.com42944b02012-09-27 17:45:57 +00004899 GLenum currentFormat, currentType;
4900
4901 // Failure in getCurrentReadFormatType indicates that no color attachment is currently bound,
4902 // and attempting to read back if that's the case is an error. The error will be registered
4903 // by getCurrentReadFormat.
4904 if (!context->getCurrentReadFormatType(&currentFormat, &currentType))
4905 return;
4906
4907 if (!(currentFormat == format && currentType == type) && !validReadFormatType(format, type))
4908 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004909 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com42944b02012-09-27 17:45:57 +00004910 }
4911
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00004912 context->readPixels(x, y, width, height, format, type, NULL, pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004913 }
4914 }
4915 catch(std::bad_alloc&)
4916 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004917 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004918 }
4919}
4920
4921void __stdcall glReleaseShaderCompiler(void)
4922{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004923 EVENT("()");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004924
4925 try
4926 {
4927 gl::Shader::releaseCompiler();
4928 }
4929 catch(std::bad_alloc&)
4930 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004931 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004932 }
4933}
4934
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00004935void __stdcall glRenderbufferStorageMultisampleANGLE(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004936{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004937 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 +00004938 target, samples, internalformat, width, height);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004939
4940 try
4941 {
4942 switch (target)
4943 {
4944 case GL_RENDERBUFFER:
4945 break;
4946 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004947 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004948 }
4949
daniel@transgaming.comedc19182010-10-15 17:57:55 +00004950 if (!gl::IsColorRenderable(internalformat) && !gl::IsDepthRenderable(internalformat) && !gl::IsStencilRenderable(internalformat))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004951 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004952 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004953 }
4954
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00004955 if (width < 0 || height < 0 || samples < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004956 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004957 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004958 }
4959
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004960 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004961
4962 if (context)
4963 {
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00004964 if (width > context->getMaximumRenderbufferDimension() ||
4965 height > context->getMaximumRenderbufferDimension() ||
4966 samples > context->getMaxSupportedSamples())
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00004967 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004968 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00004969 }
4970
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +00004971 GLuint handle = context->getRenderbufferHandle();
4972 if (handle == 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004973 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004974 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004975 }
4976
4977 switch (internalformat)
4978 {
4979 case GL_DEPTH_COMPONENT16:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004980 case GL_RGBA4:
4981 case GL_RGB5_A1:
4982 case GL_RGB565:
daniel@transgaming.com63977542010-08-24 19:21:02 +00004983 case GL_RGB8_OES:
4984 case GL_RGBA8_OES:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004985 case GL_STENCIL_INDEX8:
daniel@transgaming.comcdacc8e2010-07-28 19:20:50 +00004986 case GL_DEPTH24_STENCIL8_OES:
daniel@transgaming.com70062c92012-11-28 19:32:30 +00004987 context->setRenderbufferStorage(width, height, internalformat, samples);
daniel@transgaming.comcdacc8e2010-07-28 19:20:50 +00004988 break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004989 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004990 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004991 }
4992 }
4993 }
4994 catch(std::bad_alloc&)
4995 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004996 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004997 }
4998}
4999
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00005000void __stdcall glRenderbufferStorage(GLenum target, GLenum internalformat, GLsizei width, GLsizei height)
5001{
5002 glRenderbufferStorageMultisampleANGLE(target, 0, internalformat, width, height);
5003}
5004
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005005void __stdcall glSampleCoverage(GLclampf value, GLboolean invert)
5006{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005007 EVENT("(GLclampf value = %f, GLboolean invert = %u)", value, invert);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005008
5009 try
5010 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005011 gl::Context* context = gl::getNonLostContext();
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00005012
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005013 if (context)
5014 {
daniel@transgaming.coma36f98e2010-05-18 18:51:09 +00005015 context->setSampleCoverageParams(gl::clamp01(value), invert == GL_TRUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005016 }
5017 }
5018 catch(std::bad_alloc&)
5019 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005020 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005021 }
5022}
5023
daniel@transgaming.comfe208882010-09-01 15:47:57 +00005024void __stdcall glSetFenceNV(GLuint fence, GLenum condition)
5025{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005026 EVENT("(GLuint fence = %d, GLenum condition = 0x%X)", fence, condition);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005027
5028 try
5029 {
5030 if (condition != GL_ALL_COMPLETED_NV)
5031 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005032 return gl::error(GL_INVALID_ENUM);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005033 }
5034
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005035 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005036
5037 if (context)
5038 {
5039 gl::Fence *fenceObject = context->getFence(fence);
5040
5041 if (fenceObject == NULL)
5042 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005043 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005044 }
5045
5046 fenceObject->setFence(condition);
5047 }
5048 }
5049 catch(std::bad_alloc&)
5050 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005051 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005052 }
daniel@transgaming.comfe208882010-09-01 15:47:57 +00005053}
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005054
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005055void __stdcall glScissor(GLint x, GLint y, GLsizei width, GLsizei height)
5056{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005057 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 +00005058
5059 try
5060 {
5061 if (width < 0 || height < 0)
5062 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005063 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005064 }
5065
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005066 gl::Context* context = gl::getNonLostContext();
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00005067
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005068 if (context)
5069 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00005070 context->setScissorParams(x, y, width, height);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005071 }
5072 }
5073 catch(std::bad_alloc&)
5074 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005075 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005076 }
5077}
5078
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00005079void __stdcall glShaderBinary(GLsizei n, const GLuint* shaders, GLenum binaryformat, const GLvoid* binary, GLsizei length)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005080{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005081 EVENT("(GLsizei n = %d, const GLuint* shaders = 0x%0.8p, GLenum binaryformat = 0x%X, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00005082 "const GLvoid* binary = 0x%0.8p, GLsizei length = %d)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00005083 n, shaders, binaryformat, binary, length);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005084
5085 try
5086 {
daniel@transgaming.comd1f667f2010-04-29 03:38:52 +00005087 // No binary shader formats are supported.
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005088 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005089 }
5090 catch(std::bad_alloc&)
5091 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005092 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005093 }
5094}
5095
shannon.woods%transgaming.com@gtempaccount.com5f339332013-04-13 03:29:02 +00005096void __stdcall glShaderSource(GLuint shader, GLsizei count, const GLchar* const* string, const GLint* length)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005097{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005098 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 +00005099 shader, count, string, length);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005100
5101 try
5102 {
daniel@transgaming.com8e6a6be2010-04-13 03:26:41 +00005103 if (count < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005104 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005105 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005106 }
5107
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005108 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005109
5110 if (context)
5111 {
5112 gl::Shader *shaderObject = context->getShader(shader);
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00005113
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005114 if (!shaderObject)
5115 {
daniel@transgaming.com8e6a6be2010-04-13 03:26:41 +00005116 if (context->getProgram(shader))
5117 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005118 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com8e6a6be2010-04-13 03:26:41 +00005119 }
5120 else
5121 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005122 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com8e6a6be2010-04-13 03:26:41 +00005123 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005124 }
5125
5126 shaderObject->setSource(count, string, length);
5127 }
5128 }
5129 catch(std::bad_alloc&)
5130 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005131 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005132 }
5133}
5134
5135void __stdcall glStencilFunc(GLenum func, GLint ref, GLuint mask)
5136{
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00005137 glStencilFuncSeparate(GL_FRONT_AND_BACK, func, ref, mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005138}
5139
5140void __stdcall glStencilFuncSeparate(GLenum face, GLenum func, GLint ref, GLuint mask)
5141{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005142 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 +00005143
5144 try
5145 {
5146 switch (face)
5147 {
5148 case GL_FRONT:
5149 case GL_BACK:
5150 case GL_FRONT_AND_BACK:
5151 break;
5152 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005153 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005154 }
5155
5156 switch (func)
5157 {
5158 case GL_NEVER:
5159 case GL_ALWAYS:
5160 case GL_LESS:
5161 case GL_LEQUAL:
5162 case GL_EQUAL:
5163 case GL_GEQUAL:
5164 case GL_GREATER:
5165 case GL_NOTEQUAL:
5166 break;
5167 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005168 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005169 }
5170
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005171 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005172
5173 if (context)
5174 {
5175 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
5176 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00005177 context->setStencilParams(func, ref, mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005178 }
5179
5180 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
5181 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00005182 context->setStencilBackParams(func, ref, mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005183 }
5184 }
5185 }
5186 catch(std::bad_alloc&)
5187 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005188 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005189 }
5190}
5191
5192void __stdcall glStencilMask(GLuint mask)
5193{
5194 glStencilMaskSeparate(GL_FRONT_AND_BACK, mask);
5195}
5196
5197void __stdcall glStencilMaskSeparate(GLenum face, GLuint mask)
5198{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005199 EVENT("(GLenum face = 0x%X, GLuint mask = %d)", face, mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005200
5201 try
5202 {
5203 switch (face)
5204 {
5205 case GL_FRONT:
5206 case GL_BACK:
5207 case GL_FRONT_AND_BACK:
5208 break;
5209 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005210 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005211 }
5212
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005213 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005214
5215 if (context)
5216 {
5217 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
5218 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00005219 context->setStencilWritemask(mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005220 }
5221
5222 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
5223 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00005224 context->setStencilBackWritemask(mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005225 }
5226 }
5227 }
5228 catch(std::bad_alloc&)
5229 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005230 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005231 }
5232}
5233
5234void __stdcall glStencilOp(GLenum fail, GLenum zfail, GLenum zpass)
5235{
5236 glStencilOpSeparate(GL_FRONT_AND_BACK, fail, zfail, zpass);
5237}
5238
5239void __stdcall glStencilOpSeparate(GLenum face, GLenum fail, GLenum zfail, GLenum zpass)
5240{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005241 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 +00005242 face, fail, zfail, zpass);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005243
5244 try
5245 {
5246 switch (face)
5247 {
5248 case GL_FRONT:
5249 case GL_BACK:
5250 case GL_FRONT_AND_BACK:
5251 break;
5252 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005253 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005254 }
5255
5256 switch (fail)
5257 {
5258 case GL_ZERO:
5259 case GL_KEEP:
5260 case GL_REPLACE:
5261 case GL_INCR:
5262 case GL_DECR:
5263 case GL_INVERT:
5264 case GL_INCR_WRAP:
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00005265 case GL_DECR_WRAP:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005266 break;
5267 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005268 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005269 }
5270
5271 switch (zfail)
5272 {
5273 case GL_ZERO:
5274 case GL_KEEP:
5275 case GL_REPLACE:
5276 case GL_INCR:
5277 case GL_DECR:
5278 case GL_INVERT:
5279 case GL_INCR_WRAP:
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00005280 case GL_DECR_WRAP:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005281 break;
5282 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005283 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005284 }
5285
5286 switch (zpass)
5287 {
5288 case GL_ZERO:
5289 case GL_KEEP:
5290 case GL_REPLACE:
5291 case GL_INCR:
5292 case GL_DECR:
5293 case GL_INVERT:
5294 case GL_INCR_WRAP:
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00005295 case GL_DECR_WRAP:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005296 break;
5297 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005298 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005299 }
5300
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005301 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005302
5303 if (context)
5304 {
5305 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
5306 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00005307 context->setStencilOperations(fail, zfail, zpass);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005308 }
5309
5310 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
5311 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00005312 context->setStencilBackOperations(fail, zfail, zpass);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005313 }
5314 }
5315 }
5316 catch(std::bad_alloc&)
5317 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005318 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005319 }
5320}
5321
daniel@transgaming.comfe208882010-09-01 15:47:57 +00005322GLboolean __stdcall glTestFenceNV(GLuint fence)
5323{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005324 EVENT("(GLuint fence = %d)", fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005325
5326 try
5327 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005328 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005329
5330 if (context)
5331 {
5332 gl::Fence *fenceObject = context->getFence(fence);
5333
5334 if (fenceObject == NULL)
5335 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005336 return gl::error(GL_INVALID_OPERATION, GL_TRUE);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005337 }
5338
5339 return fenceObject->testFence();
5340 }
5341 }
5342 catch(std::bad_alloc&)
5343 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005344 gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005345 }
5346
5347 return GL_TRUE;
daniel@transgaming.comfe208882010-09-01 15:47:57 +00005348}
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005349
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00005350void __stdcall glTexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height,
5351 GLint border, GLenum format, GLenum type, const GLvoid* pixels)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005352{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005353 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 +00005354 "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 +00005355 target, level, internalformat, width, height, border, format, type, pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005356
5357 try
5358 {
daniel@transgaming.com4f9ef0d2011-05-30 23:51:19 +00005359 if (!validImageSize(level, width, height))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005360 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005361 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005362 }
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00005363
apatrick@chromium.orge057c5d2012-01-26 19:18:24 +00005364 if (internalformat != GLint(format))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005365 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005366 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005367 }
5368
daniel@transgaming.com6377e362012-06-05 19:49:55 +00005369 // validate <type> by itself (used as secondary key below)
5370 switch (type)
5371 {
5372 case GL_UNSIGNED_BYTE:
5373 case GL_UNSIGNED_SHORT_5_6_5:
5374 case GL_UNSIGNED_SHORT_4_4_4_4:
5375 case GL_UNSIGNED_SHORT_5_5_5_1:
5376 case GL_UNSIGNED_SHORT:
5377 case GL_UNSIGNED_INT:
5378 case GL_UNSIGNED_INT_24_8_OES:
5379 case GL_HALF_FLOAT_OES:
5380 case GL_FLOAT:
5381 break;
5382 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005383 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com6377e362012-06-05 19:49:55 +00005384 }
5385
5386 // validate <format> + <type> combinations
5387 // - invalid <format> -> sets INVALID_ENUM
5388 // - invalid <format>+<type> combination -> sets INVALID_OPERATION
daniel@transgaming.com8a0a2db2011-03-21 16:38:20 +00005389 switch (format)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005390 {
5391 case GL_ALPHA:
5392 case GL_LUMINANCE:
5393 case GL_LUMINANCE_ALPHA:
5394 switch (type)
5395 {
5396 case GL_UNSIGNED_BYTE:
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00005397 case GL_FLOAT:
5398 case GL_HALF_FLOAT_OES:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005399 break;
5400 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005401 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005402 }
5403 break;
5404 case GL_RGB:
5405 switch (type)
5406 {
5407 case GL_UNSIGNED_BYTE:
5408 case GL_UNSIGNED_SHORT_5_6_5:
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00005409 case GL_FLOAT:
5410 case GL_HALF_FLOAT_OES:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005411 break;
5412 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005413 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005414 }
5415 break;
5416 case GL_RGBA:
5417 switch (type)
5418 {
5419 case GL_UNSIGNED_BYTE:
5420 case GL_UNSIGNED_SHORT_4_4_4_4:
5421 case GL_UNSIGNED_SHORT_5_5_5_1:
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00005422 case GL_FLOAT:
5423 case GL_HALF_FLOAT_OES:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005424 break;
5425 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005426 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005427 }
5428 break;
daniel@transgaming.coma9198d92010-08-08 04:49:56 +00005429 case GL_BGRA_EXT:
5430 switch (type)
5431 {
5432 case GL_UNSIGNED_BYTE:
5433 break;
5434 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005435 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.coma9198d92010-08-08 04:49:56 +00005436 }
5437 break;
daniel@transgaming.com01868132010-08-24 19:21:17 +00005438 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT: // error cases for compressed textures are handled below
5439 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
gman@chromium.org50c526d2011-08-10 05:19:44 +00005440 case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
5441 case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
daniel@transgaming.com01868132010-08-24 19:21:17 +00005442 break;
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00005443 case GL_DEPTH_COMPONENT:
5444 switch (type)
5445 {
5446 case GL_UNSIGNED_SHORT:
5447 case GL_UNSIGNED_INT:
5448 break;
5449 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005450 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00005451 }
5452 break;
5453 case GL_DEPTH_STENCIL_OES:
5454 switch (type)
5455 {
5456 case GL_UNSIGNED_INT_24_8_OES:
5457 break;
5458 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005459 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00005460 }
5461 break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005462 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005463 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005464 }
5465
5466 if (border != 0)
5467 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005468 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005469 }
5470
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005471 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005472
5473 if (context)
5474 {
daniel@transgaming.com32b11442011-11-19 02:42:48 +00005475 if (level > context->getMaximumTextureLevel())
5476 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005477 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com32b11442011-11-19 02:42:48 +00005478 }
5479
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00005480 switch (target)
5481 {
5482 case GL_TEXTURE_2D:
5483 if (width > (context->getMaximumTextureDimension() >> level) ||
5484 height > (context->getMaximumTextureDimension() >> level))
5485 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005486 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00005487 }
5488 break;
5489 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
5490 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
5491 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
5492 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
5493 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
5494 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
5495 if (width != height)
5496 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005497 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00005498 }
5499
5500 if (width > (context->getMaximumCubeTextureDimension() >> level) ||
5501 height > (context->getMaximumCubeTextureDimension() >> level))
5502 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005503 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00005504 }
5505 break;
5506 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005507 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00005508 }
5509
gman@chromium.org50c526d2011-08-10 05:19:44 +00005510 switch (format) {
5511 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
5512 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
5513 if (context->supportsDXT1Textures())
daniel@transgaming.com01868132010-08-24 19:21:17 +00005514 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005515 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com01868132010-08-24 19:21:17 +00005516 }
5517 else
5518 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005519 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com01868132010-08-24 19:21:17 +00005520 }
gman@chromium.org50c526d2011-08-10 05:19:44 +00005521 break;
5522 case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
5523 if (context->supportsDXT3Textures())
5524 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005525 return gl::error(GL_INVALID_OPERATION);
gman@chromium.org50c526d2011-08-10 05:19:44 +00005526 }
5527 else
5528 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005529 return gl::error(GL_INVALID_ENUM);
gman@chromium.org50c526d2011-08-10 05:19:44 +00005530 }
5531 break;
5532 case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
5533 if (context->supportsDXT5Textures())
5534 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005535 return gl::error(GL_INVALID_OPERATION);
gman@chromium.org50c526d2011-08-10 05:19:44 +00005536 }
5537 else
5538 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005539 return gl::error(GL_INVALID_ENUM);
gman@chromium.org50c526d2011-08-10 05:19:44 +00005540 }
5541 break;
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00005542 case GL_DEPTH_COMPONENT:
5543 case GL_DEPTH_STENCIL_OES:
5544 if (!context->supportsDepthTextures())
5545 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005546 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00005547 }
daniel@transgaming.com0c854682012-05-31 01:14:11 +00005548 if (target != GL_TEXTURE_2D)
5549 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005550 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com0c854682012-05-31 01:14:11 +00005551 }
daniel@transgaming.com797924b2012-06-05 19:50:01 +00005552 // OES_depth_texture supports loading depth data and multiple levels,
5553 // but ANGLE_depth_texture does not
5554 if (pixels != NULL || level != 0)
daniel@transgaming.com0c854682012-05-31 01:14:11 +00005555 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005556 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com0c854682012-05-31 01:14:11 +00005557 }
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00005558 break;
gman@chromium.org50c526d2011-08-10 05:19:44 +00005559 default:
5560 break;
daniel@transgaming.com01868132010-08-24 19:21:17 +00005561 }
5562
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00005563 if (type == GL_FLOAT)
5564 {
daniel@transgaming.combbeffbb2011-11-09 17:46:11 +00005565 if (!context->supportsFloat32Textures())
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00005566 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005567 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00005568 }
5569 }
5570 else if (type == GL_HALF_FLOAT_OES)
5571 {
daniel@transgaming.combbeffbb2011-11-09 17:46:11 +00005572 if (!context->supportsFloat16Textures())
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00005573 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005574 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00005575 }
5576 }
5577
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005578 if (target == GL_TEXTURE_2D)
5579 {
5580 gl::Texture2D *texture = context->getTexture2D();
5581
5582 if (!texture)
5583 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005584 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005585 }
5586
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005587 if (texture->isImmutable())
5588 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005589 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005590 }
5591
daniel@transgaming.com8a0a2db2011-03-21 16:38:20 +00005592 texture->setImage(level, width, height, format, type, context->getUnpackAlignment(), pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005593 }
5594 else
5595 {
5596 gl::TextureCubeMap *texture = context->getTextureCubeMap();
5597
5598 if (!texture)
5599 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005600 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005601 }
5602
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005603 if (texture->isImmutable())
5604 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005605 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005606 }
5607
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005608 switch (target)
5609 {
5610 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
daniel@transgaming.com8a0a2db2011-03-21 16:38:20 +00005611 texture->setImagePosX(level, width, height, format, type, context->getUnpackAlignment(), pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005612 break;
5613 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
daniel@transgaming.com8a0a2db2011-03-21 16:38:20 +00005614 texture->setImageNegX(level, width, height, format, type, context->getUnpackAlignment(), pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005615 break;
5616 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
daniel@transgaming.com8a0a2db2011-03-21 16:38:20 +00005617 texture->setImagePosY(level, width, height, format, type, context->getUnpackAlignment(), pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005618 break;
5619 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
daniel@transgaming.com8a0a2db2011-03-21 16:38:20 +00005620 texture->setImageNegY(level, width, height, format, type, context->getUnpackAlignment(), pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005621 break;
5622 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
daniel@transgaming.com8a0a2db2011-03-21 16:38:20 +00005623 texture->setImagePosZ(level, width, height, format, type, context->getUnpackAlignment(), pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005624 break;
5625 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
daniel@transgaming.com8a0a2db2011-03-21 16:38:20 +00005626 texture->setImageNegZ(level, width, height, format, type, context->getUnpackAlignment(), pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005627 break;
5628 default: UNREACHABLE();
5629 }
5630 }
5631 }
5632 }
5633 catch(std::bad_alloc&)
5634 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005635 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005636 }
5637}
5638
5639void __stdcall glTexParameterf(GLenum target, GLenum pname, GLfloat param)
5640{
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005641 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLint param = %f)", target, pname, param);
5642
5643 try
5644 {
5645 gl::Context *context = gl::getNonLostContext();
5646
5647 if (context)
5648 {
5649 gl::Texture *texture;
5650
5651 switch (target)
5652 {
5653 case GL_TEXTURE_2D:
5654 texture = context->getTexture2D();
5655 break;
5656 case GL_TEXTURE_CUBE_MAP:
5657 texture = context->getTextureCubeMap();
5658 break;
5659 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005660 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005661 }
5662
5663 switch (pname)
5664 {
5665 case GL_TEXTURE_WRAP_S:
5666 if (!texture->setWrapS((GLenum)param))
5667 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005668 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005669 }
5670 break;
5671 case GL_TEXTURE_WRAP_T:
5672 if (!texture->setWrapT((GLenum)param))
5673 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005674 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005675 }
5676 break;
5677 case GL_TEXTURE_MIN_FILTER:
5678 if (!texture->setMinFilter((GLenum)param))
5679 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005680 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005681 }
5682 break;
5683 case GL_TEXTURE_MAG_FILTER:
5684 if (!texture->setMagFilter((GLenum)param))
5685 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005686 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005687 }
5688 break;
5689 case GL_TEXTURE_USAGE_ANGLE:
5690 if (!texture->setUsage((GLenum)param))
5691 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005692 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005693 }
5694 break;
5695 case GL_TEXTURE_MAX_ANISOTROPY_EXT:
5696 if (!context->supportsTextureFilterAnisotropy())
5697 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005698 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005699 }
5700 if (!texture->setMaxAnisotropy((float)param, context->getTextureMaxAnisotropy()))
5701 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005702 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005703 }
5704 break;
5705 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005706 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005707 }
5708 }
5709 }
5710 catch(std::bad_alloc&)
5711 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005712 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005713 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005714}
5715
5716void __stdcall glTexParameterfv(GLenum target, GLenum pname, const GLfloat* params)
5717{
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005718 glTexParameterf(target, pname, (GLfloat)*params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005719}
5720
5721void __stdcall glTexParameteri(GLenum target, GLenum pname, GLint param)
5722{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005723 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLint param = %d)", target, pname, param);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005724
5725 try
5726 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005727 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005728
5729 if (context)
5730 {
5731 gl::Texture *texture;
5732
5733 switch (target)
5734 {
5735 case GL_TEXTURE_2D:
5736 texture = context->getTexture2D();
5737 break;
5738 case GL_TEXTURE_CUBE_MAP:
5739 texture = context->getTextureCubeMap();
5740 break;
5741 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005742 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005743 }
5744
5745 switch (pname)
5746 {
5747 case GL_TEXTURE_WRAP_S:
5748 if (!texture->setWrapS((GLenum)param))
5749 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005750 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005751 }
5752 break;
5753 case GL_TEXTURE_WRAP_T:
5754 if (!texture->setWrapT((GLenum)param))
5755 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005756 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005757 }
5758 break;
5759 case GL_TEXTURE_MIN_FILTER:
5760 if (!texture->setMinFilter((GLenum)param))
5761 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005762 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005763 }
5764 break;
5765 case GL_TEXTURE_MAG_FILTER:
5766 if (!texture->setMagFilter((GLenum)param))
5767 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005768 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005769 }
5770 break;
daniel@transgaming.com7d18c172011-11-11 04:18:21 +00005771 case GL_TEXTURE_USAGE_ANGLE:
5772 if (!texture->setUsage((GLenum)param))
5773 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005774 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com7d18c172011-11-11 04:18:21 +00005775 }
5776 break;
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005777 case GL_TEXTURE_MAX_ANISOTROPY_EXT:
5778 if (!context->supportsTextureFilterAnisotropy())
5779 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005780 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005781 }
5782 if (!texture->setMaxAnisotropy((float)param, context->getTextureMaxAnisotropy()))
5783 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005784 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005785 }
5786 break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005787 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005788 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005789 }
5790 }
5791 }
5792 catch(std::bad_alloc&)
5793 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005794 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005795 }
5796}
5797
5798void __stdcall glTexParameteriv(GLenum target, GLenum pname, const GLint* params)
5799{
5800 glTexParameteri(target, pname, *params);
5801}
5802
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005803void __stdcall glTexStorage2DEXT(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height)
5804{
5805 EVENT("(GLenum target = 0x%X, GLsizei levels = %d, GLenum internalformat = 0x%X, GLsizei width = %d, GLsizei height = %d)",
5806 target, levels, internalformat, width, height);
5807
5808 try
5809 {
5810 if (target != GL_TEXTURE_2D && target != GL_TEXTURE_CUBE_MAP)
5811 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005812 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005813 }
5814
5815 if (width < 1 || height < 1 || levels < 1)
5816 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005817 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005818 }
5819
5820 if (target == GL_TEXTURE_CUBE_MAP && width != height)
5821 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005822 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005823 }
5824
daniel@transgaming.com45b888a2011-11-16 03:56:39 +00005825 if (levels != 1 && levels != gl::log2(std::max(width, height)) + 1)
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005826 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005827 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005828 }
5829
5830 GLenum format = gl::ExtractFormat(internalformat);
5831 GLenum type = gl::ExtractType(internalformat);
5832
5833 if (format == GL_NONE || type == GL_NONE)
5834 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005835 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005836 }
5837
5838 gl::Context *context = gl::getNonLostContext();
5839
5840 if (context)
5841 {
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00005842 switch (target)
5843 {
5844 case GL_TEXTURE_2D:
5845 if (width > context->getMaximumTextureDimension() ||
5846 height > context->getMaximumTextureDimension())
5847 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005848 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00005849 }
5850 break;
5851 case GL_TEXTURE_CUBE_MAP:
5852 if (width > context->getMaximumCubeTextureDimension() ||
5853 height > context->getMaximumCubeTextureDimension())
5854 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005855 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00005856 }
5857 break;
5858 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005859 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00005860 }
5861
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005862 if (levels != 1 && !context->supportsNonPower2Texture())
5863 {
5864 if (!gl::isPow2(width) || !gl::isPow2(height))
5865 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005866 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005867 }
5868 }
5869
daniel@transgaming.come1077362011-11-11 04:16:50 +00005870 switch (internalformat)
5871 {
5872 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
5873 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
5874 if (!context->supportsDXT1Textures())
5875 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005876 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.come1077362011-11-11 04:16:50 +00005877 }
5878 break;
5879 case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
5880 if (!context->supportsDXT3Textures())
5881 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005882 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.come1077362011-11-11 04:16:50 +00005883 }
5884 break;
5885 case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
5886 if (!context->supportsDXT5Textures())
5887 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005888 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.come1077362011-11-11 04:16:50 +00005889 }
5890 break;
daniel@transgaming.comff941aa2011-11-11 04:17:09 +00005891 case GL_RGBA32F_EXT:
5892 case GL_RGB32F_EXT:
5893 case GL_ALPHA32F_EXT:
5894 case GL_LUMINANCE32F_EXT:
5895 case GL_LUMINANCE_ALPHA32F_EXT:
5896 if (!context->supportsFloat32Textures())
5897 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005898 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comff941aa2011-11-11 04:17:09 +00005899 }
5900 break;
5901 case GL_RGBA16F_EXT:
5902 case GL_RGB16F_EXT:
5903 case GL_ALPHA16F_EXT:
5904 case GL_LUMINANCE16F_EXT:
5905 case GL_LUMINANCE_ALPHA16F_EXT:
5906 if (!context->supportsFloat16Textures())
5907 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005908 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comff941aa2011-11-11 04:17:09 +00005909 }
5910 break;
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00005911 case GL_DEPTH_COMPONENT16:
5912 case GL_DEPTH_COMPONENT32_OES:
5913 case GL_DEPTH24_STENCIL8_OES:
5914 if (!context->supportsDepthTextures())
5915 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005916 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00005917 }
daniel@transgaming.com0c854682012-05-31 01:14:11 +00005918 if (target != GL_TEXTURE_2D)
5919 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005920 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com0c854682012-05-31 01:14:11 +00005921 }
daniel@transgaming.com797924b2012-06-05 19:50:01 +00005922 // ANGLE_depth_texture only supports 1-level textures
5923 if (levels != 1)
5924 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005925 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com797924b2012-06-05 19:50:01 +00005926 }
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00005927 break;
5928 default:
5929 break;
daniel@transgaming.come1077362011-11-11 04:16:50 +00005930 }
5931
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005932 if (target == GL_TEXTURE_2D)
5933 {
5934 gl::Texture2D *texture = context->getTexture2D();
5935
5936 if (!texture || texture->id() == 0)
5937 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005938 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005939 }
5940
5941 if (texture->isImmutable())
5942 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005943 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005944 }
5945
5946 texture->storage(levels, internalformat, width, height);
5947 }
5948 else if (target == GL_TEXTURE_CUBE_MAP)
5949 {
5950 gl::TextureCubeMap *texture = context->getTextureCubeMap();
5951
5952 if (!texture || texture->id() == 0)
5953 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005954 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005955 }
5956
5957 if (texture->isImmutable())
5958 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005959 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005960 }
5961
5962 texture->storage(levels, internalformat, width);
5963 }
5964 else UNREACHABLE();
5965 }
5966 }
5967 catch(std::bad_alloc&)
5968 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005969 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005970 }
5971}
5972
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00005973void __stdcall glTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height,
5974 GLenum format, GLenum type, const GLvoid* pixels)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005975{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005976 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00005977 "GLsizei width = %d, GLsizei height = %d, GLenum format = 0x%X, GLenum type = 0x%X, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00005978 "const GLvoid* pixels = 0x%0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005979 target, level, xoffset, yoffset, width, height, format, type, pixels);
5980
5981 try
5982 {
apatrick@chromium.org551022e2012-01-23 19:56:54 +00005983 if (!gl::IsInternalTextureTarget(target))
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005984 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005985 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005986 }
5987
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00005988 if (level < 0 || xoffset < 0 || yoffset < 0 || width < 0 || height < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005989 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005990 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005991 }
5992
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005993 if (std::numeric_limits<GLsizei>::max() - xoffset < width || std::numeric_limits<GLsizei>::max() - yoffset < height)
5994 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005995 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005996 }
5997
daniel@transgaming.com8833dd22012-06-05 19:49:58 +00005998 if (!checkTextureFormatType(format, type))
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005999 {
daniel@transgaming.com8833dd22012-06-05 19:49:58 +00006000 return; // error is set by helper function
daniel@transgaming.com00c75962010-03-11 20:36:15 +00006001 }
6002
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006003 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com00c75962010-03-11 20:36:15 +00006004
6005 if (context)
6006 {
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00006007 if (level > context->getMaximumTextureLevel())
6008 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006009 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00006010 }
6011
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00006012 if (format == GL_FLOAT)
6013 {
daniel@transgaming.combbeffbb2011-11-09 17:46:11 +00006014 if (!context->supportsFloat32Textures())
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00006015 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006016 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00006017 }
6018 }
6019 else if (format == GL_HALF_FLOAT_OES)
6020 {
daniel@transgaming.combbeffbb2011-11-09 17:46:11 +00006021 if (!context->supportsFloat16Textures())
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00006022 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006023 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00006024 }
6025 }
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00006026 else if (gl::IsDepthTexture(format))
6027 {
6028 if (!context->supportsDepthTextures())
6029 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006030 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00006031 }
daniel@transgaming.com0c854682012-05-31 01:14:11 +00006032 if (target != GL_TEXTURE_2D)
6033 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006034 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com0c854682012-05-31 01:14:11 +00006035 }
6036 // OES_depth_texture supports loading depth data, but ANGLE_depth_texture does not
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006037 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00006038 }
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00006039
daniel@transgaming.com1d2d3c42012-05-31 01:14:15 +00006040 if (width == 0 || height == 0 || pixels == NULL)
6041 {
6042 return;
6043 }
6044
daniel@transgaming.com00c75962010-03-11 20:36:15 +00006045 if (target == GL_TEXTURE_2D)
6046 {
6047 gl::Texture2D *texture = context->getTexture2D();
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00006048 if (validateSubImageParams2D(false, width, height, xoffset, yoffset, level, format, type, texture))
daniel@transgaming.com00c75962010-03-11 20:36:15 +00006049 {
daniel@transgaming.com343373a2011-11-29 19:42:32 +00006050 texture->subImage(level, xoffset, yoffset, width, height, format, type, context->getUnpackAlignment(), pixels);
daniel@transgaming.com00c75962010-03-11 20:36:15 +00006051 }
daniel@transgaming.com00c75962010-03-11 20:36:15 +00006052 }
daniel@transgaming.com19ffc242010-05-04 03:35:21 +00006053 else if (gl::IsCubemapTextureTarget(target))
daniel@transgaming.com00c75962010-03-11 20:36:15 +00006054 {
6055 gl::TextureCubeMap *texture = context->getTextureCubeMap();
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00006056 if (validateSubImageParamsCube(false, width, height, xoffset, yoffset, target, level, format, type, texture))
daniel@transgaming.com00c75962010-03-11 20:36:15 +00006057 {
daniel@transgaming.com343373a2011-11-29 19:42:32 +00006058 texture->subImage(target, level, xoffset, yoffset, width, height, format, type, context->getUnpackAlignment(), pixels);
daniel@transgaming.com00c75962010-03-11 20:36:15 +00006059 }
daniel@transgaming.com00c75962010-03-11 20:36:15 +00006060 }
6061 else
6062 {
6063 UNREACHABLE();
6064 }
6065 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006066 }
6067 catch(std::bad_alloc&)
6068 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006069 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006070 }
6071}
6072
6073void __stdcall glUniform1f(GLint location, GLfloat x)
6074{
6075 glUniform1fv(location, 1, &x);
6076}
6077
6078void __stdcall glUniform1fv(GLint location, GLsizei count, const GLfloat* v)
6079{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006080 EVENT("(GLint location = %d, GLsizei count = %d, const GLfloat* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006081
6082 try
6083 {
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006084 if (count < 0)
6085 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006086 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006087 }
6088
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006089 if (location == -1)
6090 {
6091 return;
6092 }
6093
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006094 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006095
6096 if (context)
6097 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00006098 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006099 if (!programBinary)
6100 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006101 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006102 }
6103
6104 if (!programBinary->setUniform1fv(location, count, v))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006105 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006106 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006107 }
6108 }
6109 }
6110 catch(std::bad_alloc&)
6111 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006112 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006113 }
6114}
6115
6116void __stdcall glUniform1i(GLint location, GLint x)
6117{
6118 glUniform1iv(location, 1, &x);
6119}
6120
6121void __stdcall glUniform1iv(GLint location, GLsizei count, const GLint* v)
6122{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006123 EVENT("(GLint location = %d, GLsizei count = %d, const GLint* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006124
6125 try
6126 {
6127 if (count < 0)
6128 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006129 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006130 }
6131
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006132 if (location == -1)
6133 {
6134 return;
6135 }
6136
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006137 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006138
6139 if (context)
6140 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00006141 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006142 if (!programBinary)
6143 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006144 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006145 }
6146
6147 if (!programBinary->setUniform1iv(location, count, v))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006148 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006149 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006150 }
6151 }
6152 }
6153 catch(std::bad_alloc&)
6154 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006155 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006156 }
6157}
6158
6159void __stdcall glUniform2f(GLint location, GLfloat x, GLfloat y)
6160{
6161 GLfloat xy[2] = {x, y};
6162
6163 glUniform2fv(location, 1, (GLfloat*)&xy);
6164}
6165
6166void __stdcall glUniform2fv(GLint location, GLsizei count, const GLfloat* v)
6167{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006168 EVENT("(GLint location = %d, GLsizei count = %d, const GLfloat* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006169
6170 try
6171 {
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006172 if (count < 0)
6173 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006174 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006175 }
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006176
6177 if (location == -1)
6178 {
6179 return;
6180 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006181
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006182 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006183
6184 if (context)
6185 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00006186 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006187 if (!programBinary)
6188 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006189 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006190 }
6191
6192 if (!programBinary->setUniform2fv(location, count, v))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006193 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006194 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006195 }
6196 }
6197 }
6198 catch(std::bad_alloc&)
6199 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006200 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006201 }
6202}
6203
6204void __stdcall glUniform2i(GLint location, GLint x, GLint y)
6205{
6206 GLint xy[4] = {x, y};
6207
6208 glUniform2iv(location, 1, (GLint*)&xy);
6209}
6210
6211void __stdcall glUniform2iv(GLint location, GLsizei count, const GLint* v)
6212{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006213 EVENT("(GLint location = %d, GLsizei count = %d, const GLint* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006214
6215 try
6216 {
6217 if (count < 0)
6218 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006219 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006220 }
6221
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006222 if (location == -1)
6223 {
6224 return;
6225 }
6226
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006227 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006228
6229 if (context)
6230 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00006231 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006232 if (!programBinary)
6233 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006234 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006235 }
6236
6237 if (!programBinary->setUniform2iv(location, count, v))
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006238 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006239 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006240 }
6241 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006242 }
6243 catch(std::bad_alloc&)
6244 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006245 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006246 }
6247}
6248
6249void __stdcall glUniform3f(GLint location, GLfloat x, GLfloat y, GLfloat z)
6250{
6251 GLfloat xyz[3] = {x, y, z};
6252
6253 glUniform3fv(location, 1, (GLfloat*)&xyz);
6254}
6255
6256void __stdcall glUniform3fv(GLint location, GLsizei count, const GLfloat* v)
6257{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006258 EVENT("(GLint location = %d, GLsizei count = %d, const GLfloat* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006259
6260 try
6261 {
6262 if (count < 0)
6263 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006264 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006265 }
6266
6267 if (location == -1)
6268 {
6269 return;
6270 }
6271
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006272 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006273
6274 if (context)
6275 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00006276 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006277 if (!programBinary)
6278 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006279 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006280 }
6281
6282 if (!programBinary->setUniform3fv(location, count, v))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006283 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006284 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006285 }
6286 }
6287 }
6288 catch(std::bad_alloc&)
6289 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006290 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006291 }
6292}
6293
6294void __stdcall glUniform3i(GLint location, GLint x, GLint y, GLint z)
6295{
6296 GLint xyz[3] = {x, y, z};
6297
6298 glUniform3iv(location, 1, (GLint*)&xyz);
6299}
6300
6301void __stdcall glUniform3iv(GLint location, GLsizei count, const GLint* v)
6302{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006303 EVENT("(GLint location = %d, GLsizei count = %d, const GLint* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006304
6305 try
6306 {
6307 if (count < 0)
6308 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006309 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006310 }
6311
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006312 if (location == -1)
6313 {
6314 return;
6315 }
6316
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006317 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006318
6319 if (context)
6320 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00006321 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006322 if (!programBinary)
6323 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006324 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006325 }
6326
6327 if (!programBinary->setUniform3iv(location, count, v))
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006328 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006329 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006330 }
6331 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006332 }
6333 catch(std::bad_alloc&)
6334 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006335 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006336 }
6337}
6338
6339void __stdcall glUniform4f(GLint location, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
6340{
6341 GLfloat xyzw[4] = {x, y, z, w};
6342
6343 glUniform4fv(location, 1, (GLfloat*)&xyzw);
6344}
6345
6346void __stdcall glUniform4fv(GLint location, GLsizei count, const GLfloat* v)
6347{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006348 EVENT("(GLint location = %d, GLsizei count = %d, const GLfloat* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006349
6350 try
6351 {
6352 if (count < 0)
6353 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006354 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006355 }
6356
6357 if (location == -1)
6358 {
6359 return;
6360 }
6361
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006362 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006363
6364 if (context)
6365 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00006366 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006367 if (!programBinary)
6368 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006369 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006370 }
6371
6372 if (!programBinary->setUniform4fv(location, count, v))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006373 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006374 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006375 }
6376 }
6377 }
6378 catch(std::bad_alloc&)
6379 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006380 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006381 }
6382}
6383
6384void __stdcall glUniform4i(GLint location, GLint x, GLint y, GLint z, GLint w)
6385{
6386 GLint xyzw[4] = {x, y, z, w};
6387
6388 glUniform4iv(location, 1, (GLint*)&xyzw);
6389}
6390
6391void __stdcall glUniform4iv(GLint location, GLsizei count, const GLint* v)
6392{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006393 EVENT("(GLint location = %d, GLsizei count = %d, const GLint* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006394
6395 try
6396 {
6397 if (count < 0)
6398 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006399 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006400 }
6401
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006402 if (location == -1)
6403 {
6404 return;
6405 }
6406
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006407 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006408
6409 if (context)
6410 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00006411 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006412 if (!programBinary)
6413 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006414 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006415 }
6416
6417 if (!programBinary->setUniform4iv(location, count, v))
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006418 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006419 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006420 }
6421 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006422 }
6423 catch(std::bad_alloc&)
6424 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006425 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006426 }
6427}
6428
6429void __stdcall glUniformMatrix2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
6430{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006431 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00006432 location, count, transpose, value);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006433
6434 try
6435 {
6436 if (count < 0 || transpose != GL_FALSE)
6437 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006438 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006439 }
6440
6441 if (location == -1)
6442 {
6443 return;
6444 }
6445
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006446 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006447
6448 if (context)
6449 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00006450 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006451 if (!programBinary)
6452 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006453 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006454 }
6455
6456 if (!programBinary->setUniformMatrix2fv(location, count, value))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006457 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006458 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006459 }
6460 }
6461 }
6462 catch(std::bad_alloc&)
6463 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006464 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006465 }
6466}
6467
6468void __stdcall glUniformMatrix3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
6469{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006470 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00006471 location, count, transpose, value);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006472
6473 try
6474 {
6475 if (count < 0 || transpose != GL_FALSE)
6476 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006477 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006478 }
6479
6480 if (location == -1)
6481 {
6482 return;
6483 }
6484
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006485 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006486
6487 if (context)
6488 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00006489 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006490 if (!programBinary)
6491 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006492 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006493 }
6494
6495 if (!programBinary->setUniformMatrix3fv(location, count, value))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006496 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006497 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006498 }
6499 }
6500 }
6501 catch(std::bad_alloc&)
6502 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006503 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006504 }
6505}
6506
6507void __stdcall glUniformMatrix4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
6508{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006509 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00006510 location, count, transpose, value);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006511
6512 try
6513 {
6514 if (count < 0 || transpose != GL_FALSE)
6515 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006516 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006517 }
6518
6519 if (location == -1)
6520 {
6521 return;
6522 }
6523
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006524 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006525
6526 if (context)
6527 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00006528 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006529 if (!programBinary)
6530 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006531 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006532 }
6533
6534 if (!programBinary->setUniformMatrix4fv(location, count, value))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006535 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006536 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006537 }
6538 }
6539 }
6540 catch(std::bad_alloc&)
6541 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006542 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006543 }
6544}
6545
6546void __stdcall glUseProgram(GLuint program)
6547{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006548 EVENT("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006549
6550 try
6551 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006552 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006553
6554 if (context)
6555 {
6556 gl::Program *programObject = context->getProgram(program);
6557
daniel@transgaming.comc8478202010-04-13 19:53:35 +00006558 if (!programObject && program != 0)
6559 {
6560 if (context->getShader(program))
6561 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006562 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comc8478202010-04-13 19:53:35 +00006563 }
6564 else
6565 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006566 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comc8478202010-04-13 19:53:35 +00006567 }
6568 }
6569
daniel@transgaming.com716056c2012-07-24 18:38:59 +00006570 if (program != 0 && !programObject->isLinked())
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006571 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006572 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006573 }
6574
6575 context->useProgram(program);
6576 }
6577 }
6578 catch(std::bad_alloc&)
6579 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006580 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006581 }
6582}
6583
6584void __stdcall glValidateProgram(GLuint program)
6585{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006586 EVENT("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006587
6588 try
6589 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006590 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00006591
6592 if (context)
6593 {
6594 gl::Program *programObject = context->getProgram(program);
6595
6596 if (!programObject)
6597 {
6598 if (context->getShader(program))
6599 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006600 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00006601 }
6602 else
6603 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006604 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00006605 }
6606 }
6607
apatrick@chromium.org253b8d22012-06-22 19:27:21 +00006608 programObject->validate();
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00006609 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006610 }
6611 catch(std::bad_alloc&)
6612 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006613 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006614 }
6615}
6616
6617void __stdcall glVertexAttrib1f(GLuint index, GLfloat x)
6618{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006619 EVENT("(GLuint index = %d, GLfloat x = %f)", index, x);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006620
6621 try
6622 {
6623 if (index >= gl::MAX_VERTEX_ATTRIBS)
6624 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006625 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006626 }
6627
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006628 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006629
6630 if (context)
6631 {
6632 GLfloat vals[4] = { x, 0, 0, 1 };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00006633 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006634 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006635 }
6636 catch(std::bad_alloc&)
6637 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006638 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006639 }
6640}
6641
6642void __stdcall glVertexAttrib1fv(GLuint index, const GLfloat* values)
6643{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006644 EVENT("(GLuint index = %d, const GLfloat* values = 0x%0.8p)", index, values);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006645
6646 try
6647 {
6648 if (index >= gl::MAX_VERTEX_ATTRIBS)
6649 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006650 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006651 }
6652
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006653 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006654
6655 if (context)
6656 {
6657 GLfloat vals[4] = { values[0], 0, 0, 1 };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00006658 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006659 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006660 }
6661 catch(std::bad_alloc&)
6662 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006663 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006664 }
6665}
6666
6667void __stdcall glVertexAttrib2f(GLuint index, GLfloat x, GLfloat y)
6668{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006669 EVENT("(GLuint index = %d, GLfloat x = %f, GLfloat y = %f)", index, x, y);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006670
6671 try
6672 {
6673 if (index >= gl::MAX_VERTEX_ATTRIBS)
6674 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006675 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006676 }
6677
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006678 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006679
6680 if (context)
6681 {
6682 GLfloat vals[4] = { x, y, 0, 1 };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00006683 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006684 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006685 }
6686 catch(std::bad_alloc&)
6687 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006688 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006689 }
6690}
6691
6692void __stdcall glVertexAttrib2fv(GLuint index, const GLfloat* values)
6693{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006694 EVENT("(GLuint index = %d, const GLfloat* values = 0x%0.8p)", index, values);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006695
6696 try
6697 {
6698 if (index >= gl::MAX_VERTEX_ATTRIBS)
6699 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006700 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006701 }
6702
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006703 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006704
6705 if (context)
6706 {
6707 GLfloat vals[4] = { values[0], values[1], 0, 1 };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00006708 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006709 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006710 }
6711 catch(std::bad_alloc&)
6712 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006713 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006714 }
6715}
6716
6717void __stdcall glVertexAttrib3f(GLuint index, GLfloat x, GLfloat y, GLfloat z)
6718{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006719 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 +00006720
6721 try
6722 {
6723 if (index >= gl::MAX_VERTEX_ATTRIBS)
6724 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006725 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006726 }
6727
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006728 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006729
6730 if (context)
6731 {
6732 GLfloat vals[4] = { x, y, z, 1 };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00006733 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006734 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006735 }
6736 catch(std::bad_alloc&)
6737 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006738 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006739 }
6740}
6741
6742void __stdcall glVertexAttrib3fv(GLuint index, const GLfloat* values)
6743{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006744 EVENT("(GLuint index = %d, const GLfloat* values = 0x%0.8p)", index, values);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006745
6746 try
6747 {
6748 if (index >= gl::MAX_VERTEX_ATTRIBS)
6749 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006750 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006751 }
6752
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006753 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006754
6755 if (context)
6756 {
6757 GLfloat vals[4] = { values[0], values[1], values[2], 1 };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00006758 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006759 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006760 }
6761 catch(std::bad_alloc&)
6762 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006763 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006764 }
6765}
6766
6767void __stdcall glVertexAttrib4f(GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
6768{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006769 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 +00006770
6771 try
6772 {
6773 if (index >= gl::MAX_VERTEX_ATTRIBS)
6774 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006775 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006776 }
6777
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006778 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006779
6780 if (context)
6781 {
6782 GLfloat vals[4] = { x, y, z, w };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00006783 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006784 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006785 }
6786 catch(std::bad_alloc&)
6787 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006788 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006789 }
6790}
6791
6792void __stdcall glVertexAttrib4fv(GLuint index, const GLfloat* values)
6793{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006794 EVENT("(GLuint index = %d, const GLfloat* values = 0x%0.8p)", index, values);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006795
6796 try
6797 {
6798 if (index >= gl::MAX_VERTEX_ATTRIBS)
6799 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006800 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006801 }
6802
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006803 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006804
6805 if (context)
6806 {
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00006807 context->setVertexAttribf(index, values);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006808 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006809 }
6810 catch(std::bad_alloc&)
6811 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006812 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006813 }
6814}
6815
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00006816void __stdcall glVertexAttribDivisorANGLE(GLuint index, GLuint divisor)
6817{
6818 EVENT("(GLuint index = %d, GLuint divisor = %d)", index, divisor);
6819
6820 try
6821 {
6822 if (index >= gl::MAX_VERTEX_ATTRIBS)
6823 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006824 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00006825 }
6826
6827 gl::Context *context = gl::getNonLostContext();
6828
6829 if (context)
6830 {
6831 context->setVertexAttribDivisor(index, divisor);
6832 }
6833 }
6834 catch(std::bad_alloc&)
6835 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006836 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00006837 }
6838}
6839
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00006840void __stdcall glVertexAttribPointer(GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid* ptr)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006841{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006842 EVENT("(GLuint index = %d, GLint size = %d, GLenum type = 0x%X, "
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006843 "GLboolean normalized = %u, GLsizei stride = %d, const GLvoid* ptr = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00006844 index, size, type, normalized, stride, ptr);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006845
6846 try
6847 {
6848 if (index >= gl::MAX_VERTEX_ATTRIBS)
6849 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006850 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006851 }
6852
6853 if (size < 1 || size > 4)
6854 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006855 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006856 }
6857
shannon.woods%transgaming.com@gtempaccount.com1a4e09a2013-04-13 03:33:30 +00006858 gl::Context *context = gl::getNonLostContext();
6859
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006860 switch (type)
6861 {
6862 case GL_BYTE:
6863 case GL_UNSIGNED_BYTE:
6864 case GL_SHORT:
6865 case GL_UNSIGNED_SHORT:
6866 case GL_FIXED:
6867 case GL_FLOAT:
6868 break;
shannon.woods%transgaming.com@gtempaccount.com1a4e09a2013-04-13 03:33:30 +00006869 case GL_HALF_FLOAT:
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00006870 case GL_INT:
6871 case GL_UNSIGNED_INT:
shannon.woods%transgaming.com@gtempaccount.com1ab57be2013-04-13 03:38:39 +00006872 case GL_INT_2_10_10_10_REV:
6873 case GL_UNSIGNED_INT_2_10_10_10_REV:
shannon.woods%transgaming.com@gtempaccount.com1a4e09a2013-04-13 03:33:30 +00006874 if (context && context->getClientVersion() < 3)
6875 {
6876 return gl::error(GL_INVALID_ENUM);
6877 }
6878 else
6879 {
6880 break;
6881 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006882 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006883 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006884 }
6885
6886 if (stride < 0)
6887 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006888 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006889 }
6890
shannon.woods%transgaming.com@gtempaccount.com1ab57be2013-04-13 03:38:39 +00006891 if ((type == GL_INT_2_10_10_10_REV || type == GL_UNSIGNED_INT_2_10_10_10_REV) && size != 4)
6892 {
6893 return gl::error(GL_INVALID_OPERATION);
6894 }
6895
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006896 if (context)
6897 {
shannon.woods%transgaming.com@gtempaccount.com8de4e6a2013-04-13 03:37:44 +00006898 context->setVertexAttribState(index, context->getArrayBuffer(), size, type,
6899 normalized == GL_TRUE, false, stride, ptr);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006900 }
6901 }
6902 catch(std::bad_alloc&)
6903 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006904 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006905 }
6906}
6907
6908void __stdcall glViewport(GLint x, GLint y, GLsizei width, GLsizei height)
6909{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006910 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 +00006911
6912 try
6913 {
6914 if (width < 0 || height < 0)
6915 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006916 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006917 }
6918
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006919 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006920
6921 if (context)
6922 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00006923 context->setViewportParams(x, y, width, height);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006924 }
6925 }
6926 catch(std::bad_alloc&)
6927 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006928 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006929 }
6930}
6931
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006932// OpenGL ES 3.0 functions
6933
6934void __stdcall glReadBuffer(GLenum mode)
6935{
6936 EVENT("(GLenum mode = 0x%X)", mode);
6937
6938 try
6939 {
6940 gl::Context *context = gl::getNonLostContext();
6941
6942 if (context)
6943 {
6944 if (context->getClientVersion() < 3)
6945 {
6946 return gl::error(GL_INVALID_OPERATION);
6947 }
6948 }
6949
6950 UNIMPLEMENTED();
6951 }
6952 catch(std::bad_alloc&)
6953 {
6954 return gl::error(GL_OUT_OF_MEMORY);
6955 }
6956}
6957
6958void __stdcall glDrawRangeElements(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid* indices)
6959{
6960 EVENT("(GLenum mode = 0x%X, GLuint start = %u, GLuint end = %u, GLsizei count = %d, GLenum type = 0x%X, "
6961 "const GLvoid* indices = 0x%0.8p)", mode, start, end, count, type, indices);
6962
6963 try
6964 {
6965 gl::Context *context = gl::getNonLostContext();
6966
6967 if (context)
6968 {
6969 if (context->getClientVersion() < 3)
6970 {
6971 return gl::error(GL_INVALID_OPERATION);
6972 }
6973 }
6974
6975 UNIMPLEMENTED();
6976 }
6977 catch(std::bad_alloc&)
6978 {
6979 return gl::error(GL_OUT_OF_MEMORY);
6980 }
6981}
6982
6983void __stdcall glTexImage3D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid* pixels)
6984{
6985 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint internalformat = %d, GLsizei width = %d, "
6986 "GLsizei height = %d, GLsizei depth = %d, GLint border = %d, GLenum format = 0x%X, "
6987 "GLenum type = 0x%X, const GLvoid* pixels = 0x%0.8p)",
6988 target, level, internalformat, width, height, depth, border, format, type, pixels);
6989
6990 try
6991 {
6992 gl::Context *context = gl::getNonLostContext();
6993
6994 if (context)
6995 {
6996 if (context->getClientVersion() < 3)
6997 {
6998 return gl::error(GL_INVALID_OPERATION);
6999 }
7000 }
7001
7002 UNIMPLEMENTED();
7003 }
7004 catch(std::bad_alloc&)
7005 {
7006 return gl::error(GL_OUT_OF_MEMORY);
7007 }
7008}
7009
7010void __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)
7011{
7012 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
7013 "GLint zoffset = %d, GLsizei width = %d, GLsizei height = %d, GLsizei depth = %d, "
7014 "GLenum format = 0x%X, GLenum type = 0x%X, const GLvoid* pixels = 0x%0.8p)",
7015 target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels);
7016
7017 try
7018 {
7019 gl::Context *context = gl::getNonLostContext();
7020
7021 if (context)
7022 {
7023 if (context->getClientVersion() < 3)
7024 {
7025 return gl::error(GL_INVALID_OPERATION);
7026 }
7027 }
7028
7029 UNIMPLEMENTED();
7030 }
7031 catch(std::bad_alloc&)
7032 {
7033 return gl::error(GL_OUT_OF_MEMORY);
7034 }
7035}
7036
7037void __stdcall glCopyTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height)
7038{
7039 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
7040 "GLint zoffset = %d, GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d)",
7041 target, level, xoffset, yoffset, zoffset, x, y, width, height);
7042
7043 try
7044 {
7045 gl::Context *context = gl::getNonLostContext();
7046
7047 if (context)
7048 {
7049 if (context->getClientVersion() < 3)
7050 {
7051 return gl::error(GL_INVALID_OPERATION);
7052 }
7053 }
7054
7055 UNIMPLEMENTED();
7056 }
7057 catch(std::bad_alloc&)
7058 {
7059 return gl::error(GL_OUT_OF_MEMORY);
7060 }
7061}
7062
7063void __stdcall glCompressedTexImage3D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid* data)
7064{
7065 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint internalformat = %d, GLsizei width = %d, "
7066 "GLsizei height = %d, GLsizei depth = %d, GLint border = %d, GLsizei imageSize = %d, "
7067 "const GLvoid* data = 0x%0.8p)",
7068 target, level, internalformat, width, height, depth, border, imageSize, data);
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 glCompressedTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid* data)
7091{
7092 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
7093 "GLint zoffset = %d, GLsizei width = %d, GLsizei height = %d, GLsizei depth = %d, "
7094 "GLenum format = 0x%X, GLsizei imageSize = %d, const GLvoid* data = 0x%0.8p)",
7095 target, level, xoffset, yoffset, zoffset, width, height, depth, format, imageSize, data);
7096
7097 try
7098 {
7099 gl::Context *context = gl::getNonLostContext();
7100
7101 if (context)
7102 {
7103 if (context->getClientVersion() < 3)
7104 {
7105 return gl::error(GL_INVALID_OPERATION);
7106 }
7107 }
7108
7109 UNIMPLEMENTED();
7110 }
7111 catch(std::bad_alloc&)
7112 {
7113 return gl::error(GL_OUT_OF_MEMORY);
7114 }
7115}
7116
7117void __stdcall glGenQueries(GLsizei n, GLuint* ids)
7118{
7119 EVENT("(GLsizei n = %d, GLuint* ids = 0x%0.8p)", n, ids);
7120
7121 try
7122 {
7123 gl::Context *context = gl::getNonLostContext();
7124
7125 if (context)
7126 {
7127 if (context->getClientVersion() < 3)
7128 {
7129 return gl::error(GL_INVALID_OPERATION);
7130 }
7131 }
7132
7133 UNIMPLEMENTED();
7134 }
7135 catch(std::bad_alloc&)
7136 {
7137 return gl::error(GL_OUT_OF_MEMORY);
7138 }
7139}
7140
7141void __stdcall glDeleteQueries(GLsizei n, const GLuint* ids)
7142{
7143 EVENT("(GLsizei n = %d, GLuint* ids = 0x%0.8p)", n, ids);
7144
7145 try
7146 {
7147 gl::Context *context = gl::getNonLostContext();
7148
7149 if (context)
7150 {
7151 if (context->getClientVersion() < 3)
7152 {
7153 return gl::error(GL_INVALID_OPERATION);
7154 }
7155 }
7156
7157 UNIMPLEMENTED();
7158 }
7159 catch(std::bad_alloc&)
7160 {
7161 return gl::error(GL_OUT_OF_MEMORY);
7162 }
7163}
7164
7165GLboolean __stdcall glIsQuery(GLuint id)
7166{
7167 EVENT("(GLuint id = %u)", id);
7168
7169 try
7170 {
7171 gl::Context *context = gl::getNonLostContext();
7172
7173 if (context)
7174 {
7175 if (context->getClientVersion() < 3)
7176 {
7177 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
7178 }
7179 }
7180
7181 UNIMPLEMENTED();
7182 }
7183 catch(std::bad_alloc&)
7184 {
7185 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
7186 }
7187
7188 return GL_FALSE;
7189}
7190
7191void __stdcall glBeginQuery(GLenum target, GLuint id)
7192{
7193 EVENT("(GLenum target = 0x%X, GLuint id = %u)", target, id);
7194
7195 try
7196 {
7197 gl::Context *context = gl::getNonLostContext();
7198
7199 if (context)
7200 {
7201 if (context->getClientVersion() < 3)
7202 {
7203 return gl::error(GL_INVALID_OPERATION);
7204 }
7205 }
7206
7207 UNIMPLEMENTED();
7208 }
7209 catch(std::bad_alloc&)
7210 {
7211 return gl::error(GL_OUT_OF_MEMORY);
7212 }
7213}
7214
7215void __stdcall glEndQuery(GLenum target)
7216{
7217 EVENT("(GLenum target = 0x%X)", target);
7218
7219 try
7220 {
7221 gl::Context *context = gl::getNonLostContext();
7222
7223 if (context)
7224 {
7225 if (context->getClientVersion() < 3)
7226 {
7227 return gl::error(GL_INVALID_OPERATION);
7228 }
7229 }
7230
7231 UNIMPLEMENTED();
7232 }
7233 catch(std::bad_alloc&)
7234 {
7235 return gl::error(GL_OUT_OF_MEMORY);
7236 }
7237}
7238
7239void __stdcall glGetQueryiv(GLenum target, GLenum pname, GLint* params)
7240{
7241 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLint* params = 0x%0.8p)", target, pname, params);
7242
7243 try
7244 {
7245 gl::Context *context = gl::getNonLostContext();
7246
7247 if (context)
7248 {
7249 if (context->getClientVersion() < 3)
7250 {
7251 return gl::error(GL_INVALID_OPERATION);
7252 }
7253 }
7254
7255 UNIMPLEMENTED();
7256 }
7257 catch(std::bad_alloc&)
7258 {
7259 return gl::error(GL_OUT_OF_MEMORY);
7260 }
7261}
7262
7263void __stdcall glGetQueryObjectuiv(GLuint id, GLenum pname, GLuint* params)
7264{
7265 EVENT("(GLuint id = %u, GLenum pname = 0x%X, GLint* params = 0x%0.8p)", id, pname, params);
7266
7267 try
7268 {
7269 gl::Context *context = gl::getNonLostContext();
7270
7271 if (context)
7272 {
7273 if (context->getClientVersion() < 3)
7274 {
7275 return gl::error(GL_INVALID_OPERATION);
7276 }
7277 }
7278
7279 UNIMPLEMENTED();
7280 }
7281 catch(std::bad_alloc&)
7282 {
7283 return gl::error(GL_OUT_OF_MEMORY);
7284 }
7285}
7286
7287GLboolean __stdcall glUnmapBuffer(GLenum target)
7288{
7289 EVENT("(GLenum target = 0x%X)", target);
7290
7291 try
7292 {
7293 gl::Context *context = gl::getNonLostContext();
7294
7295 if (context)
7296 {
7297 if (context->getClientVersion() < 3)
7298 {
7299 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
7300 }
7301 }
7302
7303 UNIMPLEMENTED();
7304 }
7305 catch(std::bad_alloc&)
7306 {
7307 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
7308 }
7309
7310 return GL_FALSE;
7311}
7312
7313void __stdcall glGetBufferPointerv(GLenum target, GLenum pname, GLvoid** params)
7314{
7315 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLvoid** params = 0x%0.8p)", target, pname, params);
7316
7317 try
7318 {
7319 gl::Context *context = gl::getNonLostContext();
7320
7321 if (context)
7322 {
7323 if (context->getClientVersion() < 3)
7324 {
7325 return gl::error(GL_INVALID_OPERATION);
7326 }
7327 }
7328
7329 UNIMPLEMENTED();
7330 }
7331 catch(std::bad_alloc&)
7332 {
7333 return gl::error(GL_OUT_OF_MEMORY);
7334 }
7335}
7336
7337void __stdcall glDrawBuffers(GLsizei n, const GLenum* bufs)
7338{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007339 try
7340 {
7341 gl::Context *context = gl::getNonLostContext();
7342
7343 if (context)
7344 {
7345 if (context->getClientVersion() < 3)
7346 {
7347 return gl::error(GL_INVALID_OPERATION);
7348 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007349
shannon.woods%transgaming.com@gtempaccount.com7948c5f2013-04-13 03:38:58 +00007350 glDrawBuffersEXT(n, bufs);
7351 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007352 }
7353 catch(std::bad_alloc&)
7354 {
7355 return gl::error(GL_OUT_OF_MEMORY);
7356 }
7357}
7358
7359void __stdcall glUniformMatrix2x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
7360{
7361 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
7362 location, count, transpose, value);
7363
7364 try
7365 {
7366 gl::Context *context = gl::getNonLostContext();
7367
7368 if (context)
7369 {
7370 if (context->getClientVersion() < 3)
7371 {
7372 return gl::error(GL_INVALID_OPERATION);
7373 }
7374 }
7375
7376 UNIMPLEMENTED();
7377 }
7378 catch(std::bad_alloc&)
7379 {
7380 return gl::error(GL_OUT_OF_MEMORY);
7381 }
7382}
7383
7384void __stdcall glUniformMatrix3x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
7385{
7386 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
7387 location, count, transpose, value);
7388
7389 try
7390 {
7391 gl::Context *context = gl::getNonLostContext();
7392
7393 if (context)
7394 {
7395 if (context->getClientVersion() < 3)
7396 {
7397 return gl::error(GL_INVALID_OPERATION);
7398 }
7399 }
7400
7401 UNIMPLEMENTED();
7402 }
7403 catch(std::bad_alloc&)
7404 {
7405 return gl::error(GL_OUT_OF_MEMORY);
7406 }
7407}
7408
7409void __stdcall glUniformMatrix2x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
7410{
7411 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
7412 location, count, transpose, value);
7413
7414 try
7415 {
7416 gl::Context *context = gl::getNonLostContext();
7417
7418 if (context)
7419 {
7420 if (context->getClientVersion() < 3)
7421 {
7422 return gl::error(GL_INVALID_OPERATION);
7423 }
7424 }
7425
7426 UNIMPLEMENTED();
7427 }
7428 catch(std::bad_alloc&)
7429 {
7430 return gl::error(GL_OUT_OF_MEMORY);
7431 }
7432}
7433
7434void __stdcall glUniformMatrix4x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
7435{
7436 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
7437 location, count, transpose, value);
7438
7439 try
7440 {
7441 gl::Context *context = gl::getNonLostContext();
7442
7443 if (context)
7444 {
7445 if (context->getClientVersion() < 3)
7446 {
7447 return gl::error(GL_INVALID_OPERATION);
7448 }
7449 }
7450
7451 UNIMPLEMENTED();
7452 }
7453 catch(std::bad_alloc&)
7454 {
7455 return gl::error(GL_OUT_OF_MEMORY);
7456 }
7457}
7458
7459void __stdcall glUniformMatrix3x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
7460{
7461 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
7462 location, count, transpose, value);
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 glUniformMatrix4x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
7485{
7486 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
7487 location, count, transpose, value);
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 glBlitFramebuffer(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter)
7510{
7511 EVENT("(GLint srcX0 = %d, GLint srcY0 = %d, GLint srcX1 = %d, GLint srcY1 = %d, GLint dstX0 = %d, "
7512 "GLint dstY0 = %d, GLint dstX1 = %d, GLint dstY1 = %d, GLbitfield mask = 0x%X, GLenum filter = 0x%X)",
7513 srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter);
7514
7515 try
7516 {
7517 gl::Context *context = gl::getNonLostContext();
7518
7519 if (context)
7520 {
7521 if (context->getClientVersion() < 3)
7522 {
7523 return gl::error(GL_INVALID_OPERATION);
7524 }
7525 }
7526
7527 UNIMPLEMENTED();
7528 }
7529 catch(std::bad_alloc&)
7530 {
7531 return gl::error(GL_OUT_OF_MEMORY);
7532 }
7533}
7534
7535void __stdcall glRenderbufferStorageMultisample(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height)
7536{
7537 EVENT("(GLenum target = 0x%X, GLsizei samples = %d, GLenum internalformat = 0x%X, GLsizei width = %d, GLsizei height = %d)",
7538 target, samples, internalformat, width, height);
7539
7540 try
7541 {
7542 gl::Context *context = gl::getNonLostContext();
7543
7544 if (context)
7545 {
7546 if (context->getClientVersion() < 3)
7547 {
7548 return gl::error(GL_INVALID_OPERATION);
7549 }
7550 }
7551
7552 UNIMPLEMENTED();
7553 }
7554 catch(std::bad_alloc&)
7555 {
7556 return gl::error(GL_OUT_OF_MEMORY);
7557 }
7558}
7559
7560void __stdcall glFramebufferTextureLayer(GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer)
7561{
7562 EVENT("(GLenum target = 0x%X, GLenum attachment = 0x%X, GLuint texture = %u, GLint level = %d, GLint layer = %d)",
7563 target, attachment, texture, level, layer);
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
7585GLvoid* __stdcall glMapBufferRange(GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access)
7586{
7587 EVENT("(GLenum target = 0x%X, GLintptr offset = %d, GLsizeiptr length = %d, GLbitfield access = 0x%X)",
7588 target, offset, length, access);
7589
7590 try
7591 {
7592 gl::Context *context = gl::getNonLostContext();
7593
7594 if (context)
7595 {
7596 if (context->getClientVersion() < 3)
7597 {
7598 return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLvoid*>(NULL));
7599 }
7600 }
7601
7602 UNIMPLEMENTED();
7603 }
7604 catch(std::bad_alloc&)
7605 {
7606 return gl::error(GL_OUT_OF_MEMORY, reinterpret_cast<GLvoid*>(NULL));
7607 }
7608
7609 return NULL;
7610}
7611
7612void __stdcall glFlushMappedBufferRange(GLenum target, GLintptr offset, GLsizeiptr length)
7613{
7614 EVENT("(GLenum target = 0x%X, GLintptr offset = %d, GLsizeiptr length = %d)", target, offset, length);
7615
7616 try
7617 {
7618 gl::Context *context = gl::getNonLostContext();
7619
7620 if (context)
7621 {
7622 if (context->getClientVersion() < 3)
7623 {
7624 return gl::error(GL_INVALID_OPERATION);
7625 }
7626 }
7627
7628 UNIMPLEMENTED();
7629 }
7630 catch(std::bad_alloc&)
7631 {
7632 return gl::error(GL_OUT_OF_MEMORY);
7633 }
7634}
7635
7636void __stdcall glBindVertexArray(GLuint array)
7637{
7638 EVENT("(GLuint array = %u)", array);
7639
7640 try
7641 {
7642 gl::Context *context = gl::getNonLostContext();
7643
7644 if (context)
7645 {
7646 if (context->getClientVersion() < 3)
7647 {
7648 return gl::error(GL_INVALID_OPERATION);
7649 }
7650 }
7651
7652 UNIMPLEMENTED();
7653 }
7654 catch(std::bad_alloc&)
7655 {
7656 return gl::error(GL_OUT_OF_MEMORY);
7657 }
7658}
7659
7660void __stdcall glDeleteVertexArrays(GLsizei n, const GLuint* arrays)
7661{
7662 EVENT("(GLsizei n = %d, const GLuint* arrays = 0x%0.8p)", n, arrays);
7663
7664 try
7665 {
7666 gl::Context *context = gl::getNonLostContext();
7667
7668 if (context)
7669 {
7670 if (context->getClientVersion() < 3)
7671 {
7672 return gl::error(GL_INVALID_OPERATION);
7673 }
7674 }
7675
7676 UNIMPLEMENTED();
7677 }
7678 catch(std::bad_alloc&)
7679 {
7680 return gl::error(GL_OUT_OF_MEMORY);
7681 }
7682}
7683
7684void __stdcall glGenVertexArrays(GLsizei n, GLuint* arrays)
7685{
7686 EVENT("(GLsizei n = %d, GLuint* arrays = 0x%0.8p)", n, arrays);
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
7708GLboolean __stdcall glIsVertexArray(GLuint array)
7709{
7710 EVENT("(GLuint array = %u)", array);
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, GL_FALSE);
7721 }
7722 }
7723
7724 UNIMPLEMENTED();
7725 }
7726 catch(std::bad_alloc&)
7727 {
7728 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
7729 }
7730
7731 return GL_FALSE;
7732}
7733
7734void __stdcall glGetIntegeri_v(GLenum target, GLuint index, GLint* data)
7735{
7736 EVENT("(GLenum target = 0x%X, GLuint index = %u, GLint* data = 0x%0.8p)",
7737 target, index, data);
7738
7739 try
7740 {
7741 gl::Context *context = gl::getNonLostContext();
7742
7743 if (context)
7744 {
7745 if (context->getClientVersion() < 3)
7746 {
7747 return gl::error(GL_INVALID_OPERATION);
7748 }
7749 }
7750
7751 UNIMPLEMENTED();
7752 }
7753 catch(std::bad_alloc&)
7754 {
7755 return gl::error(GL_OUT_OF_MEMORY);
7756 }
7757}
7758
7759void __stdcall glBeginTransformFeedback(GLenum primitiveMode)
7760{
7761 EVENT("(GLenum primitiveMode = 0x%X)", primitiveMode);
7762
7763 try
7764 {
7765 gl::Context *context = gl::getNonLostContext();
7766
7767 if (context)
7768 {
7769 if (context->getClientVersion() < 3)
7770 {
7771 return gl::error(GL_INVALID_OPERATION);
7772 }
7773 }
7774
7775 UNIMPLEMENTED();
7776 }
7777 catch(std::bad_alloc&)
7778 {
7779 return gl::error(GL_OUT_OF_MEMORY);
7780 }
7781}
7782
7783void __stdcall glEndTransformFeedback(void)
7784{
7785 EVENT("(void)");
7786
7787 try
7788 {
7789 gl::Context *context = gl::getNonLostContext();
7790
7791 if (context)
7792 {
7793 if (context->getClientVersion() < 3)
7794 {
7795 return gl::error(GL_INVALID_OPERATION);
7796 }
7797 }
7798
7799 UNIMPLEMENTED();
7800 }
7801 catch(std::bad_alloc&)
7802 {
7803 return gl::error(GL_OUT_OF_MEMORY);
7804 }
7805}
7806
7807void __stdcall glBindBufferRange(GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size)
7808{
7809 EVENT("(GLenum target = 0x%X, GLuint index = %u, GLuint buffer = %u, GLintptr offset = %d, GLsizeiptr size = %d)",
7810 target, index, buffer, offset, size);
7811
7812 try
7813 {
7814 gl::Context *context = gl::getNonLostContext();
7815
7816 if (context)
7817 {
7818 if (context->getClientVersion() < 3)
7819 {
7820 return gl::error(GL_INVALID_OPERATION);
7821 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007822
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007823 switch (target)
7824 {
7825 case GL_TRANSFORM_FEEDBACK_BUFFER:
7826 if (index > context->getMaxTransformFeedbackBufferBindings())
7827 {
7828 return gl::error(GL_INVALID_VALUE);
7829 }
7830 break;
7831
7832 case GL_UNIFORM_BUFFER:
7833 if (index >= context->getMaximumCombinedUniformBufferBindings())
7834 {
7835 return gl::error(GL_INVALID_VALUE);
7836 }
7837 break;
7838
7839 default:
7840 return gl::error(GL_INVALID_ENUM);
7841 }
7842
7843 gl::Buffer *bufferObject = context->getBuffer(buffer);
7844 if (!bufferObject)
7845 {
7846 // Buffer index must not have been valid
7847 return gl::error(GL_INVALID_VALUE);
7848 }
7849
7850 if (size <= 0 || static_cast<unsigned int>(offset + size) > bufferObject->size())
7851 {
7852 return gl::error(GL_INVALID_VALUE);
7853 }
7854
7855 switch (target)
7856 {
7857 case GL_TRANSFORM_FEEDBACK_BUFFER:
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +00007858 context->bindIndexedTransformFeedbackBuffer(buffer, index, offset, size);
7859 context->bindGenericTransformFeedbackBuffer(buffer);
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007860 break;
7861
7862 case GL_UNIFORM_BUFFER:
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +00007863 context->bindIndexedUniformBuffer(buffer, index, offset, size);
7864 context->bindGenericUniformBuffer(buffer);
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007865 break;
7866
7867 default:
7868 UNREACHABLE();
7869 }
7870 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007871 }
7872 catch(std::bad_alloc&)
7873 {
7874 return gl::error(GL_OUT_OF_MEMORY);
7875 }
7876}
7877
7878void __stdcall glBindBufferBase(GLenum target, GLuint index, GLuint buffer)
7879{
7880 EVENT("(GLenum target = 0x%X, GLuint index = %u, GLuint buffer = %u)",
7881 target, index, buffer);
7882
7883 try
7884 {
7885 gl::Context *context = gl::getNonLostContext();
7886
7887 if (context)
7888 {
7889 if (context->getClientVersion() < 3)
7890 {
7891 return gl::error(GL_INVALID_OPERATION);
7892 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007893
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007894 switch (target)
7895 {
7896 case GL_TRANSFORM_FEEDBACK_BUFFER:
7897 if (index > context->getMaxTransformFeedbackBufferBindings())
7898 {
7899 return gl::error(GL_INVALID_VALUE);
7900 }
7901 break;
7902
7903 case GL_UNIFORM_BUFFER:
7904 if (index > context->getMaximumCombinedUniformBufferBindings())
7905 {
7906 return gl::error(GL_INVALID_VALUE);
7907 }
7908 break;
7909
7910 default:
7911 return gl::error(GL_INVALID_ENUM);
7912 }
7913
7914 gl::Buffer *bufferObject = context->getBuffer(buffer);
7915 if (!bufferObject)
7916 {
7917 // Buffer index must not have been valid
7918 return gl::error(GL_INVALID_VALUE);
7919 }
7920
7921 switch (target)
7922 {
7923 case GL_TRANSFORM_FEEDBACK_BUFFER:
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +00007924 context->bindIndexedTransformFeedbackBuffer(buffer, index, 0, -1);
7925 context->bindGenericTransformFeedbackBuffer(buffer);
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007926 break;
7927
7928 case GL_UNIFORM_BUFFER:
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +00007929 context->bindIndexedUniformBuffer(buffer, index, 0, -1);
7930 context->bindGenericUniformBuffer(buffer);
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007931 break;
7932
7933 default:
7934 UNREACHABLE();
7935 }
7936 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007937 }
7938 catch(std::bad_alloc&)
7939 {
7940 return gl::error(GL_OUT_OF_MEMORY);
7941 }
7942}
7943
7944void __stdcall glTransformFeedbackVaryings(GLuint program, GLsizei count, const GLchar* const* varyings, GLenum bufferMode)
7945{
7946 EVENT("(GLuint program = %u, GLsizei count = %d, const GLchar* const* varyings = 0x%0.8p, GLenum bufferMode = 0x%X)",
7947 program, count, varyings, bufferMode);
7948
7949 try
7950 {
7951 gl::Context *context = gl::getNonLostContext();
7952
7953 if (context)
7954 {
7955 if (context->getClientVersion() < 3)
7956 {
7957 return gl::error(GL_INVALID_OPERATION);
7958 }
7959 }
7960
7961 UNIMPLEMENTED();
7962 }
7963 catch(std::bad_alloc&)
7964 {
7965 return gl::error(GL_OUT_OF_MEMORY);
7966 }
7967}
7968
7969void __stdcall glGetTransformFeedbackVarying(GLuint program, GLuint index, GLsizei bufSize, GLsizei* length, GLsizei* size, GLenum* type, GLchar* name)
7970{
7971 EVENT("(GLuint program = %u, GLuint index = %u, GLsizei bufSize = %d, GLsizei* length = 0x%0.8p, "
7972 "GLsizei* size = 0x%0.8p, GLenum* type = 0x%0.8p, GLchar* name = 0x%0.8p)",
7973 program, index, bufSize, length, size, type, name);
7974
7975 try
7976 {
7977 gl::Context *context = gl::getNonLostContext();
7978
7979 if (context)
7980 {
7981 if (context->getClientVersion() < 3)
7982 {
7983 return gl::error(GL_INVALID_OPERATION);
7984 }
7985 }
7986
7987 UNIMPLEMENTED();
7988 }
7989 catch(std::bad_alloc&)
7990 {
7991 return gl::error(GL_OUT_OF_MEMORY);
7992 }
7993}
7994
7995void __stdcall glVertexAttribIPointer(GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid* pointer)
7996{
7997 EVENT("(GLuint index = %u, GLint size = %d, GLenum type = 0x%X, GLsizei stride = %d, const GLvoid* pointer = 0x%0.8p)",
7998 index, size, type, stride, pointer);
7999
8000 try
8001 {
8002 gl::Context *context = gl::getNonLostContext();
8003
8004 if (context)
8005 {
8006 if (context->getClientVersion() < 3)
8007 {
8008 return gl::error(GL_INVALID_OPERATION);
8009 }
8010 }
8011
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00008012 if (index >= gl::MAX_VERTEX_ATTRIBS)
8013 {
8014 return gl::error(GL_INVALID_VALUE);
8015 }
8016
8017 if (size < 1 || size > 4)
8018 {
8019 return gl::error(GL_INVALID_VALUE);
8020 }
8021
8022 switch (type)
8023 {
8024 case GL_BYTE:
8025 case GL_UNSIGNED_BYTE:
8026 case GL_SHORT:
8027 case GL_UNSIGNED_SHORT:
8028 case GL_INT:
8029 case GL_UNSIGNED_INT:
shannon.woods%transgaming.com@gtempaccount.com1ab57be2013-04-13 03:38:39 +00008030 case GL_INT_2_10_10_10_REV:
8031 case GL_UNSIGNED_INT_2_10_10_10_REV:
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00008032 break;
8033 default:
8034 return gl::error(GL_INVALID_ENUM);
8035 }
8036
8037 if (stride < 0)
8038 {
8039 return gl::error(GL_INVALID_VALUE);
8040 }
8041
shannon.woods%transgaming.com@gtempaccount.com1ab57be2013-04-13 03:38:39 +00008042 if ((type == GL_INT_2_10_10_10_REV || type == GL_UNSIGNED_INT_2_10_10_10_REV) && size != 4)
8043 {
8044 return gl::error(GL_INVALID_OPERATION);
8045 }
8046
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00008047 if (context)
8048 {
8049 context->setVertexAttribState(index, context->getArrayBuffer(), size, type, false, true,
8050 stride, pointer);
8051 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008052 }
8053 catch(std::bad_alloc&)
8054 {
8055 return gl::error(GL_OUT_OF_MEMORY);
8056 }
8057}
8058
8059void __stdcall glGetVertexAttribIiv(GLuint index, GLenum pname, GLint* params)
8060{
8061 EVENT("(GLuint index = %u, GLenum pname = 0x%X, GLint* params = 0x%0.8p)",
8062 index, pname, params);
8063
8064 try
8065 {
8066 gl::Context *context = gl::getNonLostContext();
8067
8068 if (context)
8069 {
8070 if (context->getClientVersion() < 3)
8071 {
8072 return gl::error(GL_INVALID_OPERATION);
8073 }
8074 }
8075
8076 UNIMPLEMENTED();
8077 }
8078 catch(std::bad_alloc&)
8079 {
8080 return gl::error(GL_OUT_OF_MEMORY);
8081 }
8082}
8083
8084void __stdcall glGetVertexAttribIuiv(GLuint index, GLenum pname, GLuint* params)
8085{
8086 EVENT("(GLuint index = %u, GLenum pname = 0x%X, GLuint* params = 0x%0.8p)",
8087 index, pname, params);
8088
8089 try
8090 {
8091 gl::Context *context = gl::getNonLostContext();
8092
8093 if (context)
8094 {
8095 if (context->getClientVersion() < 3)
8096 {
8097 return gl::error(GL_INVALID_OPERATION);
8098 }
8099 }
8100
8101 UNIMPLEMENTED();
8102 }
8103 catch(std::bad_alloc&)
8104 {
8105 return gl::error(GL_OUT_OF_MEMORY);
8106 }
8107}
8108
8109void __stdcall glVertexAttribI4i(GLuint index, GLint x, GLint y, GLint z, GLint w)
8110{
8111 EVENT("(GLuint index = %u, GLint x = %d, GLint y = %d, GLint z = %d, GLint w = %d)",
8112 index, x, y, z, w);
8113
8114 try
8115 {
8116 gl::Context *context = gl::getNonLostContext();
8117
8118 if (context)
8119 {
8120 if (context->getClientVersion() < 3)
8121 {
8122 return gl::error(GL_INVALID_OPERATION);
8123 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008124
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00008125 if (index >= gl::MAX_VERTEX_ATTRIBS)
8126 {
8127 return gl::error(GL_INVALID_VALUE);
8128 }
8129
8130 GLint vals[4] = { x, y, z, w };
8131 context->setVertexAttribi(index, vals);
8132 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008133 }
8134 catch(std::bad_alloc&)
8135 {
8136 return gl::error(GL_OUT_OF_MEMORY);
8137 }
8138}
8139
8140void __stdcall glVertexAttribI4ui(GLuint index, GLuint x, GLuint y, GLuint z, GLuint w)
8141{
8142 EVENT("(GLuint index = %u, GLuint x = %u, GLuint y = %u, GLuint z = %u, GLuint w = %u)",
8143 index, x, y, z, w);
8144
8145 try
8146 {
8147 gl::Context *context = gl::getNonLostContext();
8148
8149 if (context)
8150 {
8151 if (context->getClientVersion() < 3)
8152 {
8153 return gl::error(GL_INVALID_OPERATION);
8154 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008155
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00008156 if (index >= gl::MAX_VERTEX_ATTRIBS)
8157 {
8158 return gl::error(GL_INVALID_VALUE);
8159 }
8160
8161 GLuint vals[4] = { x, y, z, w };
8162 context->setVertexAttribu(index, vals);
8163 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008164 }
8165 catch(std::bad_alloc&)
8166 {
8167 return gl::error(GL_OUT_OF_MEMORY);
8168 }
8169}
8170
8171void __stdcall glVertexAttribI4iv(GLuint index, const GLint* v)
8172{
8173 EVENT("(GLuint index = %u, const GLint* v = 0x%0.8p)", index, v);
8174
8175 try
8176 {
8177 gl::Context *context = gl::getNonLostContext();
8178
8179 if (context)
8180 {
8181 if (context->getClientVersion() < 3)
8182 {
8183 return gl::error(GL_INVALID_OPERATION);
8184 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008185
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00008186 if (index >= gl::MAX_VERTEX_ATTRIBS)
8187 {
8188 return gl::error(GL_INVALID_VALUE);
8189 }
8190
8191 context->setVertexAttribi(index, v);
8192 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008193 }
8194 catch(std::bad_alloc&)
8195 {
8196 return gl::error(GL_OUT_OF_MEMORY);
8197 }
8198}
8199
8200void __stdcall glVertexAttribI4uiv(GLuint index, const GLuint* v)
8201{
8202 EVENT("(GLuint index = %u, const GLuint* v = 0x%0.8p)", index, v);
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);
8213 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008214
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00008215 if (index >= gl::MAX_VERTEX_ATTRIBS)
8216 {
8217 return gl::error(GL_INVALID_VALUE);
8218 }
8219
8220 context->setVertexAttribu(index, v);
8221 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008222 }
8223 catch(std::bad_alloc&)
8224 {
8225 return gl::error(GL_OUT_OF_MEMORY);
8226 }
8227}
8228
8229void __stdcall glGetUniformuiv(GLuint program, GLint location, GLuint* params)
8230{
8231 EVENT("(GLuint program = %u, GLint location = %d, GLuint* params = 0x%0.8p)",
8232 program, location, params);
8233
8234 try
8235 {
8236 gl::Context *context = gl::getNonLostContext();
8237
8238 if (context)
8239 {
8240 if (context->getClientVersion() < 3)
8241 {
8242 return gl::error(GL_INVALID_OPERATION);
8243 }
8244 }
8245
8246 UNIMPLEMENTED();
8247 }
8248 catch(std::bad_alloc&)
8249 {
8250 return gl::error(GL_OUT_OF_MEMORY);
8251 }
8252}
8253
8254GLint __stdcall glGetFragDataLocation(GLuint program, const GLchar *name)
8255{
8256 EVENT("(GLuint program = %u, const GLchar *name = 0x%0.8p)",
8257 program, name);
8258
8259 try
8260 {
8261 gl::Context *context = gl::getNonLostContext();
8262
8263 if (context)
8264 {
8265 if (context->getClientVersion() < 3)
8266 {
8267 return gl::error(GL_INVALID_OPERATION, 0);
8268 }
8269 }
8270
8271 UNIMPLEMENTED();
8272 }
8273 catch(std::bad_alloc&)
8274 {
8275 return gl::error(GL_OUT_OF_MEMORY, 0);
8276 }
8277
8278 return 0;
8279}
8280
8281void __stdcall glUniform1ui(GLint location, GLuint v0)
8282{
8283 EVENT("(GLint location = %d, GLuint v0 = %u)",
8284 location, v0);
8285
8286 try
8287 {
8288 gl::Context *context = gl::getNonLostContext();
8289
8290 if (context)
8291 {
8292 if (context->getClientVersion() < 3)
8293 {
8294 return gl::error(GL_INVALID_OPERATION);
8295 }
8296 }
8297
8298 UNIMPLEMENTED();
8299 }
8300 catch(std::bad_alloc&)
8301 {
8302 return gl::error(GL_OUT_OF_MEMORY);
8303 }
8304}
8305
8306void __stdcall glUniform2ui(GLint location, GLuint v0, GLuint v1)
8307{
8308 EVENT("(GLint location = %d, GLuint v0 = %u, GLuint v1 = %u)",
8309 location, v0, v1);
8310
8311 try
8312 {
8313 gl::Context *context = gl::getNonLostContext();
8314
8315 if (context)
8316 {
8317 if (context->getClientVersion() < 3)
8318 {
8319 return gl::error(GL_INVALID_OPERATION);
8320 }
8321 }
8322
8323 UNIMPLEMENTED();
8324 }
8325 catch(std::bad_alloc&)
8326 {
8327 return gl::error(GL_OUT_OF_MEMORY);
8328 }
8329}
8330
8331void __stdcall glUniform3ui(GLint location, GLuint v0, GLuint v1, GLuint v2)
8332{
8333 EVENT("(GLint location = %d, GLuint v0 = %u, GLuint v1 = %u, GLuint v2 = %u)",
8334 location, v0, v1, v2);
8335
8336 try
8337 {
8338 gl::Context *context = gl::getNonLostContext();
8339
8340 if (context)
8341 {
8342 if (context->getClientVersion() < 3)
8343 {
8344 return gl::error(GL_INVALID_OPERATION);
8345 }
8346 }
8347
8348 UNIMPLEMENTED();
8349 }
8350 catch(std::bad_alloc&)
8351 {
8352 return gl::error(GL_OUT_OF_MEMORY);
8353 }
8354}
8355
8356void __stdcall glUniform4ui(GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3)
8357{
8358 EVENT("(GLint location = %d, GLuint v0 = %u, GLuint v1 = %u, GLuint v2 = %u, GLuint v3 = %u)",
8359 location, v0, v1, v2, v3);
8360
8361 try
8362 {
8363 gl::Context *context = gl::getNonLostContext();
8364
8365 if (context)
8366 {
8367 if (context->getClientVersion() < 3)
8368 {
8369 return gl::error(GL_INVALID_OPERATION);
8370 }
8371 }
8372
8373 UNIMPLEMENTED();
8374 }
8375 catch(std::bad_alloc&)
8376 {
8377 return gl::error(GL_OUT_OF_MEMORY);
8378 }
8379}
8380
8381void __stdcall glUniform1uiv(GLint location, GLsizei count, const GLuint* value)
8382{
8383 EVENT("(GLint location = %d, GLsizei count = %d, const GLuint* value = 0x%0.8p)",
8384 location, count, value);
8385
8386 try
8387 {
8388 gl::Context *context = gl::getNonLostContext();
8389
8390 if (context)
8391 {
8392 if (context->getClientVersion() < 3)
8393 {
8394 return gl::error(GL_INVALID_OPERATION);
8395 }
8396 }
8397
8398 UNIMPLEMENTED();
8399 }
8400 catch(std::bad_alloc&)
8401 {
8402 return gl::error(GL_OUT_OF_MEMORY);
8403 }
8404}
8405
8406void __stdcall glUniform2uiv(GLint location, GLsizei count, const GLuint* value)
8407{
8408 EVENT("(GLint location = %d, GLsizei count = %d, const GLuint* value = 0x%0.8p)",
8409 location, count, value);
8410
8411 try
8412 {
8413 gl::Context *context = gl::getNonLostContext();
8414
8415 if (context)
8416 {
8417 if (context->getClientVersion() < 3)
8418 {
8419 return gl::error(GL_INVALID_OPERATION);
8420 }
8421 }
8422
8423 UNIMPLEMENTED();
8424 }
8425 catch(std::bad_alloc&)
8426 {
8427 return gl::error(GL_OUT_OF_MEMORY);
8428 }
8429}
8430
8431void __stdcall glUniform3uiv(GLint location, GLsizei count, const GLuint* value)
8432{
8433 EVENT("(GLint location = %d, GLsizei count = %d, const GLuint* value)",
8434 location, count, value);
8435
8436 try
8437 {
8438 gl::Context *context = gl::getNonLostContext();
8439
8440 if (context)
8441 {
8442 if (context->getClientVersion() < 3)
8443 {
8444 return gl::error(GL_INVALID_OPERATION);
8445 }
8446 }
8447
8448 UNIMPLEMENTED();
8449 }
8450 catch(std::bad_alloc&)
8451 {
8452 return gl::error(GL_OUT_OF_MEMORY);
8453 }
8454}
8455
8456void __stdcall glUniform4uiv(GLint location, GLsizei count, const GLuint* value)
8457{
8458 EVENT("(GLint location = %d, GLsizei count = %d, const GLuint* value = 0x%0.8p)",
8459 location, count, value);
8460
8461 try
8462 {
8463 gl::Context *context = gl::getNonLostContext();
8464
8465 if (context)
8466 {
8467 if (context->getClientVersion() < 3)
8468 {
8469 return gl::error(GL_INVALID_OPERATION);
8470 }
8471 }
8472
8473 UNIMPLEMENTED();
8474 }
8475 catch(std::bad_alloc&)
8476 {
8477 return gl::error(GL_OUT_OF_MEMORY);
8478 }
8479}
8480
8481void __stdcall glClearBufferiv(GLenum buffer, GLint drawbuffer, const GLint* value)
8482{
8483 EVENT("(GLenum buffer = 0x%X, GLint drawbuffer = %d, const GLint* value = 0x%0.8p)",
8484 buffer, drawbuffer, value);
8485
8486 try
8487 {
8488 gl::Context *context = gl::getNonLostContext();
8489
8490 if (context)
8491 {
8492 if (context->getClientVersion() < 3)
8493 {
8494 return gl::error(GL_INVALID_OPERATION);
8495 }
8496 }
8497
8498 UNIMPLEMENTED();
8499 }
8500 catch(std::bad_alloc&)
8501 {
8502 return gl::error(GL_OUT_OF_MEMORY);
8503 }
8504}
8505
8506void __stdcall glClearBufferuiv(GLenum buffer, GLint drawbuffer, const GLuint* value)
8507{
8508 EVENT("(GLenum buffer = 0x%X, GLint drawbuffer = %d, const GLuint* value = 0x%0.8p)",
8509 buffer, drawbuffer, value);
8510
8511 try
8512 {
8513 gl::Context *context = gl::getNonLostContext();
8514
8515 if (context)
8516 {
8517 if (context->getClientVersion() < 3)
8518 {
8519 return gl::error(GL_INVALID_OPERATION);
8520 }
8521 }
8522
8523 UNIMPLEMENTED();
8524 }
8525 catch(std::bad_alloc&)
8526 {
8527 return gl::error(GL_OUT_OF_MEMORY);
8528 }
8529}
8530
8531void __stdcall glClearBufferfv(GLenum buffer, GLint drawbuffer, const GLfloat* value)
8532{
8533 EVENT("(GLenum buffer = 0x%X, GLint drawbuffer = %d, const GLfloat* value = 0x%0.8p)",
8534 buffer, drawbuffer, value);
8535
8536 try
8537 {
8538 gl::Context *context = gl::getNonLostContext();
8539
8540 if (context)
8541 {
8542 if (context->getClientVersion() < 3)
8543 {
8544 return gl::error(GL_INVALID_OPERATION);
8545 }
8546 }
8547
8548 UNIMPLEMENTED();
8549 }
8550 catch(std::bad_alloc&)
8551 {
8552 return gl::error(GL_OUT_OF_MEMORY);
8553 }
8554}
8555
8556void __stdcall glClearBufferfi(GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil)
8557{
8558 EVENT("(GLenum buffer = 0x%X, GLint drawbuffer = %d, GLfloat depth, GLint stencil = %d)",
8559 buffer, drawbuffer, depth, stencil);
8560
8561 try
8562 {
8563 gl::Context *context = gl::getNonLostContext();
8564
8565 if (context)
8566 {
8567 if (context->getClientVersion() < 3)
8568 {
8569 return gl::error(GL_INVALID_OPERATION);
8570 }
8571 }
8572
8573 UNIMPLEMENTED();
8574 }
8575 catch(std::bad_alloc&)
8576 {
8577 return gl::error(GL_OUT_OF_MEMORY);
8578 }
8579}
8580
8581const GLubyte* __stdcall glGetStringi(GLenum name, GLuint index)
8582{
8583 EVENT("(GLenum name = 0x%X, GLuint index = %u)", name, index);
8584
8585 try
8586 {
8587 gl::Context *context = gl::getNonLostContext();
8588
8589 if (context)
8590 {
8591 if (context->getClientVersion() < 3)
8592 {
8593 return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLubyte*>(NULL));
8594 }
8595 }
8596
8597 UNIMPLEMENTED();
8598 }
8599 catch(std::bad_alloc&)
8600 {
8601 return gl::error(GL_OUT_OF_MEMORY, reinterpret_cast<GLubyte*>(NULL));
8602 }
8603
8604 return NULL;
8605}
8606
8607void __stdcall glCopyBufferSubData(GLenum readTarget, GLenum writeTarget, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size)
8608{
8609 EVENT("(GLenum readTarget = 0x%X, GLenum writeTarget = 0x%X, GLintptr readOffset = %d, GLintptr writeOffset = %d, GLsizeiptr size = %d)",
8610 readTarget, writeTarget, readOffset, writeOffset, size);
8611
8612 try
8613 {
8614 gl::Context *context = gl::getNonLostContext();
8615
8616 if (context)
8617 {
8618 if (context->getClientVersion() < 3)
8619 {
8620 return gl::error(GL_INVALID_OPERATION);
8621 }
8622 }
8623
8624 UNIMPLEMENTED();
8625 }
8626 catch(std::bad_alloc&)
8627 {
8628 return gl::error(GL_OUT_OF_MEMORY);
8629 }
8630}
8631
8632void __stdcall glGetUniformIndices(GLuint program, GLsizei uniformCount, const GLchar* const* uniformNames, GLuint* uniformIndices)
8633{
8634 EVENT("(GLuint program = %u, GLsizei uniformCount = %d, const GLchar* const* uniformNames = 0x%0.8p, GLuint* uniformIndices = 0x%0.8p)",
8635 program, uniformCount, uniformNames, uniformIndices);
8636
8637 try
8638 {
8639 gl::Context *context = gl::getNonLostContext();
8640
8641 if (context)
8642 {
8643 if (context->getClientVersion() < 3)
8644 {
8645 return gl::error(GL_INVALID_OPERATION);
8646 }
8647 }
8648
8649 UNIMPLEMENTED();
8650 }
8651 catch(std::bad_alloc&)
8652 {
8653 return gl::error(GL_OUT_OF_MEMORY);
8654 }
8655}
8656
8657void __stdcall glGetActiveUniformsiv(GLuint program, GLsizei uniformCount, const GLuint* uniformIndices, GLenum pname, GLint* params)
8658{
8659 EVENT("(GLuint program = %u, GLsizei uniformCount = %d, const GLuint* uniformIndices = 0x%0.8p, GLenum pname = 0x%X, GLint* params = 0x%0.8p)",
8660 program, uniformCount, uniformIndices, pname, params);
8661
8662 try
8663 {
8664 gl::Context *context = gl::getNonLostContext();
8665
8666 if (context)
8667 {
8668 if (context->getClientVersion() < 3)
8669 {
8670 return gl::error(GL_INVALID_OPERATION);
8671 }
8672 }
8673
8674 UNIMPLEMENTED();
8675 }
8676 catch(std::bad_alloc&)
8677 {
8678 return gl::error(GL_OUT_OF_MEMORY);
8679 }
8680}
8681
8682GLuint __stdcall glGetUniformBlockIndex(GLuint program, const GLchar* uniformBlockName)
8683{
8684 EVENT("(GLuint program = %u, const GLchar* uniformBlockName = 0x%0.8p)", program, uniformBlockName);
8685
8686 try
8687 {
8688 gl::Context *context = gl::getNonLostContext();
8689
8690 if (context)
8691 {
8692 if (context->getClientVersion() < 3)
8693 {
8694 return gl::error(GL_INVALID_OPERATION, 0);
8695 }
8696 }
8697
8698 UNIMPLEMENTED();
8699 }
8700 catch(std::bad_alloc&)
8701 {
8702 return gl::error(GL_OUT_OF_MEMORY, 0);
8703 }
8704
8705 return 0;
8706}
8707
8708void __stdcall glGetActiveUniformBlockiv(GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint* params)
8709{
8710 EVENT("(GLuint program = %u, GLuint uniformBlockIndex = %u, GLenum pname = 0x%X, GLint* params = 0x%0.8p)",
8711 program, uniformBlockIndex, pname, params);
8712
8713 try
8714 {
8715 gl::Context *context = gl::getNonLostContext();
8716
8717 if (context)
8718 {
8719 if (context->getClientVersion() < 3)
8720 {
8721 return gl::error(GL_INVALID_OPERATION);
8722 }
8723 }
8724
8725 UNIMPLEMENTED();
8726 }
8727 catch(std::bad_alloc&)
8728 {
8729 return gl::error(GL_OUT_OF_MEMORY);
8730 }
8731}
8732
8733void __stdcall glGetActiveUniformBlockName(GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei* length, GLchar* uniformBlockName)
8734{
8735 EVENT("(GLuint program = %u, GLuint uniformBlockIndex = %u, GLsizei bufSize = %d, GLsizei* length = 0x%0.8p, GLchar* uniformBlockName = 0x%0.8p)",
8736 program, uniformBlockIndex, bufSize, length, uniformBlockName);
8737
8738 try
8739 {
8740 gl::Context *context = gl::getNonLostContext();
8741
8742 if (context)
8743 {
8744 if (context->getClientVersion() < 3)
8745 {
8746 return gl::error(GL_INVALID_OPERATION);
8747 }
8748 }
8749
8750 UNIMPLEMENTED();
8751 }
8752 catch(std::bad_alloc&)
8753 {
8754 return gl::error(GL_OUT_OF_MEMORY);
8755 }
8756}
8757
8758void __stdcall glUniformBlockBinding(GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding)
8759{
8760 EVENT("(GLuint program = %u, GLuint uniformBlockIndex = %u, GLuint uniformBlockBinding = %u)",
8761 program, uniformBlockIndex, uniformBlockBinding);
8762
8763 try
8764 {
8765 gl::Context *context = gl::getNonLostContext();
8766
8767 if (context)
8768 {
8769 if (context->getClientVersion() < 3)
8770 {
8771 return gl::error(GL_INVALID_OPERATION);
8772 }
8773 }
8774
8775 UNIMPLEMENTED();
8776 }
8777 catch(std::bad_alloc&)
8778 {
8779 return gl::error(GL_OUT_OF_MEMORY);
8780 }
8781}
8782
8783void __stdcall glDrawArraysInstanced(GLenum mode, GLint first, GLsizei count, GLsizei instanceCount)
8784{
8785 EVENT("(GLenum mode = 0x%X, GLint first = %d, GLsizei count = %d, GLsizei instanceCount = %d)",
8786 mode, first, count, instanceCount);
8787
8788 try
8789 {
8790 gl::Context *context = gl::getNonLostContext();
8791
8792 if (context)
8793 {
8794 if (context->getClientVersion() < 3)
8795 {
8796 return gl::error(GL_INVALID_OPERATION);
8797 }
8798 }
8799
8800 UNIMPLEMENTED();
8801 }
8802 catch(std::bad_alloc&)
8803 {
8804 return gl::error(GL_OUT_OF_MEMORY);
8805 }
8806}
8807
8808void __stdcall glDrawElementsInstanced(GLenum mode, GLsizei count, GLenum type, const GLvoid* indices, GLsizei instanceCount)
8809{
8810 EVENT("(GLenum mode = 0x%X, GLsizei count = %d, GLenum type = 0x%X, const GLvoid* indices = 0x%0.8p, GLsizei instanceCount = %d)",
8811 mode, count, type, indices, instanceCount);
8812
8813 try
8814 {
8815 gl::Context *context = gl::getNonLostContext();
8816
8817 if (context)
8818 {
8819 if (context->getClientVersion() < 3)
8820 {
8821 return gl::error(GL_INVALID_OPERATION);
8822 }
8823 }
8824
8825 UNIMPLEMENTED();
8826 }
8827 catch(std::bad_alloc&)
8828 {
8829 return gl::error(GL_OUT_OF_MEMORY);
8830 }
8831}
8832
8833GLsync __stdcall glFenceSync(GLenum condition, GLbitfield flags)
8834{
8835 EVENT("(GLenum condition = 0x%X, GLbitfield flags = 0x%X)", condition, flags);
8836
8837 try
8838 {
8839 gl::Context *context = gl::getNonLostContext();
8840
8841 if (context)
8842 {
8843 if (context->getClientVersion() < 3)
8844 {
8845 return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLsync>(NULL));
8846 }
8847 }
8848
8849 UNIMPLEMENTED();
8850 }
8851 catch(std::bad_alloc&)
8852 {
8853 return gl::error(GL_OUT_OF_MEMORY, reinterpret_cast<GLsync>(NULL));
8854 }
8855
8856 return NULL;
8857}
8858
8859GLboolean __stdcall glIsSync(GLsync sync)
8860{
8861 EVENT("(GLsync sync = 0x%0.8p)", sync);
8862
8863 try
8864 {
8865 gl::Context *context = gl::getNonLostContext();
8866
8867 if (context)
8868 {
8869 if (context->getClientVersion() < 3)
8870 {
8871 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
8872 }
8873 }
8874
8875 UNIMPLEMENTED();
8876 }
8877 catch(std::bad_alloc&)
8878 {
8879 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
8880 }
8881
8882 return GL_FALSE;
8883}
8884
8885void __stdcall glDeleteSync(GLsync sync)
8886{
8887 EVENT("(GLsync sync = 0x%0.8p)", sync);
8888
8889 try
8890 {
8891 gl::Context *context = gl::getNonLostContext();
8892
8893 if (context)
8894 {
8895 if (context->getClientVersion() < 3)
8896 {
8897 return gl::error(GL_INVALID_OPERATION);
8898 }
8899 }
8900
8901 UNIMPLEMENTED();
8902 }
8903 catch(std::bad_alloc&)
8904 {
8905 return gl::error(GL_OUT_OF_MEMORY);
8906 }
8907}
8908
8909GLenum __stdcall glClientWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout)
8910{
8911 EVENT("(GLsync sync = 0x%0.8p, GLbitfield flags = 0x%X, GLuint64 timeout = %llu)",
8912 sync, flags, timeout);
8913
8914 try
8915 {
8916 gl::Context *context = gl::getNonLostContext();
8917
8918 if (context)
8919 {
8920 if (context->getClientVersion() < 3)
8921 {
8922 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
8923 }
8924 }
8925
8926 UNIMPLEMENTED();
8927 }
8928 catch(std::bad_alloc&)
8929 {
8930 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
8931 }
8932
8933 return GL_FALSE;
8934}
8935
8936void __stdcall glWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout)
8937{
8938 EVENT("(GLsync sync = 0x%0.8p, GLbitfield flags = 0x%X, GLuint64 timeout = %llu)",
8939 sync, flags, timeout);
8940
8941 try
8942 {
8943 gl::Context *context = gl::getNonLostContext();
8944
8945 if (context)
8946 {
8947 if (context->getClientVersion() < 3)
8948 {
8949 return gl::error(GL_INVALID_OPERATION);
8950 }
8951 }
8952
8953 UNIMPLEMENTED();
8954 }
8955 catch(std::bad_alloc&)
8956 {
8957 return gl::error(GL_OUT_OF_MEMORY);
8958 }
8959}
8960
8961void __stdcall glGetInteger64v(GLenum pname, GLint64* params)
8962{
8963 EVENT("(GLenum pname = 0x%X, GLint64* params = 0x%0.8p)",
8964 pname, params);
8965
8966 try
8967 {
8968 gl::Context *context = gl::getNonLostContext();
8969
8970 if (context)
8971 {
8972 if (context->getClientVersion() < 3)
8973 {
8974 return gl::error(GL_INVALID_OPERATION);
8975 }
8976 }
8977
8978 UNIMPLEMENTED();
8979 }
8980 catch(std::bad_alloc&)
8981 {
8982 return gl::error(GL_OUT_OF_MEMORY);
8983 }
8984}
8985
8986void __stdcall glGetSynciv(GLsync sync, GLenum pname, GLsizei bufSize, GLsizei* length, GLint* values)
8987{
8988 EVENT("(GLsync sync = 0x%0.8p, GLenum pname = 0x%X, GLsizei bufSize = %d, GLsizei* length = 0x%0.8p, GLint* values = 0x%0.8p)",
8989 sync, pname, bufSize, length, values);
8990
8991 try
8992 {
8993 gl::Context *context = gl::getNonLostContext();
8994
8995 if (context)
8996 {
8997 if (context->getClientVersion() < 3)
8998 {
8999 return gl::error(GL_INVALID_OPERATION);
9000 }
9001 }
9002
9003 UNIMPLEMENTED();
9004 }
9005 catch(std::bad_alloc&)
9006 {
9007 return gl::error(GL_OUT_OF_MEMORY);
9008 }
9009}
9010
9011void __stdcall glGetInteger64i_v(GLenum target, GLuint index, GLint64* data)
9012{
9013 EVENT("(GLenum target = 0x%X, GLuint index = %u, GLint64* data = 0x%0.8p)",
9014 target, index, data);
9015
9016 try
9017 {
9018 gl::Context *context = gl::getNonLostContext();
9019
9020 if (context)
9021 {
9022 if (context->getClientVersion() < 3)
9023 {
9024 return gl::error(GL_INVALID_OPERATION);
9025 }
9026 }
9027
9028 UNIMPLEMENTED();
9029 }
9030 catch(std::bad_alloc&)
9031 {
9032 return gl::error(GL_OUT_OF_MEMORY);
9033 }
9034}
9035
9036void __stdcall glGetBufferParameteri64v(GLenum target, GLenum pname, GLint64* params)
9037{
9038 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLint64* params = 0x%0.8p)",
9039 target, pname, params);
9040
9041 try
9042 {
9043 gl::Context *context = gl::getNonLostContext();
9044
9045 if (context)
9046 {
9047 if (context->getClientVersion() < 3)
9048 {
9049 return gl::error(GL_INVALID_OPERATION);
9050 }
9051 }
9052
9053 UNIMPLEMENTED();
9054 }
9055 catch(std::bad_alloc&)
9056 {
9057 return gl::error(GL_OUT_OF_MEMORY);
9058 }
9059}
9060
9061void __stdcall glGenSamplers(GLsizei count, GLuint* samplers)
9062{
9063 EVENT("(GLsizei count = %d, GLuint* samplers = 0x%0.8p)", count, samplers);
9064
9065 try
9066 {
9067 gl::Context *context = gl::getNonLostContext();
9068
9069 if (context)
9070 {
9071 if (context->getClientVersion() < 3)
9072 {
9073 return gl::error(GL_INVALID_OPERATION);
9074 }
9075 }
9076
9077 UNIMPLEMENTED();
9078 }
9079 catch(std::bad_alloc&)
9080 {
9081 return gl::error(GL_OUT_OF_MEMORY);
9082 }
9083}
9084
9085void __stdcall glDeleteSamplers(GLsizei count, const GLuint* samplers)
9086{
9087 EVENT("(GLsizei count = %d, const GLuint* samplers = 0x%0.8p)", count, samplers);
9088
9089 try
9090 {
9091 gl::Context *context = gl::getNonLostContext();
9092
9093 if (context)
9094 {
9095 if (context->getClientVersion() < 3)
9096 {
9097 return gl::error(GL_INVALID_OPERATION);
9098 }
9099 }
9100
9101 UNIMPLEMENTED();
9102 }
9103 catch(std::bad_alloc&)
9104 {
9105 return gl::error(GL_OUT_OF_MEMORY);
9106 }
9107}
9108
9109GLboolean __stdcall glIsSampler(GLuint sampler)
9110{
9111 EVENT("(GLuint sampler = %u)", sampler);
9112
9113 try
9114 {
9115 gl::Context *context = gl::getNonLostContext();
9116
9117 if (context)
9118 {
9119 if (context->getClientVersion() < 3)
9120 {
9121 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
9122 }
9123 }
9124
9125 UNIMPLEMENTED();
9126 }
9127 catch(std::bad_alloc&)
9128 {
9129 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
9130 }
9131
9132 return GL_FALSE;
9133}
9134
9135void __stdcall glBindSampler(GLuint unit, GLuint sampler)
9136{
9137 EVENT("(GLuint unit = %u, GLuint sampler = %u)", unit, sampler);
9138
9139 try
9140 {
9141 gl::Context *context = gl::getNonLostContext();
9142
9143 if (context)
9144 {
9145 if (context->getClientVersion() < 3)
9146 {
9147 return gl::error(GL_INVALID_OPERATION);
9148 }
9149 }
9150
9151 UNIMPLEMENTED();
9152 }
9153 catch(std::bad_alloc&)
9154 {
9155 return gl::error(GL_OUT_OF_MEMORY);
9156 }
9157}
9158
9159void __stdcall glSamplerParameteri(GLuint sampler, GLenum pname, GLint param)
9160{
9161 EVENT("(GLuint sampler = %u, GLenum pname = 0x%X, GLint param = %d)", sampler, pname, param);
9162
9163 try
9164 {
9165 gl::Context *context = gl::getNonLostContext();
9166
9167 if (context)
9168 {
9169 if (context->getClientVersion() < 3)
9170 {
9171 return gl::error(GL_INVALID_OPERATION);
9172 }
9173 }
9174
9175 UNIMPLEMENTED();
9176 }
9177 catch(std::bad_alloc&)
9178 {
9179 return gl::error(GL_OUT_OF_MEMORY);
9180 }
9181}
9182
9183void __stdcall glSamplerParameteriv(GLuint sampler, GLenum pname, const GLint* param)
9184{
9185 EVENT("(GLuint sampler = %u, GLenum pname = 0x%X, const GLint* param = 0x%0.8p)",
9186 sampler, pname, param);
9187
9188 try
9189 {
9190 gl::Context *context = gl::getNonLostContext();
9191
9192 if (context)
9193 {
9194 if (context->getClientVersion() < 3)
9195 {
9196 return gl::error(GL_INVALID_OPERATION);
9197 }
9198 }
9199
9200 UNIMPLEMENTED();
9201 }
9202 catch(std::bad_alloc&)
9203 {
9204 return gl::error(GL_OUT_OF_MEMORY);
9205 }
9206}
9207
9208void __stdcall glSamplerParameterf(GLuint sampler, GLenum pname, GLfloat param)
9209{
9210 EVENT("(GLuint sampler = %u, GLenum pname = 0x%X, GLfloat param = %g)", sampler, pname, param);
9211
9212 try
9213 {
9214 gl::Context *context = gl::getNonLostContext();
9215
9216 if (context)
9217 {
9218 if (context->getClientVersion() < 3)
9219 {
9220 return gl::error(GL_INVALID_OPERATION);
9221 }
9222 }
9223
9224 UNIMPLEMENTED();
9225 }
9226 catch(std::bad_alloc&)
9227 {
9228 return gl::error(GL_OUT_OF_MEMORY);
9229 }
9230}
9231
9232void __stdcall glSamplerParameterfv(GLuint sampler, GLenum pname, const GLfloat* param)
9233{
9234 EVENT("(GLuint sampler = %u, GLenum pname = 0x%X, const GLfloat* param = 0x%0.8p)", sampler, pname, param);
9235
9236 try
9237 {
9238 gl::Context *context = gl::getNonLostContext();
9239
9240 if (context)
9241 {
9242 if (context->getClientVersion() < 3)
9243 {
9244 return gl::error(GL_INVALID_OPERATION);
9245 }
9246 }
9247
9248 UNIMPLEMENTED();
9249 }
9250 catch(std::bad_alloc&)
9251 {
9252 return gl::error(GL_OUT_OF_MEMORY);
9253 }
9254}
9255
9256void __stdcall glGetSamplerParameteriv(GLuint sampler, GLenum pname, GLint* params)
9257{
9258 EVENT("(GLuint sampler = %u, GLenum pname = 0x%X, GLint* params = 0x%0.8p)", sampler, pname, params);
9259
9260 try
9261 {
9262 gl::Context *context = gl::getNonLostContext();
9263
9264 if (context)
9265 {
9266 if (context->getClientVersion() < 3)
9267 {
9268 return gl::error(GL_INVALID_OPERATION);
9269 }
9270 }
9271
9272 UNIMPLEMENTED();
9273 }
9274 catch(std::bad_alloc&)
9275 {
9276 return gl::error(GL_OUT_OF_MEMORY);
9277 }
9278}
9279
9280void __stdcall glGetSamplerParameterfv(GLuint sampler, GLenum pname, GLfloat* params)
9281{
9282 EVENT("(GLuint sample = %ur, GLenum pname = 0x%X, GLfloat* params = 0x%0.8p)", sampler, pname, params);
9283
9284 try
9285 {
9286 gl::Context *context = gl::getNonLostContext();
9287
9288 if (context)
9289 {
9290 if (context->getClientVersion() < 3)
9291 {
9292 return gl::error(GL_INVALID_OPERATION);
9293 }
9294 }
9295
9296 UNIMPLEMENTED();
9297 }
9298 catch(std::bad_alloc&)
9299 {
9300 return gl::error(GL_OUT_OF_MEMORY);
9301 }
9302}
9303
9304void __stdcall glVertexAttribDivisor(GLuint index, GLuint divisor)
9305{
9306 EVENT("(GLuint index = %u, GLuint divisor = %u)", index, divisor);
9307
9308 try
9309 {
shannon.woods%transgaming.com@gtempaccount.com8736bd62013-04-13 03:35:41 +00009310 if (index >= gl::MAX_VERTEX_ATTRIBS)
9311 {
9312 return gl::error(GL_INVALID_VALUE);
9313 }
9314
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009315 gl::Context *context = gl::getNonLostContext();
9316
9317 if (context)
9318 {
9319 if (context->getClientVersion() < 3)
9320 {
9321 return gl::error(GL_INVALID_OPERATION);
9322 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009323
shannon.woods%transgaming.com@gtempaccount.com8736bd62013-04-13 03:35:41 +00009324 context->setVertexAttribDivisor(index, divisor);
9325 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009326 }
9327 catch(std::bad_alloc&)
9328 {
9329 return gl::error(GL_OUT_OF_MEMORY);
9330 }
9331}
9332
9333void __stdcall glBindTransformFeedback(GLenum target, GLuint id)
9334{
9335 EVENT("(GLenum target = 0x%X, GLuint id = %u)", target, id);
9336
9337 try
9338 {
9339 gl::Context *context = gl::getNonLostContext();
9340
9341 if (context)
9342 {
9343 if (context->getClientVersion() < 3)
9344 {
9345 return gl::error(GL_INVALID_OPERATION);
9346 }
9347 }
9348
9349 UNIMPLEMENTED();
9350 }
9351 catch(std::bad_alloc&)
9352 {
9353 return gl::error(GL_OUT_OF_MEMORY);
9354 }
9355}
9356
9357void __stdcall glDeleteTransformFeedbacks(GLsizei n, const GLuint* ids)
9358{
9359 EVENT("(GLsizei n = %d, const GLuint* ids = 0x%0.8p)", n, ids);
9360
9361 try
9362 {
9363 gl::Context *context = gl::getNonLostContext();
9364
9365 if (context)
9366 {
9367 if (context->getClientVersion() < 3)
9368 {
9369 return gl::error(GL_INVALID_OPERATION);
9370 }
9371 }
9372
9373 UNIMPLEMENTED();
9374 }
9375 catch(std::bad_alloc&)
9376 {
9377 return gl::error(GL_OUT_OF_MEMORY);
9378 }
9379}
9380
9381void __stdcall glGenTransformFeedbacks(GLsizei n, GLuint* ids)
9382{
9383 EVENT("(GLsizei n = %d, GLuint* ids = 0x%0.8p)", n, ids);
9384
9385 try
9386 {
9387 gl::Context *context = gl::getNonLostContext();
9388
9389 if (context)
9390 {
9391 if (context->getClientVersion() < 3)
9392 {
9393 return gl::error(GL_INVALID_OPERATION);
9394 }
9395 }
9396
9397 UNIMPLEMENTED();
9398 }
9399 catch(std::bad_alloc&)
9400 {
9401 return gl::error(GL_OUT_OF_MEMORY);
9402 }
9403}
9404
9405GLboolean __stdcall glIsTransformFeedback(GLuint id)
9406{
9407 EVENT("(GLuint id = %u)", id);
9408
9409 try
9410 {
9411 gl::Context *context = gl::getNonLostContext();
9412
9413 if (context)
9414 {
9415 if (context->getClientVersion() < 3)
9416 {
9417 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
9418 }
9419 }
9420
9421 UNIMPLEMENTED();
9422 }
9423 catch(std::bad_alloc&)
9424 {
9425 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
9426 }
9427
9428 return GL_FALSE;
9429}
9430
9431void __stdcall glPauseTransformFeedback(void)
9432{
9433 EVENT("(void)");
9434
9435 try
9436 {
9437 gl::Context *context = gl::getNonLostContext();
9438
9439 if (context)
9440 {
9441 if (context->getClientVersion() < 3)
9442 {
9443 return gl::error(GL_INVALID_OPERATION);
9444 }
9445 }
9446
9447 UNIMPLEMENTED();
9448 }
9449 catch(std::bad_alloc&)
9450 {
9451 return gl::error(GL_OUT_OF_MEMORY);
9452 }
9453}
9454
9455void __stdcall glResumeTransformFeedback(void)
9456{
9457 EVENT("(void)");
9458
9459 try
9460 {
9461 gl::Context *context = gl::getNonLostContext();
9462
9463 if (context)
9464 {
9465 if (context->getClientVersion() < 3)
9466 {
9467 return gl::error(GL_INVALID_OPERATION);
9468 }
9469 }
9470
9471 UNIMPLEMENTED();
9472 }
9473 catch(std::bad_alloc&)
9474 {
9475 return gl::error(GL_OUT_OF_MEMORY);
9476 }
9477}
9478
9479void __stdcall glGetProgramBinary(GLuint program, GLsizei bufSize, GLsizei* length, GLenum* binaryFormat, GLvoid* binary)
9480{
9481 EVENT("(GLuint program = %u, GLsizei bufSize = %d, GLsizei* length = 0x%0.8p, GLenum* binaryFormat = 0x%0.8p, GLvoid* binary = 0x%0.8p)",
9482 program, bufSize, length, binaryFormat, binary);
9483
9484 try
9485 {
9486 gl::Context *context = gl::getNonLostContext();
9487
9488 if (context)
9489 {
9490 if (context->getClientVersion() < 3)
9491 {
9492 return gl::error(GL_INVALID_OPERATION);
9493 }
9494 }
9495
9496 UNIMPLEMENTED();
9497 }
9498 catch(std::bad_alloc&)
9499 {
9500 return gl::error(GL_OUT_OF_MEMORY);
9501 }
9502}
9503
9504void __stdcall glProgramBinary(GLuint program, GLenum binaryFormat, const GLvoid* binary, GLsizei length)
9505{
9506 EVENT("(GLuint program = %u, GLenum binaryFormat = 0x%X, const GLvoid* binary = 0x%0.8p, GLsizei length = %d)",
9507 program, binaryFormat, binary, length);
9508
9509 try
9510 {
9511 gl::Context *context = gl::getNonLostContext();
9512
9513 if (context)
9514 {
9515 if (context->getClientVersion() < 3)
9516 {
9517 return gl::error(GL_INVALID_OPERATION);
9518 }
9519 }
9520
9521 UNIMPLEMENTED();
9522 }
9523 catch(std::bad_alloc&)
9524 {
9525 return gl::error(GL_OUT_OF_MEMORY);
9526 }
9527}
9528
9529void __stdcall glProgramParameteri(GLuint program, GLenum pname, GLint value)
9530{
9531 EVENT("(GLuint program = %u, GLenum pname = 0x%X, GLint value = %d)",
9532 program, pname, value);
9533
9534 try
9535 {
9536 gl::Context *context = gl::getNonLostContext();
9537
9538 if (context)
9539 {
9540 if (context->getClientVersion() < 3)
9541 {
9542 return gl::error(GL_INVALID_OPERATION);
9543 }
9544 }
9545
9546 UNIMPLEMENTED();
9547 }
9548 catch(std::bad_alloc&)
9549 {
9550 return gl::error(GL_OUT_OF_MEMORY);
9551 }
9552}
9553
9554void __stdcall glInvalidateFramebuffer(GLenum target, GLsizei numAttachments, const GLenum* attachments)
9555{
9556 EVENT("(GLenum target = 0x%X, GLsizei numAttachments = %d, const GLenum* attachments = 0x%0.8p)",
9557 target, numAttachments, attachments);
9558
9559 try
9560 {
9561 gl::Context *context = gl::getNonLostContext();
9562
9563 if (context)
9564 {
9565 if (context->getClientVersion() < 3)
9566 {
9567 return gl::error(GL_INVALID_OPERATION);
9568 }
9569 }
9570
9571 UNIMPLEMENTED();
9572 }
9573 catch(std::bad_alloc&)
9574 {
9575 return gl::error(GL_OUT_OF_MEMORY);
9576 }
9577}
9578
9579void __stdcall glInvalidateSubFramebuffer(GLenum target, GLsizei numAttachments, const GLenum* attachments, GLint x, GLint y, GLsizei width, GLsizei height)
9580{
9581 EVENT("(GLenum target = 0x%X, GLsizei numAttachments = %d, const GLenum* attachments = 0x%0.8p, GLint x = %d, "
9582 "GLint y = %d, GLsizei width = %d, GLsizei height = %d)",
9583 target, numAttachments, attachments, x, y, width, height);
9584
9585 try
9586 {
9587 gl::Context *context = gl::getNonLostContext();
9588
9589 if (context)
9590 {
9591 if (context->getClientVersion() < 3)
9592 {
9593 return gl::error(GL_INVALID_OPERATION);
9594 }
9595 }
9596
9597 UNIMPLEMENTED();
9598 }
9599 catch(std::bad_alloc&)
9600 {
9601 return gl::error(GL_OUT_OF_MEMORY);
9602 }
9603}
9604
9605void __stdcall glTexStorage2D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height)
9606{
9607 EVENT("(GLenum target = 0x%X, GLsizei levels = %d, GLenum internalformat = 0x%X, GLsizei width = %d, GLsizei height = %d)",
9608 target, levels, internalformat, width, height);
9609
9610 try
9611 {
9612 gl::Context *context = gl::getNonLostContext();
9613
9614 if (context)
9615 {
9616 if (context->getClientVersion() < 3)
9617 {
9618 return gl::error(GL_INVALID_OPERATION);
9619 }
9620 }
9621
9622 UNIMPLEMENTED();
9623 }
9624 catch(std::bad_alloc&)
9625 {
9626 return gl::error(GL_OUT_OF_MEMORY);
9627 }
9628}
9629
9630void __stdcall glTexStorage3D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth)
9631{
9632 EVENT("(GLenum target = 0x%X, GLsizei levels = %d, GLenum internalformat = 0x%X, GLsizei width = %d, "
9633 "GLsizei height = %d, GLsizei depth = %d)",
9634 target, levels, internalformat, width, height, depth);
9635
9636 try
9637 {
9638 gl::Context *context = gl::getNonLostContext();
9639
9640 if (context)
9641 {
9642 if (context->getClientVersion() < 3)
9643 {
9644 return gl::error(GL_INVALID_OPERATION);
9645 }
shannon.woods%transgaming.com@gtempaccount.com14eb55e2013-04-13 03:35:06 +00009646 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009647 }
9648 catch(std::bad_alloc&)
9649 {
9650 return gl::error(GL_OUT_OF_MEMORY);
9651 }
9652}
9653
9654void __stdcall glGetInternalformativ(GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize, GLint* params)
9655{
9656 EVENT("(GLenum target = 0x%X, GLenum internalformat = 0x%X, GLenum pname = 0x%X, GLsizei bufSize = %d, "
9657 "GLint* params = 0x%0.8p)",
9658 target, internalformat, pname, bufSize, params);
9659
9660 try
9661 {
9662 gl::Context *context = gl::getNonLostContext();
9663
9664 if (context)
9665 {
9666 if (context->getClientVersion() < 3)
9667 {
9668 return gl::error(GL_INVALID_OPERATION);
9669 }
9670 }
9671
9672 UNIMPLEMENTED();
9673 }
9674 catch(std::bad_alloc&)
9675 {
9676 return gl::error(GL_OUT_OF_MEMORY);
9677 }
9678}
9679
9680// Extension functions
9681
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +00009682void __stdcall glBlitFramebufferANGLE(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1,
9683 GLbitfield mask, GLenum filter)
9684{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00009685 EVENT("(GLint srcX0 = %d, GLint srcY0 = %d, GLint srcX1 = %d, GLint srcY1 = %d, "
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +00009686 "GLint dstX0 = %d, GLint dstY0 = %d, GLint dstX1 = %d, GLint dstY1 = %d, "
9687 "GLbitfield mask = 0x%X, GLenum filter = 0x%X)",
9688 srcX0, srcY0, srcX1, srcX1, dstX0, dstY0, dstX1, dstY1, mask, filter);
9689
9690 try
9691 {
9692 switch (filter)
9693 {
9694 case GL_NEAREST:
9695 break;
9696 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00009697 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +00009698 }
9699
9700 if ((mask & ~(GL_COLOR_BUFFER_BIT | GL_STENCIL_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)) != 0)
9701 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00009702 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +00009703 }
9704
9705 if (srcX1 - srcX0 != dstX1 - dstX0 || srcY1 - srcY0 != dstY1 - dstY0)
9706 {
9707 ERR("Scaling and flipping in BlitFramebufferANGLE not supported by this implementation");
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00009708 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +00009709 }
9710
daniel@transgaming.com9d788502011-11-09 17:46:55 +00009711 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +00009712
9713 if (context)
9714 {
9715 if (context->getReadFramebufferHandle() == context->getDrawFramebufferHandle())
9716 {
9717 ERR("Blits with the same source and destination framebuffer are not supported by this implementation.");
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00009718 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +00009719 }
9720
9721 context->blitFramebuffer(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask);
9722 }
9723 }
9724 catch(std::bad_alloc&)
9725 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00009726 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +00009727 }
9728}
9729
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00009730void __stdcall glTexImage3DOES(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth,
9731 GLint border, GLenum format, GLenum type, const GLvoid* pixels)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00009732{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00009733 EVENT("(GLenum target = 0x%X, GLint level = %d, GLenum internalformat = 0x%X, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00009734 "GLsizei width = %d, GLsizei height = %d, GLsizei depth = %d, GLint border = %d, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00009735 "GLenum format = 0x%X, GLenum type = 0x%x, const GLvoid* pixels = 0x%0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00009736 target, level, internalformat, width, height, depth, border, format, type, pixels);
9737
9738 try
9739 {
9740 UNIMPLEMENTED(); // FIXME
9741 }
9742 catch(std::bad_alloc&)
9743 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00009744 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00009745 }
9746}
daniel@transgaming.comce3d0f22010-05-04 03:35:14 +00009747
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00009748void __stdcall glGetProgramBinaryOES(GLuint program, GLsizei bufSize, GLsizei *length,
9749 GLenum *binaryFormat, void *binary)
9750{
apatrick@chromium.org90080e32012-07-09 22:15:33 +00009751 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 +00009752 program, bufSize, length, binaryFormat, binary);
9753
9754 try
9755 {
9756 gl::Context *context = gl::getNonLostContext();
9757
9758 if (context)
9759 {
9760 gl::Program *programObject = context->getProgram(program);
9761
daniel@transgaming.com716056c2012-07-24 18:38:59 +00009762 if (!programObject || !programObject->isLinked())
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00009763 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00009764 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00009765 }
9766
9767 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
9768
9769 if (!programBinary)
9770 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00009771 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00009772 }
9773
apatrick@chromium.org90080e32012-07-09 22:15:33 +00009774 if (!programBinary->save(binary, bufSize, length))
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00009775 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00009776 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00009777 }
apatrick@chromium.org90080e32012-07-09 22:15:33 +00009778
9779 *binaryFormat = GL_PROGRAM_BINARY_ANGLE;
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00009780 }
9781 }
9782 catch(std::bad_alloc&)
9783 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00009784 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00009785 }
9786}
9787
9788void __stdcall glProgramBinaryOES(GLuint program, GLenum binaryFormat,
9789 const void *binary, GLint length)
9790{
9791 EVENT("(GLenum program = 0x%X, binaryFormat = 0x%x, binary = 0x%0.8p, length = %d)",
9792 program, binaryFormat, binary, length);
9793
9794 try
9795 {
9796 gl::Context *context = gl::getNonLostContext();
9797
9798 if (context)
9799 {
9800 if (binaryFormat != GL_PROGRAM_BINARY_ANGLE)
9801 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00009802 return gl::error(GL_INVALID_ENUM);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00009803 }
9804
9805 gl::Program *programObject = context->getProgram(program);
9806
9807 if (!programObject)
9808 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00009809 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00009810 }
9811
daniel@transgaming.com95d29422012-07-24 18:36:10 +00009812 context->setProgramBinary(program, binary, length);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00009813 }
9814 }
9815 catch(std::bad_alloc&)
9816 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00009817 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00009818 }
9819}
9820
shannon.woods%transgaming.com@gtempaccount.com4059a382013-04-13 03:31:16 +00009821void __stdcall glDrawBuffersEXT(GLsizei n, const GLenum *bufs)
9822{
9823 EVENT("(GLenum n = %d, bufs = 0x%0.8p)", n, bufs);
9824
9825 try
9826 {
9827 gl::Context *context = gl::getNonLostContext();
9828
9829 if (context)
9830 {
9831 if (n < 0 || (unsigned int)n > context->getMaximumRenderTargets())
9832 {
9833 return gl::error(GL_INVALID_VALUE);
9834 }
9835
9836 if (context->getDrawFramebufferHandle() == 0)
9837 {
shannon.woods%transgaming.com@gtempaccount.com2fa73c52013-04-13 03:37:20 +00009838 if (n != 1)
shannon.woods%transgaming.com@gtempaccount.com4059a382013-04-13 03:31:16 +00009839 {
9840 return gl::error(GL_INVALID_OPERATION);
9841 }
9842
shannon.woods%transgaming.com@gtempaccount.com2fa73c52013-04-13 03:37:20 +00009843 if (bufs[0] != GL_NONE && bufs[0] != GL_BACK)
shannon.woods%transgaming.com@gtempaccount.com4059a382013-04-13 03:31:16 +00009844 {
shannon.woods%transgaming.com@gtempaccount.com2fa73c52013-04-13 03:37:20 +00009845 return gl::error(GL_INVALID_OPERATION);
shannon.woods%transgaming.com@gtempaccount.com4059a382013-04-13 03:31:16 +00009846 }
9847 }
9848 else
9849 {
9850 for (int colorAttachment = 0; colorAttachment < n; colorAttachment++)
9851 {
9852 const GLenum attachment = GL_COLOR_ATTACHMENT0_EXT + colorAttachment;
9853 if (bufs[colorAttachment] != GL_NONE && bufs[colorAttachment] != attachment)
9854 {
9855 return gl::error(GL_INVALID_OPERATION);
9856 }
9857 }
9858 }
9859
9860 gl::Framebuffer *framebuffer = context->getDrawFramebuffer();
9861
9862 for (int colorAttachment = 0; colorAttachment < n; colorAttachment++)
9863 {
9864 framebuffer->setDrawBufferState(colorAttachment, bufs[colorAttachment]);
9865 }
shannon.woods%transgaming.com@gtempaccount.com2fa73c52013-04-13 03:37:20 +00009866
9867 for (int colorAttachment = n; colorAttachment < (int)context->getMaximumRenderTargets(); colorAttachment++)
9868 {
9869 framebuffer->setDrawBufferState(colorAttachment, GL_NONE);
9870 }
shannon.woods%transgaming.com@gtempaccount.com4059a382013-04-13 03:31:16 +00009871 }
9872 }
9873 catch (std::bad_alloc&)
9874 {
9875 return gl::error(GL_OUT_OF_MEMORY);
9876 }
9877}
9878
daniel@transgaming.comce3d0f22010-05-04 03:35:14 +00009879__eglMustCastToProperFunctionPointerType __stdcall glGetProcAddress(const char *procname)
9880{
9881 struct Extension
9882 {
9883 const char *name;
9884 __eglMustCastToProperFunctionPointerType address;
9885 };
9886
9887 static const Extension glExtensions[] =
9888 {
9889 {"glTexImage3DOES", (__eglMustCastToProperFunctionPointerType)glTexImage3DOES},
daniel@transgaming.com01868132010-08-24 19:21:17 +00009890 {"glBlitFramebufferANGLE", (__eglMustCastToProperFunctionPointerType)glBlitFramebufferANGLE},
daniel@transgaming.com1fe96c92011-01-14 15:08:44 +00009891 {"glRenderbufferStorageMultisampleANGLE", (__eglMustCastToProperFunctionPointerType)glRenderbufferStorageMultisampleANGLE},
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00009892 {"glDeleteFencesNV", (__eglMustCastToProperFunctionPointerType)glDeleteFencesNV},
9893 {"glGenFencesNV", (__eglMustCastToProperFunctionPointerType)glGenFencesNV},
9894 {"glIsFenceNV", (__eglMustCastToProperFunctionPointerType)glIsFenceNV},
9895 {"glTestFenceNV", (__eglMustCastToProperFunctionPointerType)glTestFenceNV},
9896 {"glGetFenceivNV", (__eglMustCastToProperFunctionPointerType)glGetFenceivNV},
9897 {"glFinishFenceNV", (__eglMustCastToProperFunctionPointerType)glFinishFenceNV},
9898 {"glSetFenceNV", (__eglMustCastToProperFunctionPointerType)glSetFenceNV},
zmo@google.coma574f782011-10-03 21:45:23 +00009899 {"glGetTranslatedShaderSourceANGLE", (__eglMustCastToProperFunctionPointerType)glGetTranslatedShaderSourceANGLE},
daniel@transgaming.com0bd1f2f2011-11-11 04:19:03 +00009900 {"glTexStorage2DEXT", (__eglMustCastToProperFunctionPointerType)glTexStorage2DEXT},
daniel@transgaming.com709ed112011-11-12 03:18:10 +00009901 {"glGetGraphicsResetStatusEXT", (__eglMustCastToProperFunctionPointerType)glGetGraphicsResetStatusEXT},
9902 {"glReadnPixelsEXT", (__eglMustCastToProperFunctionPointerType)glReadnPixelsEXT},
9903 {"glGetnUniformfvEXT", (__eglMustCastToProperFunctionPointerType)glGetnUniformfvEXT},
9904 {"glGetnUniformivEXT", (__eglMustCastToProperFunctionPointerType)glGetnUniformivEXT},
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00009905 {"glGenQueriesEXT", (__eglMustCastToProperFunctionPointerType)glGenQueriesEXT},
9906 {"glDeleteQueriesEXT", (__eglMustCastToProperFunctionPointerType)glDeleteQueriesEXT},
9907 {"glIsQueryEXT", (__eglMustCastToProperFunctionPointerType)glIsQueryEXT},
9908 {"glBeginQueryEXT", (__eglMustCastToProperFunctionPointerType)glBeginQueryEXT},
9909 {"glEndQueryEXT", (__eglMustCastToProperFunctionPointerType)glEndQueryEXT},
9910 {"glGetQueryivEXT", (__eglMustCastToProperFunctionPointerType)glGetQueryivEXT},
9911 {"glGetQueryObjectuivEXT", (__eglMustCastToProperFunctionPointerType)glGetQueryObjectuivEXT},
shannon.woods%transgaming.com@gtempaccount.com77d94722013-04-13 03:34:22 +00009912 {"glDrawBuffersEXT", (__eglMustCastToProperFunctionPointerType)glDrawBuffersEXT},
daniel@transgaming.comdce02fd2012-01-27 15:39:51 +00009913 {"glVertexAttribDivisorANGLE", (__eglMustCastToProperFunctionPointerType)glVertexAttribDivisorANGLE},
9914 {"glDrawArraysInstancedANGLE", (__eglMustCastToProperFunctionPointerType)glDrawArraysInstancedANGLE},
9915 {"glDrawElementsInstancedANGLE", (__eglMustCastToProperFunctionPointerType)glDrawElementsInstancedANGLE},
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00009916 {"glGetProgramBinaryOES", (__eglMustCastToProperFunctionPointerType)glGetProgramBinaryOES},
9917 {"glProgramBinaryOES", (__eglMustCastToProperFunctionPointerType)glProgramBinaryOES}, };
daniel@transgaming.comce3d0f22010-05-04 03:35:14 +00009918
shannon.woods@transgaming.comd438fd42013-02-28 23:17:45 +00009919 for (unsigned int ext = 0; ext < ArraySize(glExtensions); ext++)
daniel@transgaming.comce3d0f22010-05-04 03:35:14 +00009920 {
9921 if (strcmp(procname, glExtensions[ext].name) == 0)
9922 {
9923 return (__eglMustCastToProperFunctionPointerType)glExtensions[ext].address;
9924 }
9925 }
9926
9927 return NULL;
9928}
9929
daniel@transgaming.com17f548c2011-11-09 17:47:02 +00009930// Non-public functions used by EGL
9931
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00009932bool __stdcall glBindTexImage(egl::Surface *surface)
jbauman@chromium.orgae345802011-03-30 22:04:25 +00009933{
9934 EVENT("(egl::Surface* surface = 0x%0.8p)",
9935 surface);
9936
9937 try
9938 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00009939 gl::Context *context = gl::getNonLostContext();
jbauman@chromium.orgae345802011-03-30 22:04:25 +00009940
9941 if (context)
9942 {
9943 gl::Texture2D *textureObject = context->getTexture2D();
9944
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00009945 if (textureObject->isImmutable())
9946 {
9947 return false;
9948 }
9949
jbauman@chromium.orgae345802011-03-30 22:04:25 +00009950 if (textureObject)
9951 {
9952 textureObject->bindTexImage(surface);
9953 }
9954 }
9955 }
9956 catch(std::bad_alloc&)
9957 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00009958 return gl::error(GL_OUT_OF_MEMORY, false);
jbauman@chromium.orgae345802011-03-30 22:04:25 +00009959 }
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00009960
9961 return true;
jbauman@chromium.orgae345802011-03-30 22:04:25 +00009962}
9963
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00009964}