blob: 7d3a3262845fcaba6819b7155b6b3e6e8a72d2f5 [file] [log] [blame]
shannon.woods@transgaming.combdf2d802013-02-28 23:16:20 +00001#include "precompiled.h"
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002//
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00003// Copyright (c) 2002-2012 The ANGLE Project Authors. All rights reserved.
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004// Use of this source code is governed by a BSD-style license that can be
5// found in the LICENSE file.
6//
7
8// libGLESv2.cpp: Implements the exported OpenGL ES 2.0 functions.
9
daniel@transgaming.coma0ce7e62011-01-25 14:47:16 +000010#include "common/version.h"
daniel@transgaming.combbf56f72010-04-20 18:52:13 +000011
12#include "libGLESv2/main.h"
daniel@transgaming.combbf56f72010-04-20 18:52:13 +000013#include "libGLESv2/utilities.h"
14#include "libGLESv2/Buffer.h"
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +000015#include "libGLESv2/Fence.h"
daniel@transgaming.combbf56f72010-04-20 18:52:13 +000016#include "libGLESv2/Framebuffer.h"
shannon.woods@transgaming.com486d9e92013-02-28 23:15:41 +000017#include "libGLESv2/Renderbuffer.h"
daniel@transgaming.combbf56f72010-04-20 18:52:13 +000018#include "libGLESv2/Program.h"
apatrick@chromium.orgea09f9b2012-06-08 00:45:32 +000019#include "libGLESv2/ProgramBinary.h"
daniel@transgaming.combbf56f72010-04-20 18:52:13 +000020#include "libGLESv2/Texture.h"
daniel@transgaming.com86bdb822012-01-20 18:24:39 +000021#include "libGLESv2/Query.h"
shannon.woods@transgaming.com486d9e92013-02-28 23:15:41 +000022#include "libGLESv2/Context.h"
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000023
daniel@transgaming.com4f9ef0d2011-05-30 23:51:19 +000024bool validImageSize(GLint level, GLsizei width, GLsizei height)
25{
26 if (level < 0 || width < 0 || height < 0)
27 {
28 return false;
29 }
30
31 if (gl::getContext() && gl::getContext()->supportsNonPower2Texture())
32 {
33 return true;
34 }
35
36 if (level == 0)
37 {
38 return true;
39 }
40
41 if (gl::isPow2(width) && gl::isPow2(height))
42 {
43 return true;
44 }
45
46 return false;
47}
48
daniel@transgaming.com8833dd22012-06-05 19:49:58 +000049// Verify that format/type are one of the combinations from table 3.4.
50bool checkTextureFormatType(GLenum format, GLenum type)
51{
52 // validate <format> by itself (used as secondary key below)
53 switch (format)
54 {
55 case GL_RGBA:
56 case GL_BGRA_EXT:
57 case GL_RGB:
58 case GL_ALPHA:
59 case GL_LUMINANCE:
60 case GL_LUMINANCE_ALPHA:
61 case GL_DEPTH_COMPONENT:
62 case GL_DEPTH_STENCIL_OES:
63 break;
64 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000065 return gl::error(GL_INVALID_ENUM, false);
daniel@transgaming.com8833dd22012-06-05 19:49:58 +000066 }
67
68 // invalid <type> -> sets INVALID_ENUM
69 // invalid <format>+<type> combination -> sets INVALID_OPERATION
70 switch (type)
71 {
72 case GL_UNSIGNED_BYTE:
73 switch (format)
74 {
75 case GL_RGBA:
76 case GL_BGRA_EXT:
77 case GL_RGB:
78 case GL_ALPHA:
79 case GL_LUMINANCE:
80 case GL_LUMINANCE_ALPHA:
81 return true;
82 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000083 return gl::error(GL_INVALID_OPERATION, false);
daniel@transgaming.com8833dd22012-06-05 19:49:58 +000084 }
85
86 case GL_FLOAT:
87 case GL_HALF_FLOAT_OES:
88 switch (format)
89 {
90 case GL_RGBA:
91 case GL_RGB:
92 case GL_ALPHA:
93 case GL_LUMINANCE:
94 case GL_LUMINANCE_ALPHA:
95 return true;
96 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000097 return gl::error(GL_INVALID_OPERATION, false);
daniel@transgaming.com8833dd22012-06-05 19:49:58 +000098 }
99
100 case GL_UNSIGNED_SHORT_4_4_4_4:
101 case GL_UNSIGNED_SHORT_5_5_5_1:
102 switch (format)
103 {
104 case GL_RGBA:
105 return true;
106 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000107 return gl::error(GL_INVALID_OPERATION, false);
daniel@transgaming.com8833dd22012-06-05 19:49:58 +0000108 }
109
110 case GL_UNSIGNED_SHORT_5_6_5:
111 switch (format)
112 {
113 case GL_RGB:
114 return true;
115 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000116 return gl::error(GL_INVALID_OPERATION, false);
daniel@transgaming.com8833dd22012-06-05 19:49:58 +0000117 }
118
119 case GL_UNSIGNED_SHORT:
120 case GL_UNSIGNED_INT:
121 switch (format)
122 {
123 case GL_DEPTH_COMPONENT:
124 return true;
125 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000126 return gl::error(GL_INVALID_OPERATION, false);
daniel@transgaming.com8833dd22012-06-05 19:49:58 +0000127 }
128
129 case GL_UNSIGNED_INT_24_8_OES:
130 switch (format)
131 {
132 case GL_DEPTH_STENCIL_OES:
133 return true;
134 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000135 return gl::error(GL_INVALID_OPERATION, false);
daniel@transgaming.com8833dd22012-06-05 19:49:58 +0000136 }
137
138 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000139 return gl::error(GL_INVALID_ENUM, false);
daniel@transgaming.com8833dd22012-06-05 19:49:58 +0000140 }
141}
daniel@transgaming.com6452adf2012-10-17 18:22:35 +0000142
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +0000143bool validateSubImageParams2D(bool compressed, GLsizei width, GLsizei height,
daniel@transgaming.com6452adf2012-10-17 18:22:35 +0000144 GLint xoffset, GLint yoffset, GLint level, GLenum format, GLenum type,
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +0000145 gl::Texture2D *texture)
daniel@transgaming.com343373a2011-11-29 19:42:32 +0000146{
147 if (!texture)
148 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000149 return gl::error(GL_INVALID_OPERATION, false);
daniel@transgaming.com343373a2011-11-29 19:42:32 +0000150 }
151
daniel@transgaming.com92f49922012-05-09 15:49:19 +0000152 if (compressed != texture->isCompressed(level))
daniel@transgaming.com343373a2011-11-29 19:42:32 +0000153 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000154 return gl::error(GL_INVALID_OPERATION, false);
daniel@transgaming.com343373a2011-11-29 19:42:32 +0000155 }
156
daniel@transgaming.com6452adf2012-10-17 18:22:35 +0000157 if (format != GL_NONE)
daniel@transgaming.com343373a2011-11-29 19:42:32 +0000158 {
daniel@transgaming.com6452adf2012-10-17 18:22:35 +0000159 GLenum internalformat = gl::ConvertSizedInternalFormat(format, type);
160 if (internalformat != texture->getInternalFormat(level))
161 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000162 return gl::error(GL_INVALID_OPERATION, false);
daniel@transgaming.com6452adf2012-10-17 18:22:35 +0000163 }
daniel@transgaming.com343373a2011-11-29 19:42:32 +0000164 }
165
166 if (compressed)
167 {
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +0000168 if ((width % 4 != 0 && width != texture->getWidth(0)) ||
169 (height % 4 != 0 && height != texture->getHeight(0)))
170 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000171 return gl::error(GL_INVALID_OPERATION, false);
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +0000172 }
173 }
174
175 if (xoffset + width > texture->getWidth(level) ||
176 yoffset + height > texture->getHeight(level))
177 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000178 return gl::error(GL_INVALID_VALUE, false);
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +0000179 }
180
181 return true;
182}
183
184bool validateSubImageParamsCube(bool compressed, GLsizei width, GLsizei height,
daniel@transgaming.com6452adf2012-10-17 18:22:35 +0000185 GLint xoffset, GLint yoffset, GLenum target, GLint level, GLenum format, GLenum type,
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +0000186 gl::TextureCubeMap *texture)
187{
188 if (!texture)
189 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000190 return gl::error(GL_INVALID_OPERATION, false);
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +0000191 }
192
daniel@transgaming.com4df88e82012-05-09 15:49:24 +0000193 if (compressed != texture->isCompressed(target, level))
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +0000194 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000195 return gl::error(GL_INVALID_OPERATION, false);
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +0000196 }
197
daniel@transgaming.com6452adf2012-10-17 18:22:35 +0000198 if (format != GL_NONE)
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +0000199 {
daniel@transgaming.com6452adf2012-10-17 18:22:35 +0000200 GLenum internalformat = gl::ConvertSizedInternalFormat(format, type);
201 if (internalformat != texture->getInternalFormat(target, level))
202 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000203 return gl::error(GL_INVALID_OPERATION, false);
daniel@transgaming.com6452adf2012-10-17 18:22:35 +0000204 }
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +0000205 }
206
207 if (compressed)
208 {
daniel@transgaming.com4df88e82012-05-09 15:49:24 +0000209 if ((width % 4 != 0 && width != texture->getWidth(target, 0)) ||
210 (height % 4 != 0 && height != texture->getHeight(target, 0)))
daniel@transgaming.com343373a2011-11-29 19:42:32 +0000211 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000212 return gl::error(GL_INVALID_OPERATION, false);
daniel@transgaming.com343373a2011-11-29 19:42:32 +0000213 }
214 }
215
daniel@transgaming.com4df88e82012-05-09 15:49:24 +0000216 if (xoffset + width > texture->getWidth(target, level) ||
217 yoffset + height > texture->getHeight(target, level))
daniel@transgaming.com343373a2011-11-29 19:42:32 +0000218 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000219 return gl::error(GL_INVALID_VALUE, false);
daniel@transgaming.com343373a2011-11-29 19:42:32 +0000220 }
221
222 return true;
223}
224
daniel@transgaming.comb7915a52011-11-12 03:14:20 +0000225// check for combinations of format and type that are valid for ReadPixels
226bool validReadFormatType(GLenum format, GLenum type)
227{
228 switch (format)
229 {
230 case GL_RGBA:
231 switch (type)
232 {
233 case GL_UNSIGNED_BYTE:
234 break;
235 default:
236 return false;
237 }
238 break;
239 case GL_BGRA_EXT:
240 switch (type)
241 {
242 case GL_UNSIGNED_BYTE:
243 case GL_UNSIGNED_SHORT_4_4_4_4_REV_EXT:
244 case GL_UNSIGNED_SHORT_1_5_5_5_REV_EXT:
245 break;
246 default:
247 return false;
248 }
249 break;
daniel@transgaming.comb7915a52011-11-12 03:14:20 +0000250 default:
251 return false;
252 }
253 return true;
254}
255
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000256extern "C"
257{
258
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +0000259// OpenGL ES 2.0 functions
260
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000261void __stdcall glActiveTexture(GLenum texture)
262{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000263 EVENT("(GLenum texture = 0x%X)", texture);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000264
265 try
266 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000267 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000268
269 if (context)
270 {
daniel@transgaming.com3f74c7a2011-05-11 15:36:51 +0000271 if (texture < GL_TEXTURE0 || texture > GL_TEXTURE0 + context->getMaximumCombinedTextureImageUnits() - 1)
272 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000273 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com3f74c7a2011-05-11 15:36:51 +0000274 }
275
daniel@transgaming.com428d1582010-05-04 03:35:25 +0000276 context->setActiveSampler(texture - GL_TEXTURE0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000277 }
278 }
279 catch(std::bad_alloc&)
280 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000281 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000282 }
283}
284
285void __stdcall glAttachShader(GLuint program, GLuint shader)
286{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000287 EVENT("(GLuint program = %d, GLuint shader = %d)", program, shader);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000288
289 try
290 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000291 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000292
293 if (context)
294 {
295 gl::Program *programObject = context->getProgram(program);
296 gl::Shader *shaderObject = context->getShader(shader);
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +0000297
daniel@transgaming.come9d6ed02010-04-13 03:26:23 +0000298 if (!programObject)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000299 {
daniel@transgaming.come9d6ed02010-04-13 03:26:23 +0000300 if (context->getShader(program))
301 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000302 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.come9d6ed02010-04-13 03:26:23 +0000303 }
304 else
305 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000306 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.come9d6ed02010-04-13 03:26:23 +0000307 }
308 }
309
310 if (!shaderObject)
311 {
312 if (context->getProgram(shader))
313 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000314 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.come9d6ed02010-04-13 03:26:23 +0000315 }
316 else
317 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000318 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.come9d6ed02010-04-13 03:26:23 +0000319 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000320 }
321
322 if (!programObject->attachShader(shaderObject))
323 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000324 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000325 }
326 }
327 }
328 catch(std::bad_alloc&)
329 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000330 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000331 }
332}
333
daniel@transgaming.com86bdb822012-01-20 18:24:39 +0000334void __stdcall glBeginQueryEXT(GLenum target, GLuint id)
335{
336 EVENT("(GLenum target = 0x%X, GLuint %d)", target, id);
337
338 try
339 {
340 switch (target)
341 {
342 case GL_ANY_SAMPLES_PASSED_EXT:
343 case GL_ANY_SAMPLES_PASSED_CONSERVATIVE_EXT:
344 break;
345 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000346 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +0000347 }
348
349 if (id == 0)
350 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000351 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +0000352 }
353
354 gl::Context *context = gl::getNonLostContext();
355
356 if (context)
357 {
358 context->beginQuery(target, id);
359 }
360 }
361 catch(std::bad_alloc&)
362 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000363 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +0000364 }
365}
366
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +0000367void __stdcall glBindAttribLocation(GLuint program, GLuint index, const GLchar* name)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000368{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000369 EVENT("(GLuint program = %d, GLuint index = %d, const GLchar* name = 0x%0.8p)", program, index, name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000370
371 try
372 {
373 if (index >= gl::MAX_VERTEX_ATTRIBS)
374 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000375 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000376 }
377
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000378 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000379
380 if (context)
381 {
382 gl::Program *programObject = context->getProgram(program);
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +0000383
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000384 if (!programObject)
385 {
daniel@transgaming.com98079832010-04-13 03:26:29 +0000386 if (context->getShader(program))
387 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000388 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com98079832010-04-13 03:26:29 +0000389 }
390 else
391 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000392 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com98079832010-04-13 03:26:29 +0000393 }
394 }
395
396 if (strncmp(name, "gl_", 3) == 0)
397 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000398 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000399 }
400
401 programObject->bindAttributeLocation(index, name);
402 }
403 }
404 catch(std::bad_alloc&)
405 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000406 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000407 }
408}
409
410void __stdcall glBindBuffer(GLenum target, GLuint buffer)
411{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000412 EVENT("(GLenum target = 0x%X, GLuint buffer = %d)", target, buffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000413
414 try
415 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000416 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000417
418 if (context)
419 {
420 switch (target)
421 {
422 case GL_ARRAY_BUFFER:
423 context->bindArrayBuffer(buffer);
424 return;
425 case GL_ELEMENT_ARRAY_BUFFER:
426 context->bindElementArrayBuffer(buffer);
427 return;
428 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000429 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000430 }
431 }
432 }
433 catch(std::bad_alloc&)
434 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000435 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000436 }
437}
438
439void __stdcall glBindFramebuffer(GLenum target, GLuint framebuffer)
440{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000441 EVENT("(GLenum target = 0x%X, GLuint framebuffer = %d)", target, framebuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000442
443 try
444 {
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +0000445 if (target != GL_FRAMEBUFFER && target != GL_DRAW_FRAMEBUFFER_ANGLE && target != GL_READ_FRAMEBUFFER_ANGLE)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000446 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000447 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000448 }
449
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000450 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000451
452 if (context)
453 {
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +0000454 if (target == GL_READ_FRAMEBUFFER_ANGLE || target == GL_FRAMEBUFFER)
455 {
456 context->bindReadFramebuffer(framebuffer);
457 }
458
459 if (target == GL_DRAW_FRAMEBUFFER_ANGLE || target == GL_FRAMEBUFFER)
460 {
461 context->bindDrawFramebuffer(framebuffer);
462 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000463 }
464 }
465 catch(std::bad_alloc&)
466 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000467 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000468 }
469}
470
471void __stdcall glBindRenderbuffer(GLenum target, GLuint renderbuffer)
472{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000473 EVENT("(GLenum target = 0x%X, GLuint renderbuffer = %d)", target, renderbuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000474
475 try
476 {
477 if (target != GL_RENDERBUFFER)
478 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000479 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000480 }
481
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000482 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000483
484 if (context)
485 {
486 context->bindRenderbuffer(renderbuffer);
487 }
488 }
489 catch(std::bad_alloc&)
490 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000491 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000492 }
493}
494
495void __stdcall glBindTexture(GLenum target, GLuint texture)
496{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000497 EVENT("(GLenum target = 0x%X, GLuint texture = %d)", target, texture);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000498
499 try
500 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000501 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000502
503 if (context)
504 {
505 gl::Texture *textureObject = context->getTexture(texture);
506
507 if (textureObject && textureObject->getTarget() != target && texture != 0)
508 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000509 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000510 }
511
512 switch (target)
513 {
514 case GL_TEXTURE_2D:
515 context->bindTexture2D(texture);
516 return;
517 case GL_TEXTURE_CUBE_MAP:
518 context->bindTextureCubeMap(texture);
519 return;
520 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000521 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000522 }
523 }
524 }
525 catch(std::bad_alloc&)
526 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000527 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000528 }
529}
530
531void __stdcall glBlendColor(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha)
532{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000533 EVENT("(GLclampf red = %f, GLclampf green = %f, GLclampf blue = %f, GLclampf alpha = %f)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +0000534 red, green, blue, alpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000535
536 try
537 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000538 gl::Context* context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000539
540 if (context)
541 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +0000542 context->setBlendColor(gl::clamp01(red), gl::clamp01(green), gl::clamp01(blue), gl::clamp01(alpha));
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000543 }
544 }
545 catch(std::bad_alloc&)
546 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000547 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000548 }
549}
550
551void __stdcall glBlendEquation(GLenum mode)
552{
553 glBlendEquationSeparate(mode, mode);
554}
555
556void __stdcall glBlendEquationSeparate(GLenum modeRGB, GLenum modeAlpha)
557{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000558 EVENT("(GLenum modeRGB = 0x%X, GLenum modeAlpha = 0x%X)", modeRGB, modeAlpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000559
560 try
561 {
562 switch (modeRGB)
563 {
564 case GL_FUNC_ADD:
565 case GL_FUNC_SUBTRACT:
566 case GL_FUNC_REVERSE_SUBTRACT:
567 break;
568 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000569 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000570 }
571
572 switch (modeAlpha)
573 {
574 case GL_FUNC_ADD:
575 case GL_FUNC_SUBTRACT:
576 case GL_FUNC_REVERSE_SUBTRACT:
577 break;
578 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000579 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000580 }
581
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000582 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000583
584 if (context)
585 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +0000586 context->setBlendEquation(modeRGB, modeAlpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000587 }
588 }
589 catch(std::bad_alloc&)
590 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000591 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000592 }
593}
594
595void __stdcall glBlendFunc(GLenum sfactor, GLenum dfactor)
596{
597 glBlendFuncSeparate(sfactor, dfactor, sfactor, dfactor);
598}
599
600void __stdcall glBlendFuncSeparate(GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha)
601{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000602 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 +0000603 srcRGB, dstRGB, srcAlpha, dstAlpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000604
605 try
606 {
607 switch (srcRGB)
608 {
609 case GL_ZERO:
610 case GL_ONE:
611 case GL_SRC_COLOR:
612 case GL_ONE_MINUS_SRC_COLOR:
613 case GL_DST_COLOR:
614 case GL_ONE_MINUS_DST_COLOR:
615 case GL_SRC_ALPHA:
616 case GL_ONE_MINUS_SRC_ALPHA:
617 case GL_DST_ALPHA:
618 case GL_ONE_MINUS_DST_ALPHA:
619 case GL_CONSTANT_COLOR:
620 case GL_ONE_MINUS_CONSTANT_COLOR:
621 case GL_CONSTANT_ALPHA:
622 case GL_ONE_MINUS_CONSTANT_ALPHA:
623 case GL_SRC_ALPHA_SATURATE:
624 break;
625 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000626 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000627 }
628
629 switch (dstRGB)
630 {
631 case GL_ZERO:
632 case GL_ONE:
633 case GL_SRC_COLOR:
634 case GL_ONE_MINUS_SRC_COLOR:
635 case GL_DST_COLOR:
636 case GL_ONE_MINUS_DST_COLOR:
637 case GL_SRC_ALPHA:
638 case GL_ONE_MINUS_SRC_ALPHA:
639 case GL_DST_ALPHA:
640 case GL_ONE_MINUS_DST_ALPHA:
641 case GL_CONSTANT_COLOR:
642 case GL_ONE_MINUS_CONSTANT_COLOR:
643 case GL_CONSTANT_ALPHA:
644 case GL_ONE_MINUS_CONSTANT_ALPHA:
645 break;
646 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000647 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000648 }
649
650 switch (srcAlpha)
651 {
652 case GL_ZERO:
653 case GL_ONE:
654 case GL_SRC_COLOR:
655 case GL_ONE_MINUS_SRC_COLOR:
656 case GL_DST_COLOR:
657 case GL_ONE_MINUS_DST_COLOR:
658 case GL_SRC_ALPHA:
659 case GL_ONE_MINUS_SRC_ALPHA:
660 case GL_DST_ALPHA:
661 case GL_ONE_MINUS_DST_ALPHA:
662 case GL_CONSTANT_COLOR:
663 case GL_ONE_MINUS_CONSTANT_COLOR:
664 case GL_CONSTANT_ALPHA:
665 case GL_ONE_MINUS_CONSTANT_ALPHA:
666 case GL_SRC_ALPHA_SATURATE:
667 break;
668 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000669 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000670 }
671
672 switch (dstAlpha)
673 {
674 case GL_ZERO:
675 case GL_ONE:
676 case GL_SRC_COLOR:
677 case GL_ONE_MINUS_SRC_COLOR:
678 case GL_DST_COLOR:
679 case GL_ONE_MINUS_DST_COLOR:
680 case GL_SRC_ALPHA:
681 case GL_ONE_MINUS_SRC_ALPHA:
682 case GL_DST_ALPHA:
683 case GL_ONE_MINUS_DST_ALPHA:
684 case GL_CONSTANT_COLOR:
685 case GL_ONE_MINUS_CONSTANT_COLOR:
686 case GL_CONSTANT_ALPHA:
687 case GL_ONE_MINUS_CONSTANT_ALPHA:
688 break;
689 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000690 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000691 }
692
daniel@transgaming.comfe453652010-03-16 06:23:28 +0000693 bool constantColorUsed = (srcRGB == GL_CONSTANT_COLOR || srcRGB == GL_ONE_MINUS_CONSTANT_COLOR ||
694 dstRGB == GL_CONSTANT_COLOR || dstRGB == GL_ONE_MINUS_CONSTANT_COLOR);
695
696 bool constantAlphaUsed = (srcRGB == GL_CONSTANT_ALPHA || srcRGB == GL_ONE_MINUS_CONSTANT_ALPHA ||
697 dstRGB == GL_CONSTANT_ALPHA || dstRGB == GL_ONE_MINUS_CONSTANT_ALPHA);
698
699 if (constantColorUsed && constantAlphaUsed)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000700 {
daniel@transgaming.comfe453652010-03-16 06:23:28 +0000701 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 +0000702 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000703 }
704
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000705 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000706
707 if (context)
708 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +0000709 context->setBlendFactors(srcRGB, dstRGB, srcAlpha, dstAlpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000710 }
711 }
712 catch(std::bad_alloc&)
713 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000714 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000715 }
716}
717
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +0000718void __stdcall glBufferData(GLenum target, GLsizeiptr size, const GLvoid* data, GLenum usage)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000719{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000720 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 +0000721 target, size, data, usage);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000722
723 try
724 {
725 if (size < 0)
726 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000727 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000728 }
729
shannon.woods%transgaming.com@gtempaccount.comf2db40b2013-04-13 03:37:09 +0000730 gl::Context *context = gl::getNonLostContext();
731
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000732 switch (usage)
733 {
734 case GL_STREAM_DRAW:
735 case GL_STATIC_DRAW:
736 case GL_DYNAMIC_DRAW:
737 break;
shannon.woods%transgaming.com@gtempaccount.comf2db40b2013-04-13 03:37:09 +0000738
739 case GL_STREAM_READ:
740 case GL_STREAM_COPY:
741 case GL_STATIC_READ:
742 case GL_STATIC_COPY:
743 case GL_DYNAMIC_READ:
744 case GL_DYNAMIC_COPY:
745 if (context && context->getClientVersion() < 3)
746 {
747 return gl::error(GL_INVALID_ENUM);
748 }
749 break;
750
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000751 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000752 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000753 }
754
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000755 if (context)
756 {
757 gl::Buffer *buffer;
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +0000758
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000759 switch (target)
760 {
761 case GL_ARRAY_BUFFER:
762 buffer = context->getArrayBuffer();
763 break;
764 case GL_ELEMENT_ARRAY_BUFFER:
765 buffer = context->getElementArrayBuffer();
766 break;
767 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000768 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000769 }
770
771 if (!buffer)
772 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000773 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000774 }
775
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +0000776 buffer->bufferData(data, size, usage);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000777 }
778 }
779 catch(std::bad_alloc&)
780 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000781 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000782 }
783}
784
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +0000785void __stdcall glBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid* data)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000786{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000787 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 +0000788 target, offset, size, data);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000789
790 try
791 {
daniel@transgaming.comdefa1c32010-05-18 18:51:45 +0000792 if (size < 0 || offset < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000793 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000794 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000795 }
796
daniel@transgaming.comd4620a32010-03-21 04:31:28 +0000797 if (data == NULL)
798 {
799 return;
800 }
801
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000802 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +0000803
804 if (context)
805 {
806 gl::Buffer *buffer;
807
808 switch (target)
809 {
810 case GL_ARRAY_BUFFER:
811 buffer = context->getArrayBuffer();
812 break;
813 case GL_ELEMENT_ARRAY_BUFFER:
814 buffer = context->getElementArrayBuffer();
815 break;
816 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000817 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +0000818 }
819
820 if (!buffer)
821 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000822 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +0000823 }
824
daniel@transgaming.comdefa1c32010-05-18 18:51:45 +0000825 if ((size_t)size + offset > buffer->size())
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +0000826 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000827 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +0000828 }
daniel@transgaming.comdefa1c32010-05-18 18:51:45 +0000829
830 buffer->bufferSubData(data, size, offset);
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +0000831 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000832 }
833 catch(std::bad_alloc&)
834 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000835 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000836 }
837}
838
839GLenum __stdcall glCheckFramebufferStatus(GLenum target)
840{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000841 EVENT("(GLenum target = 0x%X)", target);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000842
843 try
844 {
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +0000845 if (target != GL_FRAMEBUFFER && target != GL_DRAW_FRAMEBUFFER_ANGLE && target != GL_READ_FRAMEBUFFER_ANGLE)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000846 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000847 return gl::error(GL_INVALID_ENUM, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000848 }
849
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000850 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000851
852 if (context)
853 {
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +0000854 gl::Framebuffer *framebuffer = NULL;
855 if (target == GL_READ_FRAMEBUFFER_ANGLE)
856 {
857 framebuffer = context->getReadFramebuffer();
858 }
859 else
860 {
861 framebuffer = context->getDrawFramebuffer();
862 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000863
864 return framebuffer->completeness();
865 }
866 }
867 catch(std::bad_alloc&)
868 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000869 return gl::error(GL_OUT_OF_MEMORY, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000870 }
871
872 return 0;
873}
874
875void __stdcall glClear(GLbitfield mask)
876{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +0000877 EVENT("(GLbitfield mask = 0x%X)", mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000878
879 try
880 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000881 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000882
883 if (context)
884 {
885 context->clear(mask);
886 }
887 }
888 catch(std::bad_alloc&)
889 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000890 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000891 }
892}
893
894void __stdcall glClearColor(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha)
895{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000896 EVENT("(GLclampf red = %f, GLclampf green = %f, GLclampf blue = %f, GLclampf alpha = %f)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +0000897 red, green, blue, alpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000898
899 try
900 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000901 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000902
903 if (context)
904 {
905 context->setClearColor(red, green, blue, alpha);
906 }
907 }
908 catch(std::bad_alloc&)
909 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000910 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000911 }
912}
913
914void __stdcall glClearDepthf(GLclampf depth)
915{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000916 EVENT("(GLclampf depth = %f)", depth);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000917
918 try
919 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000920 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000921
922 if (context)
923 {
924 context->setClearDepth(depth);
925 }
926 }
927 catch(std::bad_alloc&)
928 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000929 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000930 }
931}
932
933void __stdcall glClearStencil(GLint s)
934{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000935 EVENT("(GLint s = %d)", s);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000936
937 try
938 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000939 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000940
941 if (context)
942 {
943 context->setClearStencil(s);
944 }
945 }
946 catch(std::bad_alloc&)
947 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000948 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000949 }
950}
951
952void __stdcall glColorMask(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha)
953{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +0000954 EVENT("(GLboolean red = %d, GLboolean green = %u, GLboolean blue = %u, GLboolean alpha = %u)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +0000955 red, green, blue, alpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000956
957 try
958 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000959 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000960
961 if (context)
962 {
daniel@transgaming.coma36f98e2010-05-18 18:51:09 +0000963 context->setColorMask(red == GL_TRUE, green == GL_TRUE, blue == GL_TRUE, alpha == GL_TRUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000964 }
965 }
966 catch(std::bad_alloc&)
967 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000968 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000969 }
970}
971
972void __stdcall glCompileShader(GLuint shader)
973{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000974 EVENT("(GLuint shader = %d)", shader);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000975
976 try
977 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000978 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000979
980 if (context)
981 {
982 gl::Shader *shaderObject = context->getShader(shader);
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +0000983
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000984 if (!shaderObject)
985 {
daniel@transgaming.com0cefaf42010-04-13 03:26:36 +0000986 if (context->getProgram(shader))
987 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000988 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com0cefaf42010-04-13 03:26:36 +0000989 }
990 else
991 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000992 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com0cefaf42010-04-13 03:26:36 +0000993 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000994 }
995
996 shaderObject->compile();
997 }
998 }
999 catch(std::bad_alloc&)
1000 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001001 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001002 }
1003}
1004
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00001005void __stdcall glCompressedTexImage2D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height,
1006 GLint border, GLsizei imageSize, const GLvoid* data)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001007{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001008 EVENT("(GLenum target = 0x%X, GLint level = %d, GLenum internalformat = 0x%X, GLsizei width = %d, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00001009 "GLsizei height = %d, GLint border = %d, GLsizei imageSize = %d, const GLvoid* data = 0x%0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001010 target, level, internalformat, width, height, border, imageSize, data);
1011
1012 try
1013 {
daniel@transgaming.com4f9ef0d2011-05-30 23:51:19 +00001014 if (!validImageSize(level, width, height) || border != 0 || imageSize < 0)
daniel@transgaming.com41430492010-03-11 20:36:18 +00001015 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001016 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com41430492010-03-11 20:36:18 +00001017 }
1018
daniel@transgaming.com01868132010-08-24 19:21:17 +00001019 switch (internalformat)
1020 {
1021 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
1022 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
gman@chromium.org50c526d2011-08-10 05:19:44 +00001023 case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
1024 case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
daniel@transgaming.com01868132010-08-24 19:21:17 +00001025 break;
1026 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001027 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com01868132010-08-24 19:21:17 +00001028 }
1029
1030 if (border != 0)
1031 {
shannon.woods@transgaming.com0efef902013-02-28 23:21:09 +00001032 return gl::error(GL_INVALID_OPERATION);
1033 }
1034
1035 if (width != 1 && width != 2 && width % 4 != 0)
1036 {
1037 return gl::error(GL_INVALID_OPERATION);
1038 }
1039
1040 if (height != 1 && height != 2 && height % 4 != 0)
1041 {
1042 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com01868132010-08-24 19:21:17 +00001043 }
1044
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001045 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com01868132010-08-24 19:21:17 +00001046
1047 if (context)
1048 {
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001049 if (level > context->getMaximumTextureLevel())
1050 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001051 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001052 }
1053
1054 switch (target)
1055 {
1056 case GL_TEXTURE_2D:
1057 if (width > (context->getMaximumTextureDimension() >> level) ||
1058 height > (context->getMaximumTextureDimension() >> level))
1059 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001060 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001061 }
1062 break;
1063 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
1064 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
1065 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
1066 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
1067 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
1068 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
1069 if (width != height)
1070 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001071 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001072 }
1073
1074 if (width > (context->getMaximumCubeTextureDimension() >> level) ||
1075 height > (context->getMaximumCubeTextureDimension() >> level))
1076 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001077 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001078 }
1079 break;
1080 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001081 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001082 }
1083
gman@chromium.org50c526d2011-08-10 05:19:44 +00001084 switch (internalformat) {
1085 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
1086 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
1087 if (!context->supportsDXT1Textures())
1088 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001089 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 +00001090 }
1091 break;
1092 case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
1093 if (!context->supportsDXT3Textures())
1094 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001095 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 +00001096 }
1097 break;
1098 case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
1099 if (!context->supportsDXT5Textures())
1100 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001101 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 +00001102 }
1103 break;
1104 default: UNREACHABLE();
daniel@transgaming.com01868132010-08-24 19:21:17 +00001105 }
1106
1107 if (imageSize != gl::ComputeCompressedSize(width, height, internalformat))
1108 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001109 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com01868132010-08-24 19:21:17 +00001110 }
1111
1112 if (target == GL_TEXTURE_2D)
1113 {
1114 gl::Texture2D *texture = context->getTexture2D();
1115
1116 if (!texture)
1117 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001118 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com01868132010-08-24 19:21:17 +00001119 }
1120
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00001121 if (texture->isImmutable())
1122 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001123 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00001124 }
1125
daniel@transgaming.com01868132010-08-24 19:21:17 +00001126 texture->setCompressedImage(level, internalformat, width, height, imageSize, data);
1127 }
1128 else
1129 {
1130 gl::TextureCubeMap *texture = context->getTextureCubeMap();
1131
1132 if (!texture)
1133 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001134 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com01868132010-08-24 19:21:17 +00001135 }
1136
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00001137 if (texture->isImmutable())
1138 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001139 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00001140 }
1141
daniel@transgaming.com01868132010-08-24 19:21:17 +00001142 switch (target)
1143 {
1144 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
1145 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
1146 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
1147 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
1148 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
1149 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
1150 texture->setCompressedImage(target, level, internalformat, width, height, imageSize, data);
1151 break;
1152 default: UNREACHABLE();
1153 }
1154 }
1155 }
1156
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001157 }
1158 catch(std::bad_alloc&)
1159 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001160 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001161 }
1162}
1163
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00001164void __stdcall glCompressedTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height,
1165 GLenum format, GLsizei imageSize, const GLvoid* data)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001166{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001167 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001168 "GLsizei width = %d, GLsizei height = %d, GLenum format = 0x%X, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00001169 "GLsizei imageSize = %d, const GLvoid* data = 0x%0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001170 target, level, xoffset, yoffset, width, height, format, imageSize, data);
1171
1172 try
1173 {
apatrick@chromium.org551022e2012-01-23 19:56:54 +00001174 if (!gl::IsInternalTextureTarget(target))
daniel@transgaming.com41430492010-03-11 20:36:18 +00001175 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001176 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com41430492010-03-11 20:36:18 +00001177 }
1178
daniel@transgaming.com4f9ef0d2011-05-30 23:51:19 +00001179 if (xoffset < 0 || yoffset < 0 || !validImageSize(level, width, height) || imageSize < 0)
daniel@transgaming.com41430492010-03-11 20:36:18 +00001180 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001181 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com41430492010-03-11 20:36:18 +00001182 }
1183
daniel@transgaming.com01868132010-08-24 19:21:17 +00001184 switch (format)
daniel@transgaming.com41430492010-03-11 20:36:18 +00001185 {
daniel@transgaming.com01868132010-08-24 19:21:17 +00001186 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
1187 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
gman@chromium.org50c526d2011-08-10 05:19:44 +00001188 case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
1189 case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
daniel@transgaming.com01868132010-08-24 19:21:17 +00001190 break;
1191 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001192 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com41430492010-03-11 20:36:18 +00001193 }
1194
daniel@transgaming.com01868132010-08-24 19:21:17 +00001195 if (width == 0 || height == 0 || data == NULL)
1196 {
1197 return;
1198 }
1199
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001200 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com01868132010-08-24 19:21:17 +00001201
1202 if (context)
1203 {
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001204 if (level > context->getMaximumTextureLevel())
1205 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001206 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001207 }
1208
gman@chromium.org50c526d2011-08-10 05:19:44 +00001209 switch (format) {
1210 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
1211 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
1212 if (!context->supportsDXT1Textures())
1213 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001214 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 +00001215 }
1216 break;
1217 case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
1218 if (!context->supportsDXT3Textures())
1219 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001220 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 +00001221 }
1222 break;
1223 case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
1224 if (!context->supportsDXT5Textures())
1225 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001226 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 +00001227 }
1228 break;
1229 default: UNREACHABLE();
daniel@transgaming.com01868132010-08-24 19:21:17 +00001230 }
1231
1232 if (imageSize != gl::ComputeCompressedSize(width, height, format))
1233 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001234 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com01868132010-08-24 19:21:17 +00001235 }
1236
1237 if (xoffset % 4 != 0 || yoffset % 4 != 0)
1238 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001239 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 +00001240 // does not exist unless DXT textures are supported.
daniel@transgaming.com01868132010-08-24 19:21:17 +00001241 }
1242
1243 if (target == GL_TEXTURE_2D)
1244 {
1245 gl::Texture2D *texture = context->getTexture2D();
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00001246 if (validateSubImageParams2D(true, width, height, xoffset, yoffset, level, format, GL_NONE, texture))
daniel@transgaming.com01868132010-08-24 19:21:17 +00001247 {
daniel@transgaming.com343373a2011-11-29 19:42:32 +00001248 texture->subImageCompressed(level, xoffset, yoffset, width, height, format, imageSize, data);
daniel@transgaming.com01868132010-08-24 19:21:17 +00001249 }
daniel@transgaming.com01868132010-08-24 19:21:17 +00001250 }
1251 else if (gl::IsCubemapTextureTarget(target))
1252 {
1253 gl::TextureCubeMap *texture = context->getTextureCubeMap();
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00001254 if (validateSubImageParamsCube(true, width, height, xoffset, yoffset, target, level, format, GL_NONE, texture))
daniel@transgaming.com01868132010-08-24 19:21:17 +00001255 {
daniel@transgaming.com343373a2011-11-29 19:42:32 +00001256 texture->subImageCompressed(target, level, xoffset, yoffset, width, height, format, imageSize, data);
daniel@transgaming.com01868132010-08-24 19:21:17 +00001257 }
daniel@transgaming.com01868132010-08-24 19:21:17 +00001258 }
1259 else
1260 {
1261 UNREACHABLE();
1262 }
1263 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001264 }
1265 catch(std::bad_alloc&)
1266 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001267 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001268 }
1269}
1270
1271void __stdcall glCopyTexImage2D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border)
1272{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001273 EVENT("(GLenum target = 0x%X, GLint level = %d, GLenum internalformat = 0x%X, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001274 "GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d, GLint border = %d)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001275 target, level, internalformat, x, y, width, height, border);
1276
1277 try
1278 {
daniel@transgaming.com4f9ef0d2011-05-30 23:51:19 +00001279 if (!validImageSize(level, width, height))
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001280 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001281 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001282 }
1283
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001284 if (border != 0)
1285 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001286 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001287 }
1288
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001289 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001290
1291 if (context)
1292 {
daniel@transgaming.com32b11442011-11-19 02:42:48 +00001293 if (level > context->getMaximumTextureLevel())
1294 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001295 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com32b11442011-11-19 02:42:48 +00001296 }
1297
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001298 switch (target)
1299 {
1300 case GL_TEXTURE_2D:
1301 if (width > (context->getMaximumTextureDimension() >> level) ||
1302 height > (context->getMaximumTextureDimension() >> level))
1303 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001304 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001305 }
1306 break;
1307 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
1308 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
1309 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
1310 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
1311 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
1312 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
1313 if (width != height)
1314 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001315 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001316 }
1317
1318 if (width > (context->getMaximumCubeTextureDimension() >> level) ||
1319 height > (context->getMaximumCubeTextureDimension() >> level))
1320 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001321 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001322 }
1323 break;
1324 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001325 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001326 }
1327
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00001328 gl::Framebuffer *framebuffer = context->getReadFramebuffer();
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001329
daniel@transgaming.combbc57792010-07-28 19:21:05 +00001330 if (framebuffer->completeness() != GL_FRAMEBUFFER_COMPLETE)
1331 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001332 return gl::error(GL_INVALID_FRAMEBUFFER_OPERATION);
daniel@transgaming.combbc57792010-07-28 19:21:05 +00001333 }
1334
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00001335 if (context->getReadFramebufferHandle() != 0 && framebuffer->getSamples() != 0)
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00001336 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001337 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00001338 }
1339
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00001340 gl::Renderbuffer *source = framebuffer->getReadColorbuffer();
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +00001341 GLenum colorbufferFormat = source->getInternalFormat();
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001342
1343 // [OpenGL ES 2.0.24] table 3.9
1344 switch (internalformat)
1345 {
1346 case GL_ALPHA:
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00001347 if (colorbufferFormat != GL_ALPHA8_EXT &&
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001348 colorbufferFormat != GL_RGBA4 &&
1349 colorbufferFormat != GL_RGB5_A1 &&
shannon.woods@transgaming.com28e7ba02013-02-28 23:09:28 +00001350 colorbufferFormat != GL_BGRA8_EXT &&
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001351 colorbufferFormat != GL_RGBA8_OES)
1352 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001353 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001354 }
1355 break;
1356 case GL_LUMINANCE:
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00001357 case GL_RGB:
1358 if (colorbufferFormat != GL_RGB565 &&
1359 colorbufferFormat != GL_RGB8_OES &&
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001360 colorbufferFormat != GL_RGBA4 &&
1361 colorbufferFormat != GL_RGB5_A1 &&
shannon.woods@transgaming.com28e7ba02013-02-28 23:09:28 +00001362 colorbufferFormat != GL_BGRA8_EXT &&
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001363 colorbufferFormat != GL_RGBA8_OES)
1364 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001365 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001366 }
1367 break;
1368 case GL_LUMINANCE_ALPHA:
1369 case GL_RGBA:
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00001370 if (colorbufferFormat != GL_RGBA4 &&
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001371 colorbufferFormat != GL_RGB5_A1 &&
shannon.woods@transgaming.com28e7ba02013-02-28 23:09:28 +00001372 colorbufferFormat != GL_BGRA8_EXT &&
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001373 colorbufferFormat != GL_RGBA8_OES)
1374 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001375 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001376 }
1377 break;
1378 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
1379 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
gman@chromium.org50c526d2011-08-10 05:19:44 +00001380 if (context->supportsDXT1Textures())
1381 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001382 return gl::error(GL_INVALID_OPERATION);
gman@chromium.org50c526d2011-08-10 05:19:44 +00001383 }
1384 else
1385 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001386 return gl::error(GL_INVALID_ENUM);
gman@chromium.org50c526d2011-08-10 05:19:44 +00001387 }
1388 break;
1389 case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
1390 if (context->supportsDXT3Textures())
1391 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001392 return gl::error(GL_INVALID_OPERATION);
gman@chromium.org50c526d2011-08-10 05:19:44 +00001393 }
1394 else
1395 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001396 return gl::error(GL_INVALID_ENUM);
gman@chromium.org50c526d2011-08-10 05:19:44 +00001397 }
1398 break;
1399 case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
1400 if (context->supportsDXT5Textures())
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001401 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001402 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001403 }
1404 else
1405 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001406 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001407 }
1408 break;
daniel@transgaming.com0c854682012-05-31 01:14:11 +00001409 case GL_DEPTH_COMPONENT:
1410 case GL_DEPTH_COMPONENT16:
1411 case GL_DEPTH_COMPONENT32_OES:
1412 case GL_DEPTH_STENCIL_OES:
1413 case GL_DEPTH24_STENCIL8_OES:
1414 if (context->supportsDepthTextures())
1415 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001416 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com0c854682012-05-31 01:14:11 +00001417 }
1418 else
1419 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001420 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com0c854682012-05-31 01:14:11 +00001421 }
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001422 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001423 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001424 }
1425
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001426 if (target == GL_TEXTURE_2D)
1427 {
1428 gl::Texture2D *texture = context->getTexture2D();
1429
1430 if (!texture)
1431 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001432 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001433 }
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00001434
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00001435 if (texture->isImmutable())
1436 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001437 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00001438 }
1439
apatrick@chromium.orgb31f5322011-01-19 19:02:52 +00001440 texture->copyImage(level, internalformat, x, y, width, height, framebuffer);
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001441 }
daniel@transgaming.com19ffc242010-05-04 03:35:21 +00001442 else if (gl::IsCubemapTextureTarget(target))
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001443 {
1444 gl::TextureCubeMap *texture = context->getTextureCubeMap();
1445
1446 if (!texture)
1447 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001448 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001449 }
1450
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00001451 if (texture->isImmutable())
1452 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001453 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00001454 }
1455
apatrick@chromium.orgb31f5322011-01-19 19:02:52 +00001456 texture->copyImage(target, level, internalformat, x, y, width, height, framebuffer);
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001457 }
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001458 else UNREACHABLE();
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001459 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001460 }
1461 catch(std::bad_alloc&)
1462 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001463 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001464 }
1465}
1466
1467void __stdcall glCopyTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height)
1468{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001469 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001470 "GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001471 target, level, xoffset, yoffset, x, y, width, height);
1472
1473 try
1474 {
apatrick@chromium.org551022e2012-01-23 19:56:54 +00001475 if (!gl::IsInternalTextureTarget(target))
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001476 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001477 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001478 }
1479
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001480 if (level < 0 || xoffset < 0 || yoffset < 0 || width < 0 || height < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001481 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001482 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001483 }
1484
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001485 if (std::numeric_limits<GLsizei>::max() - xoffset < width || std::numeric_limits<GLsizei>::max() - yoffset < height)
1486 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001487 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001488 }
1489
1490 if (width == 0 || height == 0)
1491 {
1492 return;
1493 }
1494
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001495 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001496
1497 if (context)
1498 {
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001499 if (level > context->getMaximumTextureLevel())
1500 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001501 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001502 }
1503
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00001504 gl::Framebuffer *framebuffer = context->getReadFramebuffer();
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001505
daniel@transgaming.combbc57792010-07-28 19:21:05 +00001506 if (framebuffer->completeness() != GL_FRAMEBUFFER_COMPLETE)
1507 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001508 return gl::error(GL_INVALID_FRAMEBUFFER_OPERATION);
daniel@transgaming.combbc57792010-07-28 19:21:05 +00001509 }
1510
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00001511 if (context->getReadFramebufferHandle() != 0 && framebuffer->getSamples() != 0)
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00001512 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001513 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00001514 }
1515
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00001516 gl::Renderbuffer *source = framebuffer->getReadColorbuffer();
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +00001517 GLenum colorbufferFormat = source->getInternalFormat();
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001518 gl::Texture *texture = NULL;
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +00001519 GLenum textureFormat = GL_RGBA;
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001520
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001521 if (target == GL_TEXTURE_2D)
1522 {
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +00001523 gl::Texture2D *tex2d = context->getTexture2D();
1524
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00001525 if (!validateSubImageParams2D(false, width, height, xoffset, yoffset, level, GL_NONE, GL_NONE, tex2d))
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +00001526 {
1527 return; // error already registered by validateSubImageParams
1528 }
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00001529 textureFormat = gl::ExtractFormat(tex2d->getInternalFormat(level));
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +00001530 texture = tex2d;
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001531 }
daniel@transgaming.com19ffc242010-05-04 03:35:21 +00001532 else if (gl::IsCubemapTextureTarget(target))
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001533 {
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +00001534 gl::TextureCubeMap *texcube = context->getTextureCubeMap();
1535
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00001536 if (!validateSubImageParamsCube(false, width, height, xoffset, yoffset, target, level, GL_NONE, GL_NONE, texcube))
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +00001537 {
1538 return; // error already registered by validateSubImageParams
1539 }
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00001540 textureFormat = gl::ExtractFormat(texcube->getInternalFormat(target, level));
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +00001541 texture = texcube;
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001542 }
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001543 else UNREACHABLE();
1544
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001545 // [OpenGL ES 2.0.24] table 3.9
1546 switch (textureFormat)
1547 {
1548 case GL_ALPHA:
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00001549 if (colorbufferFormat != GL_ALPHA8_EXT &&
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001550 colorbufferFormat != GL_RGBA4 &&
1551 colorbufferFormat != GL_RGB5_A1 &&
1552 colorbufferFormat != GL_RGBA8_OES)
1553 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001554 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001555 }
1556 break;
1557 case GL_LUMINANCE:
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00001558 case GL_RGB:
1559 if (colorbufferFormat != GL_RGB565 &&
1560 colorbufferFormat != GL_RGB8_OES &&
1561 colorbufferFormat != GL_RGBA4 &&
1562 colorbufferFormat != GL_RGB5_A1 &&
1563 colorbufferFormat != GL_RGBA8_OES)
1564 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001565 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00001566 }
1567 break;
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001568 case GL_LUMINANCE_ALPHA:
1569 case GL_RGBA:
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00001570 if (colorbufferFormat != GL_RGBA4 &&
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001571 colorbufferFormat != GL_RGB5_A1 &&
1572 colorbufferFormat != GL_RGBA8_OES)
1573 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001574 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001575 }
1576 break;
1577 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
1578 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
gman@chromium.org50c526d2011-08-10 05:19:44 +00001579 case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
1580 case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001581 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com0c854682012-05-31 01:14:11 +00001582 case GL_DEPTH_COMPONENT:
1583 case GL_DEPTH_STENCIL_OES:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001584 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001585 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001586 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001587 }
1588
apatrick@chromium.orgb31f5322011-01-19 19:02:52 +00001589 texture->copySubImage(target, level, xoffset, yoffset, x, y, width, height, framebuffer);
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001590 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001591 }
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001592
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001593 catch(std::bad_alloc&)
1594 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001595 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001596 }
1597}
1598
1599GLuint __stdcall glCreateProgram(void)
1600{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001601 EVENT("()");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001602
1603 try
1604 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001605 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001606
1607 if (context)
1608 {
1609 return context->createProgram();
1610 }
1611 }
1612 catch(std::bad_alloc&)
1613 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001614 return gl::error(GL_OUT_OF_MEMORY, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001615 }
1616
1617 return 0;
1618}
1619
1620GLuint __stdcall glCreateShader(GLenum type)
1621{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001622 EVENT("(GLenum type = 0x%X)", type);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001623
1624 try
1625 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001626 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001627
1628 if (context)
1629 {
1630 switch (type)
1631 {
1632 case GL_FRAGMENT_SHADER:
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00001633 case GL_VERTEX_SHADER:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001634 return context->createShader(type);
1635 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001636 return gl::error(GL_INVALID_ENUM, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001637 }
1638 }
1639 }
1640 catch(std::bad_alloc&)
1641 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001642 return gl::error(GL_OUT_OF_MEMORY, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001643 }
1644
1645 return 0;
1646}
1647
1648void __stdcall glCullFace(GLenum mode)
1649{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001650 EVENT("(GLenum mode = 0x%X)", mode);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001651
1652 try
1653 {
1654 switch (mode)
1655 {
1656 case GL_FRONT:
1657 case GL_BACK:
1658 case GL_FRONT_AND_BACK:
1659 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001660 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001661
1662 if (context)
1663 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00001664 context->setCullMode(mode);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001665 }
1666 }
1667 break;
1668 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001669 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001670 }
1671 }
1672 catch(std::bad_alloc&)
1673 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001674 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001675 }
1676}
1677
1678void __stdcall glDeleteBuffers(GLsizei n, const GLuint* buffers)
1679{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001680 EVENT("(GLsizei n = %d, const GLuint* buffers = 0x%0.8p)", n, buffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001681
1682 try
1683 {
1684 if (n < 0)
1685 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001686 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001687 }
1688
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001689 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001690
1691 if (context)
1692 {
1693 for (int i = 0; i < n; i++)
1694 {
1695 context->deleteBuffer(buffers[i]);
1696 }
1697 }
1698 }
1699 catch(std::bad_alloc&)
1700 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001701 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001702 }
1703}
1704
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001705void __stdcall glDeleteFencesNV(GLsizei n, const GLuint* fences)
1706{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001707 EVENT("(GLsizei n = %d, const GLuint* fences = 0x%0.8p)", n, fences);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001708
1709 try
1710 {
1711 if (n < 0)
1712 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001713 return gl::error(GL_INVALID_VALUE);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001714 }
1715
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001716 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001717
1718 if (context)
1719 {
1720 for (int i = 0; i < n; i++)
1721 {
1722 context->deleteFence(fences[i]);
1723 }
1724 }
1725 }
1726 catch(std::bad_alloc&)
1727 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001728 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001729 }
1730}
1731
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001732void __stdcall glDeleteFramebuffers(GLsizei n, const GLuint* framebuffers)
1733{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001734 EVENT("(GLsizei n = %d, const GLuint* framebuffers = 0x%0.8p)", n, framebuffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001735
1736 try
1737 {
1738 if (n < 0)
1739 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001740 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001741 }
1742
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001743 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001744
1745 if (context)
1746 {
1747 for (int i = 0; i < n; i++)
1748 {
1749 if (framebuffers[i] != 0)
1750 {
1751 context->deleteFramebuffer(framebuffers[i]);
1752 }
1753 }
1754 }
1755 }
1756 catch(std::bad_alloc&)
1757 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001758 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001759 }
1760}
1761
1762void __stdcall glDeleteProgram(GLuint program)
1763{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001764 EVENT("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001765
1766 try
1767 {
daniel@transgaming.com75401e62010-04-13 03:26:39 +00001768 if (program == 0)
1769 {
1770 return;
1771 }
1772
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001773 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001774
1775 if (context)
1776 {
daniel@transgaming.com75401e62010-04-13 03:26:39 +00001777 if (!context->getProgram(program))
1778 {
1779 if(context->getShader(program))
1780 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001781 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com75401e62010-04-13 03:26:39 +00001782 }
1783 else
1784 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001785 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com75401e62010-04-13 03:26:39 +00001786 }
1787 }
1788
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001789 context->deleteProgram(program);
1790 }
1791 }
1792 catch(std::bad_alloc&)
1793 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001794 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001795 }
1796}
1797
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00001798void __stdcall glDeleteQueriesEXT(GLsizei n, const GLuint *ids)
1799{
1800 EVENT("(GLsizei n = %d, const GLuint *ids = 0x%0.8p)", n, ids);
1801
1802 try
1803 {
1804 if (n < 0)
1805 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001806 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00001807 }
1808
1809 gl::Context *context = gl::getNonLostContext();
1810
1811 if (context)
1812 {
1813 for (int i = 0; i < n; i++)
1814 {
1815 context->deleteQuery(ids[i]);
1816 }
1817 }
1818 }
1819 catch(std::bad_alloc&)
1820 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001821 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00001822 }
1823}
1824
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001825void __stdcall glDeleteRenderbuffers(GLsizei n, const GLuint* renderbuffers)
1826{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001827 EVENT("(GLsizei n = %d, const GLuint* renderbuffers = 0x%0.8p)", n, renderbuffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001828
1829 try
1830 {
1831 if (n < 0)
1832 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001833 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001834 }
1835
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001836 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001837
1838 if (context)
1839 {
daniel@transgaming.come2b22122010-03-11 19:22:14 +00001840 for (int i = 0; i < n; i++)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001841 {
1842 context->deleteRenderbuffer(renderbuffers[i]);
1843 }
1844 }
1845 }
1846 catch(std::bad_alloc&)
1847 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001848 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001849 }
1850}
1851
1852void __stdcall glDeleteShader(GLuint shader)
1853{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001854 EVENT("(GLuint shader = %d)", shader);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001855
1856 try
1857 {
daniel@transgaming.com75401e62010-04-13 03:26:39 +00001858 if (shader == 0)
1859 {
1860 return;
1861 }
1862
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001863 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001864
1865 if (context)
1866 {
daniel@transgaming.com75401e62010-04-13 03:26:39 +00001867 if (!context->getShader(shader))
1868 {
1869 if(context->getProgram(shader))
1870 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001871 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com75401e62010-04-13 03:26:39 +00001872 }
1873 else
1874 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001875 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com75401e62010-04-13 03:26:39 +00001876 }
1877 }
1878
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001879 context->deleteShader(shader);
1880 }
1881 }
1882 catch(std::bad_alloc&)
1883 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001884 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001885 }
1886}
1887
1888void __stdcall glDeleteTextures(GLsizei n, const GLuint* textures)
1889{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001890 EVENT("(GLsizei n = %d, const GLuint* textures = 0x%0.8p)", n, textures);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001891
1892 try
1893 {
1894 if (n < 0)
1895 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001896 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001897 }
1898
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001899 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001900
1901 if (context)
1902 {
1903 for (int i = 0; i < n; i++)
1904 {
1905 if (textures[i] != 0)
1906 {
1907 context->deleteTexture(textures[i]);
1908 }
1909 }
1910 }
1911 }
1912 catch(std::bad_alloc&)
1913 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001914 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001915 }
1916}
1917
1918void __stdcall glDepthFunc(GLenum func)
1919{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001920 EVENT("(GLenum func = 0x%X)", func);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001921
1922 try
1923 {
1924 switch (func)
1925 {
1926 case GL_NEVER:
1927 case GL_ALWAYS:
1928 case GL_LESS:
1929 case GL_LEQUAL:
1930 case GL_EQUAL:
1931 case GL_GREATER:
1932 case GL_GEQUAL:
1933 case GL_NOTEQUAL:
1934 break;
1935 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001936 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001937 }
1938
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001939 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001940
1941 if (context)
1942 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00001943 context->setDepthFunc(func);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001944 }
1945 }
1946 catch(std::bad_alloc&)
1947 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001948 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001949 }
1950}
1951
1952void __stdcall glDepthMask(GLboolean flag)
1953{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00001954 EVENT("(GLboolean flag = %u)", flag);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001955
1956 try
1957 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001958 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001959
1960 if (context)
1961 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00001962 context->setDepthMask(flag != GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001963 }
1964 }
1965 catch(std::bad_alloc&)
1966 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001967 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001968 }
1969}
1970
1971void __stdcall glDepthRangef(GLclampf zNear, GLclampf zFar)
1972{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001973 EVENT("(GLclampf zNear = %f, GLclampf zFar = %f)", zNear, zFar);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001974
1975 try
1976 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001977 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001978
1979 if (context)
1980 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00001981 context->setDepthRange(zNear, zFar);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001982 }
1983 }
1984 catch(std::bad_alloc&)
1985 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001986 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001987 }
1988}
1989
1990void __stdcall glDetachShader(GLuint program, GLuint shader)
1991{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001992 EVENT("(GLuint program = %d, GLuint shader = %d)", program, shader);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001993
1994 try
1995 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001996 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001997
1998 if (context)
1999 {
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00002000
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002001 gl::Program *programObject = context->getProgram(program);
2002 gl::Shader *shaderObject = context->getShader(shader);
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00002003
2004 if (!programObject)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002005 {
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00002006 gl::Shader *shaderByProgramHandle;
2007 shaderByProgramHandle = context->getShader(program);
2008 if (!shaderByProgramHandle)
2009 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002010 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00002011 }
2012 else
2013 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002014 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00002015 }
2016 }
2017
2018 if (!shaderObject)
2019 {
2020 gl::Program *programByShaderHandle = context->getProgram(shader);
2021 if (!programByShaderHandle)
2022 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002023 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00002024 }
2025 else
2026 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002027 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00002028 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002029 }
2030
2031 if (!programObject->detachShader(shaderObject))
2032 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002033 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002034 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002035 }
2036 }
2037 catch(std::bad_alloc&)
2038 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002039 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002040 }
2041}
2042
2043void __stdcall glDisable(GLenum cap)
2044{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002045 EVENT("(GLenum cap = 0x%X)", cap);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002046
2047 try
2048 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002049 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002050
2051 if (context)
2052 {
2053 switch (cap)
2054 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00002055 case GL_CULL_FACE: context->setCullFace(false); break;
2056 case GL_POLYGON_OFFSET_FILL: context->setPolygonOffsetFill(false); break;
2057 case GL_SAMPLE_ALPHA_TO_COVERAGE: context->setSampleAlphaToCoverage(false); break;
2058 case GL_SAMPLE_COVERAGE: context->setSampleCoverage(false); break;
2059 case GL_SCISSOR_TEST: context->setScissorTest(false); break;
2060 case GL_STENCIL_TEST: context->setStencilTest(false); break;
2061 case GL_DEPTH_TEST: context->setDepthTest(false); break;
2062 case GL_BLEND: context->setBlend(false); break;
2063 case GL_DITHER: context->setDither(false); break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002064 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002065 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002066 }
2067 }
2068 }
2069 catch(std::bad_alloc&)
2070 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002071 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002072 }
2073}
2074
2075void __stdcall glDisableVertexAttribArray(GLuint index)
2076{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002077 EVENT("(GLuint index = %d)", index);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002078
2079 try
2080 {
2081 if (index >= gl::MAX_VERTEX_ATTRIBS)
2082 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002083 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002084 }
2085
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002086 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002087
2088 if (context)
2089 {
daniel@transgaming.com83921382011-01-08 05:46:00 +00002090 context->setEnableVertexAttribArray(index, false);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002091 }
2092 }
2093 catch(std::bad_alloc&)
2094 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002095 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002096 }
2097}
2098
2099void __stdcall glDrawArrays(GLenum mode, GLint first, GLsizei count)
2100{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002101 EVENT("(GLenum mode = 0x%X, GLint first = %d, GLsizei count = %d)", mode, first, count);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002102
2103 try
2104 {
2105 if (count < 0 || first < 0)
2106 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002107 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002108 }
2109
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002110 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002111
2112 if (context)
2113 {
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00002114 context->drawArrays(mode, first, count, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002115 }
2116 }
2117 catch(std::bad_alloc&)
2118 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002119 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002120 }
2121}
2122
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002123void __stdcall glDrawArraysInstancedANGLE(GLenum mode, GLint first, GLsizei count, GLsizei primcount)
2124{
2125 EVENT("(GLenum mode = 0x%X, GLint first = %d, GLsizei count = %d, GLsizei primcount = %d)", mode, first, count, primcount);
2126
2127 try
2128 {
2129 if (count < 0 || first < 0 || primcount < 0)
2130 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002131 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002132 }
2133
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00002134 if (primcount > 0)
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002135 {
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00002136 gl::Context *context = gl::getNonLostContext();
2137
2138 if (context)
2139 {
2140 context->drawArrays(mode, first, count, primcount);
2141 }
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002142 }
2143 }
2144 catch(std::bad_alloc&)
2145 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002146 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002147 }
2148}
2149
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00002150void __stdcall glDrawElements(GLenum mode, GLsizei count, GLenum type, const GLvoid* indices)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002151{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002152 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 +00002153 mode, count, type, indices);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002154
2155 try
2156 {
2157 if (count < 0)
2158 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002159 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002160 }
2161
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002162 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002163
2164 if (context)
2165 {
daniel@transgaming.com83921382011-01-08 05:46:00 +00002166 switch (type)
2167 {
2168 case GL_UNSIGNED_BYTE:
2169 case GL_UNSIGNED_SHORT:
2170 break;
2171 case GL_UNSIGNED_INT:
2172 if (!context->supports32bitIndices())
2173 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002174 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com83921382011-01-08 05:46:00 +00002175 }
2176 break;
2177 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002178 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com83921382011-01-08 05:46:00 +00002179 }
2180
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00002181 context->drawElements(mode, count, type, indices, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002182 }
2183 }
2184 catch(std::bad_alloc&)
2185 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002186 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002187 }
2188}
2189
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002190void __stdcall glDrawElementsInstancedANGLE(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLsizei primcount)
2191{
2192 EVENT("(GLenum mode = 0x%X, GLsizei count = %d, GLenum type = 0x%X, const GLvoid* indices = 0x%0.8p, GLsizei primcount = %d)",
2193 mode, count, type, indices, primcount);
2194
2195 try
2196 {
2197 if (count < 0 || primcount < 0)
2198 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002199 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002200 }
2201
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00002202 if (primcount > 0)
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002203 {
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00002204 gl::Context *context = gl::getNonLostContext();
2205
2206 if (context)
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002207 {
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00002208 switch (type)
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002209 {
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00002210 case GL_UNSIGNED_BYTE:
2211 case GL_UNSIGNED_SHORT:
2212 break;
2213 case GL_UNSIGNED_INT:
2214 if (!context->supports32bitIndices())
2215 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002216 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00002217 }
2218 break;
2219 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002220 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002221 }
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00002222
2223 context->drawElements(mode, count, type, indices, primcount);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002224 }
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002225 }
2226 }
2227 catch(std::bad_alloc&)
2228 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002229 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002230 }
2231}
2232
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002233void __stdcall glEnable(GLenum cap)
2234{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002235 EVENT("(GLenum cap = 0x%X)", cap);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002236
2237 try
2238 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002239 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002240
2241 if (context)
2242 {
2243 switch (cap)
2244 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00002245 case GL_CULL_FACE: context->setCullFace(true); break;
2246 case GL_POLYGON_OFFSET_FILL: context->setPolygonOffsetFill(true); break;
2247 case GL_SAMPLE_ALPHA_TO_COVERAGE: context->setSampleAlphaToCoverage(true); break;
2248 case GL_SAMPLE_COVERAGE: context->setSampleCoverage(true); break;
2249 case GL_SCISSOR_TEST: context->setScissorTest(true); break;
2250 case GL_STENCIL_TEST: context->setStencilTest(true); break;
2251 case GL_DEPTH_TEST: context->setDepthTest(true); break;
2252 case GL_BLEND: context->setBlend(true); break;
2253 case GL_DITHER: context->setDither(true); break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002254 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002255 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002256 }
2257 }
2258 }
2259 catch(std::bad_alloc&)
2260 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002261 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002262 }
2263}
2264
2265void __stdcall glEnableVertexAttribArray(GLuint index)
2266{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002267 EVENT("(GLuint index = %d)", index);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002268
2269 try
2270 {
2271 if (index >= gl::MAX_VERTEX_ATTRIBS)
2272 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002273 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002274 }
2275
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002276 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002277
2278 if (context)
2279 {
daniel@transgaming.com83921382011-01-08 05:46:00 +00002280 context->setEnableVertexAttribArray(index, true);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002281 }
2282 }
2283 catch(std::bad_alloc&)
2284 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002285 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002286 }
2287}
2288
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00002289void __stdcall glEndQueryEXT(GLenum target)
2290{
2291 EVENT("GLenum target = 0x%X)", target);
2292
2293 try
2294 {
2295 switch (target)
2296 {
2297 case GL_ANY_SAMPLES_PASSED_EXT:
2298 case GL_ANY_SAMPLES_PASSED_CONSERVATIVE_EXT:
2299 break;
2300 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002301 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00002302 }
2303
2304 gl::Context *context = gl::getNonLostContext();
2305
2306 if (context)
2307 {
2308 context->endQuery(target);
2309 }
2310 }
2311 catch(std::bad_alloc&)
2312 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002313 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00002314 }
2315}
2316
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002317void __stdcall glFinishFenceNV(GLuint fence)
2318{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002319 EVENT("(GLuint fence = %d)", fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002320
2321 try
2322 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002323 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002324
2325 if (context)
2326 {
2327 gl::Fence* fenceObject = context->getFence(fence);
2328
2329 if (fenceObject == NULL)
2330 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002331 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002332 }
2333
2334 fenceObject->finishFence();
2335 }
2336 }
2337 catch(std::bad_alloc&)
2338 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002339 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002340 }
2341}
2342
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002343void __stdcall glFinish(void)
2344{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002345 EVENT("()");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002346
2347 try
2348 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002349 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002350
2351 if (context)
2352 {
daniel@transgaming.com0d86aa72011-10-26 02:35:10 +00002353 context->sync(true);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002354 }
2355 }
2356 catch(std::bad_alloc&)
2357 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002358 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002359 }
2360}
2361
2362void __stdcall glFlush(void)
2363{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002364 EVENT("()");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002365
2366 try
2367 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002368 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002369
2370 if (context)
2371 {
daniel@transgaming.com0d86aa72011-10-26 02:35:10 +00002372 context->sync(false);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002373 }
2374 }
2375 catch(std::bad_alloc&)
2376 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002377 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002378 }
2379}
2380
2381void __stdcall glFramebufferRenderbuffer(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer)
2382{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002383 EVENT("(GLenum target = 0x%X, GLenum attachment = 0x%X, GLenum renderbuffertarget = 0x%X, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00002384 "GLuint renderbuffer = %d)", target, attachment, renderbuffertarget, renderbuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002385
2386 try
2387 {
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002388 if ((target != GL_FRAMEBUFFER && target != GL_DRAW_FRAMEBUFFER_ANGLE && target != GL_READ_FRAMEBUFFER_ANGLE)
daniel@transgaming.com2fa45512011-10-04 18:43:18 +00002389 || (renderbuffertarget != GL_RENDERBUFFER && renderbuffer != 0))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002390 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002391 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002392 }
2393
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002394 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002395
2396 if (context)
2397 {
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002398 gl::Framebuffer *framebuffer = NULL;
2399 GLuint framebufferHandle = 0;
2400 if (target == GL_READ_FRAMEBUFFER_ANGLE)
2401 {
2402 framebuffer = context->getReadFramebuffer();
2403 framebufferHandle = context->getReadFramebufferHandle();
2404 }
daniel@transgaming.com2fa45512011-10-04 18:43:18 +00002405 else
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002406 {
2407 framebuffer = context->getDrawFramebuffer();
2408 framebufferHandle = context->getDrawFramebufferHandle();
2409 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002410
daniel@transgaming.com2fa45512011-10-04 18:43:18 +00002411 if (!framebuffer || (framebufferHandle == 0 && renderbuffer != 0))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002412 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002413 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002414 }
2415
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002416 if (attachment >= GL_COLOR_ATTACHMENT0_EXT && attachment <= GL_COLOR_ATTACHMENT15_EXT)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002417 {
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002418 const unsigned int colorAttachment = (attachment - GL_COLOR_ATTACHMENT0_EXT);
2419
2420 if (colorAttachment >= context->getMaximumRenderTargets())
2421 {
2422 return gl::error(GL_INVALID_VALUE);
2423 }
2424
2425 framebuffer->setColorbuffer(colorAttachment, GL_RENDERBUFFER, renderbuffer);
2426 }
2427 else
2428 {
2429 switch (attachment)
2430 {
2431 case GL_DEPTH_ATTACHMENT:
2432 framebuffer->setDepthbuffer(GL_RENDERBUFFER, renderbuffer);
2433 break;
2434 case GL_STENCIL_ATTACHMENT:
2435 framebuffer->setStencilbuffer(GL_RENDERBUFFER, renderbuffer);
2436 break;
2437 default:
2438 return gl::error(GL_INVALID_ENUM);
2439 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002440 }
2441 }
2442 }
2443 catch(std::bad_alloc&)
2444 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002445 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002446 }
2447}
2448
2449void __stdcall glFramebufferTexture2D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level)
2450{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002451 EVENT("(GLenum target = 0x%X, GLenum attachment = 0x%X, GLenum textarget = 0x%X, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00002452 "GLuint texture = %d, GLint level = %d)", target, attachment, textarget, texture, level);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002453
2454 try
2455 {
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002456 if (target != GL_FRAMEBUFFER && target != GL_DRAW_FRAMEBUFFER_ANGLE && target != GL_READ_FRAMEBUFFER_ANGLE)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002457 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002458 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002459 }
2460
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002461 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002462
2463 if (context)
2464 {
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002465 if (attachment >= GL_COLOR_ATTACHMENT0_EXT && attachment <= GL_COLOR_ATTACHMENT15_EXT)
2466 {
2467 const unsigned int colorAttachment = (attachment - GL_COLOR_ATTACHMENT0_EXT);
2468
2469 if (colorAttachment >= context->getMaximumRenderTargets())
2470 {
2471 return gl::error(GL_INVALID_VALUE);
2472 }
2473 }
2474 else
2475 {
2476 switch (attachment)
2477 {
2478 case GL_DEPTH_ATTACHMENT:
2479 case GL_STENCIL_ATTACHMENT:
2480 break;
2481 default:
2482 return gl::error(GL_INVALID_ENUM);
2483 }
2484 }
2485
daniel@transgaming.com93a81472010-04-20 18:52:58 +00002486 if (texture == 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002487 {
daniel@transgaming.com93a81472010-04-20 18:52:58 +00002488 textarget = GL_NONE;
2489 }
2490 else
2491 {
2492 gl::Texture *tex = context->getTexture(texture);
2493
2494 if (tex == NULL)
2495 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002496 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com93a81472010-04-20 18:52:58 +00002497 }
2498
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002499 switch (textarget)
2500 {
2501 case GL_TEXTURE_2D:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002502 {
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00002503 if (tex->getTarget() != GL_TEXTURE_2D)
2504 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002505 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00002506 }
2507 gl::Texture2D *tex2d = static_cast<gl::Texture2D *>(tex);
daniel@transgaming.com92f49922012-05-09 15:49:19 +00002508 if (tex2d->isCompressed(0))
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00002509 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002510 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00002511 }
2512 break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002513 }
daniel@transgaming.com93a81472010-04-20 18:52:58 +00002514
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002515 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002516 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002517 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002518 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002519 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002520 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
daniel@transgaming.com93a81472010-04-20 18:52:58 +00002521 {
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00002522 if (tex->getTarget() != GL_TEXTURE_CUBE_MAP)
2523 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002524 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00002525 }
2526 gl::TextureCubeMap *texcube = static_cast<gl::TextureCubeMap *>(tex);
daniel@transgaming.com4df88e82012-05-09 15:49:24 +00002527 if (texcube->isCompressed(textarget, level))
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00002528 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002529 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00002530 }
2531 break;
daniel@transgaming.com93a81472010-04-20 18:52:58 +00002532 }
daniel@transgaming.com93a81472010-04-20 18:52:58 +00002533
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002534 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002535 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002536 }
2537
2538 if (level != 0)
2539 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002540 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002541 }
2542 }
2543
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002544 gl::Framebuffer *framebuffer = NULL;
2545 GLuint framebufferHandle = 0;
2546 if (target == GL_READ_FRAMEBUFFER_ANGLE)
2547 {
2548 framebuffer = context->getReadFramebuffer();
2549 framebufferHandle = context->getReadFramebufferHandle();
2550 }
2551 else
2552 {
2553 framebuffer = context->getDrawFramebuffer();
2554 framebufferHandle = context->getDrawFramebufferHandle();
2555 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002556
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002557 if (framebufferHandle == 0 || !framebuffer)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002558 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002559 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002560 }
2561
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002562 if (attachment >= GL_COLOR_ATTACHMENT0_EXT && attachment <= GL_COLOR_ATTACHMENT15_EXT)
daniel@transgaming.comfbc09532010-04-26 15:33:41 +00002563 {
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002564 const unsigned int colorAttachment = (attachment - GL_COLOR_ATTACHMENT0_EXT);
2565
2566 if (colorAttachment >= context->getMaximumRenderTargets())
2567 {
2568 return gl::error(GL_INVALID_VALUE);
2569 }
2570
2571 framebuffer->setColorbuffer(colorAttachment, textarget, texture);
2572 }
2573 else
2574 {
2575 switch (attachment)
2576 {
2577 case GL_DEPTH_ATTACHMENT: framebuffer->setDepthbuffer(textarget, texture); break;
2578 case GL_STENCIL_ATTACHMENT: framebuffer->setStencilbuffer(textarget, texture); break;
2579 }
daniel@transgaming.comfbc09532010-04-26 15:33:41 +00002580 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002581 }
2582 }
2583 catch(std::bad_alloc&)
2584 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002585 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002586 }
2587}
2588
2589void __stdcall glFrontFace(GLenum mode)
2590{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002591 EVENT("(GLenum mode = 0x%X)", mode);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002592
2593 try
2594 {
2595 switch (mode)
2596 {
2597 case GL_CW:
2598 case GL_CCW:
2599 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002600 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002601
2602 if (context)
2603 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00002604 context->setFrontFace(mode);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002605 }
2606 }
2607 break;
2608 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002609 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002610 }
2611 }
2612 catch(std::bad_alloc&)
2613 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002614 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002615 }
2616}
2617
2618void __stdcall glGenBuffers(GLsizei n, GLuint* buffers)
2619{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002620 EVENT("(GLsizei n = %d, GLuint* buffers = 0x%0.8p)", n, buffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002621
2622 try
2623 {
2624 if (n < 0)
2625 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002626 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002627 }
2628
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002629 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002630
2631 if (context)
2632 {
2633 for (int i = 0; i < n; i++)
2634 {
2635 buffers[i] = context->createBuffer();
2636 }
2637 }
2638 }
2639 catch(std::bad_alloc&)
2640 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002641 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002642 }
2643}
2644
2645void __stdcall glGenerateMipmap(GLenum target)
2646{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002647 EVENT("(GLenum target = 0x%X)", target);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002648
2649 try
2650 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002651 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com8fd99e22010-04-20 18:52:00 +00002652
2653 if (context)
2654 {
daniel@transgaming.com8fd99e22010-04-20 18:52:00 +00002655 switch (target)
2656 {
2657 case GL_TEXTURE_2D:
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00002658 {
2659 gl::Texture2D *tex2d = context->getTexture2D();
2660
daniel@transgaming.com92f49922012-05-09 15:49:19 +00002661 if (tex2d->isCompressed(0))
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00002662 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002663 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00002664 }
daniel@transgaming.com0c854682012-05-31 01:14:11 +00002665 if (tex2d->isDepth(0))
2666 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002667 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com0c854682012-05-31 01:14:11 +00002668 }
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00002669
2670 tex2d->generateMipmaps();
2671 break;
2672 }
daniel@transgaming.com8fd99e22010-04-20 18:52:00 +00002673
2674 case GL_TEXTURE_CUBE_MAP:
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00002675 {
2676 gl::TextureCubeMap *texcube = context->getTextureCubeMap();
2677
daniel@transgaming.com4df88e82012-05-09 15:49:24 +00002678 if (texcube->isCompressed(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0))
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00002679 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002680 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00002681 }
2682
2683 texcube->generateMipmaps();
2684 break;
2685 }
daniel@transgaming.com8fd99e22010-04-20 18:52:00 +00002686
2687 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002688 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com8fd99e22010-04-20 18:52:00 +00002689 }
daniel@transgaming.com8fd99e22010-04-20 18:52:00 +00002690 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002691 }
2692 catch(std::bad_alloc&)
2693 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002694 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002695 }
2696}
2697
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002698void __stdcall glGenFencesNV(GLsizei n, GLuint* fences)
2699{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002700 EVENT("(GLsizei n = %d, GLuint* fences = 0x%0.8p)", n, fences);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002701
2702 try
2703 {
2704 if (n < 0)
2705 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002706 return gl::error(GL_INVALID_VALUE);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002707 }
2708
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002709 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002710
2711 if (context)
2712 {
2713 for (int i = 0; i < n; i++)
2714 {
2715 fences[i] = context->createFence();
2716 }
2717 }
2718 }
2719 catch(std::bad_alloc&)
2720 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002721 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002722 }
2723}
2724
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002725void __stdcall glGenFramebuffers(GLsizei n, GLuint* framebuffers)
2726{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002727 EVENT("(GLsizei n = %d, GLuint* framebuffers = 0x%0.8p)", n, framebuffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002728
2729 try
2730 {
2731 if (n < 0)
2732 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002733 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002734 }
2735
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002736 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002737
2738 if (context)
2739 {
2740 for (int i = 0; i < n; i++)
2741 {
2742 framebuffers[i] = context->createFramebuffer();
2743 }
2744 }
2745 }
2746 catch(std::bad_alloc&)
2747 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002748 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002749 }
2750}
2751
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00002752void __stdcall glGenQueriesEXT(GLsizei n, GLuint* ids)
2753{
2754 EVENT("(GLsizei n = %d, GLuint* ids = 0x%0.8p)", n, ids);
2755
2756 try
2757 {
2758 if (n < 0)
2759 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002760 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00002761 }
2762
2763 gl::Context *context = gl::getNonLostContext();
2764
2765 if (context)
2766 {
2767 for (int i = 0; i < n; i++)
2768 {
2769 ids[i] = context->createQuery();
2770 }
2771 }
2772 }
2773 catch(std::bad_alloc&)
2774 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002775 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00002776 }
2777}
2778
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002779void __stdcall glGenRenderbuffers(GLsizei n, GLuint* renderbuffers)
2780{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002781 EVENT("(GLsizei n = %d, GLuint* renderbuffers = 0x%0.8p)", n, renderbuffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002782
2783 try
2784 {
2785 if (n < 0)
2786 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002787 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002788 }
2789
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002790 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002791
2792 if (context)
2793 {
2794 for (int i = 0; i < n; i++)
2795 {
2796 renderbuffers[i] = context->createRenderbuffer();
2797 }
2798 }
2799 }
2800 catch(std::bad_alloc&)
2801 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002802 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002803 }
2804}
2805
2806void __stdcall glGenTextures(GLsizei n, GLuint* textures)
2807{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002808 EVENT("(GLsizei n = %d, GLuint* textures = 0x%0.8p)", n, textures);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002809
2810 try
2811 {
2812 if (n < 0)
2813 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002814 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002815 }
2816
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002817 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002818
2819 if (context)
2820 {
2821 for (int i = 0; i < n; i++)
2822 {
2823 textures[i] = context->createTexture();
2824 }
2825 }
2826 }
2827 catch(std::bad_alloc&)
2828 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002829 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002830 }
2831}
2832
daniel@transgaming.com85423182010-04-22 13:35:27 +00002833void __stdcall glGetActiveAttrib(GLuint program, GLuint index, GLsizei bufsize, GLsizei *length, GLint *size, GLenum *type, GLchar *name)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002834{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002835 EVENT("(GLuint program = %d, GLuint index = %d, GLsizei bufsize = %d, GLsizei *length = 0x%0.8p, "
daniel@transgaming.com85423182010-04-22 13:35:27 +00002836 "GLint *size = 0x%0.8p, GLenum *type = %0.8p, GLchar *name = %0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002837 program, index, bufsize, length, size, type, name);
2838
2839 try
2840 {
2841 if (bufsize < 0)
2842 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002843 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002844 }
2845
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002846 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com85423182010-04-22 13:35:27 +00002847
2848 if (context)
2849 {
2850 gl::Program *programObject = context->getProgram(program);
2851
2852 if (!programObject)
2853 {
2854 if (context->getShader(program))
2855 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002856 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com85423182010-04-22 13:35:27 +00002857 }
2858 else
2859 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002860 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com85423182010-04-22 13:35:27 +00002861 }
2862 }
2863
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00002864 if (index >= (GLuint)programObject->getActiveAttributeCount())
daniel@transgaming.com85423182010-04-22 13:35:27 +00002865 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002866 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com85423182010-04-22 13:35:27 +00002867 }
2868
2869 programObject->getActiveAttribute(index, bufsize, length, size, type, name);
2870 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002871 }
2872 catch(std::bad_alloc&)
2873 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002874 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002875 }
2876}
2877
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00002878void __stdcall glGetActiveUniform(GLuint program, GLuint index, GLsizei bufsize, GLsizei* length, GLint* size, GLenum* type, GLchar* name)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002879{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002880 EVENT("(GLuint program = %d, GLuint index = %d, GLsizei bufsize = %d, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00002881 "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 +00002882 program, index, bufsize, length, size, type, name);
2883
2884 try
2885 {
2886 if (bufsize < 0)
2887 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002888 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002889 }
2890
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002891 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00002892
2893 if (context)
2894 {
2895 gl::Program *programObject = context->getProgram(program);
2896
2897 if (!programObject)
2898 {
2899 if (context->getShader(program))
2900 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002901 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00002902 }
2903 else
2904 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002905 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00002906 }
2907 }
2908
2909 if (index >= (GLuint)programObject->getActiveUniformCount())
2910 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002911 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00002912 }
2913
2914 programObject->getActiveUniform(index, bufsize, length, size, type, name);
2915 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002916 }
2917 catch(std::bad_alloc&)
2918 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002919 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002920 }
2921}
2922
2923void __stdcall glGetAttachedShaders(GLuint program, GLsizei maxcount, GLsizei* count, GLuint* shaders)
2924{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002925 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 +00002926 program, maxcount, count, shaders);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002927
2928 try
2929 {
2930 if (maxcount < 0)
2931 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002932 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002933 }
2934
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002935 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com6c785212010-03-30 03:36:17 +00002936
2937 if (context)
2938 {
2939 gl::Program *programObject = context->getProgram(program);
2940
2941 if (!programObject)
2942 {
daniel@transgaming.com23953e32010-04-13 19:53:31 +00002943 if (context->getShader(program))
2944 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002945 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com23953e32010-04-13 19:53:31 +00002946 }
2947 else
2948 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002949 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com23953e32010-04-13 19:53:31 +00002950 }
daniel@transgaming.com6c785212010-03-30 03:36:17 +00002951 }
2952
2953 return programObject->getAttachedShaders(maxcount, count, shaders);
2954 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002955 }
2956 catch(std::bad_alloc&)
2957 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002958 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002959 }
2960}
2961
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00002962int __stdcall glGetAttribLocation(GLuint program, const GLchar* name)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002963{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002964 EVENT("(GLuint program = %d, const GLchar* name = %s)", program, name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002965
2966 try
2967 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002968 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002969
2970 if (context)
2971 {
daniel@transgaming.combb274c32010-04-13 03:26:21 +00002972
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002973 gl::Program *programObject = context->getProgram(program);
2974
2975 if (!programObject)
2976 {
daniel@transgaming.combb274c32010-04-13 03:26:21 +00002977 if (context->getShader(program))
2978 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002979 return gl::error(GL_INVALID_OPERATION, -1);
daniel@transgaming.combb274c32010-04-13 03:26:21 +00002980 }
2981 else
2982 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002983 return gl::error(GL_INVALID_VALUE, -1);
daniel@transgaming.combb274c32010-04-13 03:26:21 +00002984 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002985 }
2986
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00002987 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
daniel@transgaming.com716056c2012-07-24 18:38:59 +00002988 if (!programObject->isLinked() || !programBinary)
daniel@transgaming.comcf4aa872010-04-13 03:26:27 +00002989 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002990 return gl::error(GL_INVALID_OPERATION, -1);
daniel@transgaming.comcf4aa872010-04-13 03:26:27 +00002991 }
2992
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00002993 return programBinary->getAttributeLocation(name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002994 }
2995 }
2996 catch(std::bad_alloc&)
2997 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002998 return gl::error(GL_OUT_OF_MEMORY, -1);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002999 }
3000
3001 return -1;
3002}
3003
3004void __stdcall glGetBooleanv(GLenum pname, GLboolean* params)
3005{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003006 EVENT("(GLenum pname = 0x%X, GLboolean* params = 0x%0.8p)", pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003007
3008 try
3009 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003010 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003011
3012 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003013 {
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003014 if (!(context->getBooleanv(pname, params)))
3015 {
3016 GLenum nativeType;
3017 unsigned int numParams = 0;
3018 if (!context->getQueryParameterInfo(pname, &nativeType, &numParams))
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003019 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003020
3021 if (numParams == 0)
3022 return; // it is known that the pname is valid, but there are no parameters to return
3023
3024 if (nativeType == GL_FLOAT)
3025 {
3026 GLfloat *floatParams = NULL;
3027 floatParams = new GLfloat[numParams];
3028
3029 context->getFloatv(pname, floatParams);
3030
3031 for (unsigned int i = 0; i < numParams; ++i)
3032 {
3033 if (floatParams[i] == 0.0f)
3034 params[i] = GL_FALSE;
3035 else
3036 params[i] = GL_TRUE;
3037 }
3038
3039 delete [] floatParams;
3040 }
3041 else if (nativeType == GL_INT)
3042 {
3043 GLint *intParams = NULL;
3044 intParams = new GLint[numParams];
3045
3046 context->getIntegerv(pname, intParams);
3047
3048 for (unsigned int i = 0; i < numParams; ++i)
3049 {
3050 if (intParams[i] == 0)
3051 params[i] = GL_FALSE;
3052 else
3053 params[i] = GL_TRUE;
3054 }
3055
3056 delete [] intParams;
3057 }
3058 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003059 }
3060 }
3061 catch(std::bad_alloc&)
3062 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003063 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003064 }
3065}
3066
3067void __stdcall glGetBufferParameteriv(GLenum target, GLenum pname, GLint* params)
3068{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003069 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 +00003070
3071 try
3072 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003073 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comaa0ccbd2010-04-15 20:45:05 +00003074
3075 if (context)
3076 {
3077 gl::Buffer *buffer;
3078
3079 switch (target)
3080 {
3081 case GL_ARRAY_BUFFER:
3082 buffer = context->getArrayBuffer();
3083 break;
3084 case GL_ELEMENT_ARRAY_BUFFER:
3085 buffer = context->getElementArrayBuffer();
3086 break;
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003087 default: return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comaa0ccbd2010-04-15 20:45:05 +00003088 }
3089
3090 if (!buffer)
3091 {
3092 // A null buffer means that "0" is bound to the requested buffer target
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003093 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comaa0ccbd2010-04-15 20:45:05 +00003094 }
3095
3096 switch (pname)
3097 {
3098 case GL_BUFFER_USAGE:
3099 *params = buffer->usage();
3100 break;
3101 case GL_BUFFER_SIZE:
3102 *params = buffer->size();
3103 break;
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003104 default: return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comaa0ccbd2010-04-15 20:45:05 +00003105 }
3106 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003107 }
3108 catch(std::bad_alloc&)
3109 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003110 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003111 }
3112}
3113
3114GLenum __stdcall glGetError(void)
3115{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003116 EVENT("()");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003117
3118 gl::Context *context = gl::getContext();
3119
3120 if (context)
3121 {
daniel@transgaming.com82b28912011-12-12 21:01:35 +00003122 return context->getError();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003123 }
3124
3125 return GL_NO_ERROR;
3126}
3127
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00003128void __stdcall glGetFenceivNV(GLuint fence, GLenum pname, GLint *params)
3129{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003130 EVENT("(GLuint fence = %d, GLenum pname = 0x%X, GLint *params = 0x%0.8p)", fence, pname, params);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00003131
3132 try
3133 {
3134
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003135 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00003136
3137 if (context)
3138 {
3139 gl::Fence *fenceObject = context->getFence(fence);
3140
3141 if (fenceObject == NULL)
3142 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003143 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00003144 }
3145
3146 fenceObject->getFenceiv(pname, params);
3147 }
3148 }
3149 catch(std::bad_alloc&)
3150 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003151 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00003152 }
3153}
3154
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003155void __stdcall glGetFloatv(GLenum pname, GLfloat* params)
3156{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003157 EVENT("(GLenum pname = 0x%X, GLfloat* params = 0x%0.8p)", pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003158
3159 try
3160 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003161 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com32e58cd2010-03-24 09:44:10 +00003162
3163 if (context)
3164 {
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003165 if (!(context->getFloatv(pname, params)))
daniel@transgaming.com32e58cd2010-03-24 09:44:10 +00003166 {
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003167 GLenum nativeType;
3168 unsigned int numParams = 0;
3169 if (!context->getQueryParameterInfo(pname, &nativeType, &numParams))
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003170 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003171
3172 if (numParams == 0)
3173 return; // it is known that the pname is valid, but that there are no parameters to return.
3174
3175 if (nativeType == GL_BOOL)
3176 {
3177 GLboolean *boolParams = NULL;
3178 boolParams = new GLboolean[numParams];
3179
3180 context->getBooleanv(pname, boolParams);
3181
3182 for (unsigned int i = 0; i < numParams; ++i)
3183 {
3184 if (boolParams[i] == GL_FALSE)
3185 params[i] = 0.0f;
3186 else
3187 params[i] = 1.0f;
3188 }
3189
3190 delete [] boolParams;
3191 }
3192 else if (nativeType == GL_INT)
3193 {
3194 GLint *intParams = NULL;
3195 intParams = new GLint[numParams];
3196
3197 context->getIntegerv(pname, intParams);
3198
3199 for (unsigned int i = 0; i < numParams; ++i)
3200 {
3201 params[i] = (GLfloat)intParams[i];
3202 }
3203
3204 delete [] intParams;
3205 }
daniel@transgaming.com32e58cd2010-03-24 09:44:10 +00003206 }
3207 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003208 }
3209 catch(std::bad_alloc&)
3210 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003211 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003212 }
3213}
3214
3215void __stdcall glGetFramebufferAttachmentParameteriv(GLenum target, GLenum attachment, GLenum pname, GLint* params)
3216{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003217 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 +00003218 target, attachment, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003219
3220 try
3221 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003222 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003223
3224 if (context)
3225 {
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00003226 if (target != GL_FRAMEBUFFER && target != GL_DRAW_FRAMEBUFFER_ANGLE && target != GL_READ_FRAMEBUFFER_ANGLE)
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003227 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003228 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003229 }
3230
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00003231 gl::Framebuffer *framebuffer = NULL;
3232 if (target == GL_READ_FRAMEBUFFER_ANGLE)
3233 {
3234 if(context->getReadFramebufferHandle() == 0)
3235 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003236 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00003237 }
3238
3239 framebuffer = context->getReadFramebuffer();
3240 }
3241 else
3242 {
3243 if (context->getDrawFramebufferHandle() == 0)
3244 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003245 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00003246 }
3247
3248 framebuffer = context->getDrawFramebuffer();
3249 }
3250
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003251 GLenum attachmentType;
3252 GLuint attachmentHandle;
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00003253
3254 if (attachment >= GL_COLOR_ATTACHMENT0_EXT && attachment <= GL_COLOR_ATTACHMENT15_EXT)
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003255 {
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00003256 const unsigned int colorAttachment = (attachment - GL_COLOR_ATTACHMENT0_EXT);
3257
3258 if (colorAttachment >= context->getMaximumRenderTargets())
3259 {
3260 return gl::error(GL_INVALID_ENUM);
3261 }
3262
3263 attachmentType = framebuffer->getColorbufferType(colorAttachment);
3264 attachmentHandle = framebuffer->getColorbufferHandle(colorAttachment);
3265 }
3266 else
3267 {
3268 switch (attachment)
3269 {
3270 case GL_DEPTH_ATTACHMENT:
3271 attachmentType = framebuffer->getDepthbufferType();
3272 attachmentHandle = framebuffer->getDepthbufferHandle();
3273 break;
3274 case GL_STENCIL_ATTACHMENT:
3275 attachmentType = framebuffer->getStencilbufferType();
3276 attachmentHandle = framebuffer->getStencilbufferHandle();
3277 break;
3278 default: return gl::error(GL_INVALID_ENUM);
3279 }
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003280 }
3281
3282 GLenum attachmentObjectType; // Type category
daniel@transgaming.comfbc09532010-04-26 15:33:41 +00003283 if (attachmentType == GL_NONE || attachmentType == GL_RENDERBUFFER)
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003284 {
3285 attachmentObjectType = attachmentType;
3286 }
apatrick@chromium.org551022e2012-01-23 19:56:54 +00003287 else if (gl::IsInternalTextureTarget(attachmentType))
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003288 {
3289 attachmentObjectType = GL_TEXTURE;
3290 }
apatrick@chromium.orga1d80592012-01-25 21:52:10 +00003291 else
3292 {
3293 UNREACHABLE();
3294 return;
3295 }
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003296
3297 switch (pname)
3298 {
3299 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE:
3300 *params = attachmentObjectType;
3301 break;
3302 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME:
3303 if (attachmentObjectType == GL_RENDERBUFFER || attachmentObjectType == GL_TEXTURE)
3304 {
3305 *params = attachmentHandle;
3306 }
3307 else
3308 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003309 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003310 }
3311 break;
3312 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL:
3313 if (attachmentObjectType == GL_TEXTURE)
3314 {
3315 *params = 0; // FramebufferTexture2D will not allow level to be set to anything else in GL ES 2.0
3316 }
3317 else
3318 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003319 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003320 }
3321 break;
3322 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE:
3323 if (attachmentObjectType == GL_TEXTURE)
3324 {
daniel@transgaming.com19ffc242010-05-04 03:35:21 +00003325 if (gl::IsCubemapTextureTarget(attachmentType))
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003326 {
3327 *params = attachmentType;
3328 }
3329 else
3330 {
3331 *params = 0;
3332 }
3333 }
3334 else
3335 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003336 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003337 }
3338 break;
3339 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003340 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003341 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003342 }
3343 }
3344 catch(std::bad_alloc&)
3345 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003346 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003347 }
3348}
3349
daniel@transgaming.com17f548c2011-11-09 17:47:02 +00003350GLenum __stdcall glGetGraphicsResetStatusEXT(void)
3351{
3352 EVENT("()");
3353
3354 try
3355 {
3356 gl::Context *context = gl::getContext();
3357
3358 if (context)
3359 {
3360 return context->getResetStatus();
3361 }
3362
3363 return GL_NO_ERROR;
3364 }
3365 catch(std::bad_alloc&)
3366 {
3367 return GL_OUT_OF_MEMORY;
3368 }
3369}
3370
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003371void __stdcall glGetIntegerv(GLenum pname, GLint* params)
3372{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003373 EVENT("(GLenum pname = 0x%X, GLint* params = 0x%0.8p)", pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003374
3375 try
3376 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003377 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003378
3379 if (context)
3380 {
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003381 if (!(context->getIntegerv(pname, params)))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003382 {
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003383 GLenum nativeType;
3384 unsigned int numParams = 0;
3385 if (!context->getQueryParameterInfo(pname, &nativeType, &numParams))
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003386 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003387
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003388 if (numParams == 0)
3389 return; // it is known that pname is valid, but there are no parameters to return
3390
3391 if (nativeType == GL_BOOL)
3392 {
3393 GLboolean *boolParams = NULL;
3394 boolParams = new GLboolean[numParams];
3395
3396 context->getBooleanv(pname, boolParams);
3397
3398 for (unsigned int i = 0; i < numParams; ++i)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003399 {
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003400 if (boolParams[i] == GL_FALSE)
3401 params[i] = 0;
3402 else
3403 params[i] = 1;
3404 }
3405
3406 delete [] boolParams;
3407 }
3408 else if (nativeType == GL_FLOAT)
3409 {
3410 GLfloat *floatParams = NULL;
3411 floatParams = new GLfloat[numParams];
3412
3413 context->getFloatv(pname, floatParams);
3414
3415 for (unsigned int i = 0; i < numParams; ++i)
3416 {
daniel@transgaming.comc1641352010-04-26 15:33:36 +00003417 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 +00003418 {
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003419 params[i] = (GLint)(((GLfloat)(0xFFFFFFFF) * floatParams[i] - 1.0f) / 2.0f);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003420 }
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003421 else
3422 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 +00003423 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003424
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003425 delete [] floatParams;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003426 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003427 }
3428 }
3429 }
3430 catch(std::bad_alloc&)
3431 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003432 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003433 }
3434}
3435
3436void __stdcall glGetProgramiv(GLuint program, GLenum pname, GLint* params)
3437{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003438 EVENT("(GLuint program = %d, GLenum pname = %d, GLint* params = 0x%0.8p)", program, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003439
3440 try
3441 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003442 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003443
3444 if (context)
3445 {
3446 gl::Program *programObject = context->getProgram(program);
3447
3448 if (!programObject)
3449 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003450 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003451 }
3452
3453 switch (pname)
3454 {
3455 case GL_DELETE_STATUS:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003456 *params = programObject->isFlaggedForDeletion();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003457 return;
3458 case GL_LINK_STATUS:
daniel@transgaming.com716056c2012-07-24 18:38:59 +00003459 *params = programObject->isLinked();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003460 return;
3461 case GL_VALIDATE_STATUS:
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00003462 *params = programObject->isValidated();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003463 return;
3464 case GL_INFO_LOG_LENGTH:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003465 *params = programObject->getInfoLogLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003466 return;
3467 case GL_ATTACHED_SHADERS:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003468 *params = programObject->getAttachedShadersCount();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003469 return;
3470 case GL_ACTIVE_ATTRIBUTES:
daniel@transgaming.com85423182010-04-22 13:35:27 +00003471 *params = programObject->getActiveAttributeCount();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003472 return;
3473 case GL_ACTIVE_ATTRIBUTE_MAX_LENGTH:
daniel@transgaming.com85423182010-04-22 13:35:27 +00003474 *params = programObject->getActiveAttributeMaxLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003475 return;
3476 case GL_ACTIVE_UNIFORMS:
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00003477 *params = programObject->getActiveUniformCount();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003478 return;
3479 case GL_ACTIVE_UNIFORM_MAX_LENGTH:
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00003480 *params = programObject->getActiveUniformMaxLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003481 return;
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00003482 case GL_PROGRAM_BINARY_LENGTH_OES:
apatrick@chromium.org90080e32012-07-09 22:15:33 +00003483 *params = programObject->getProgramBinaryLength();
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00003484 return;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003485 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003486 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003487 }
3488 }
3489 }
3490 catch(std::bad_alloc&)
3491 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003492 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003493 }
3494}
3495
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00003496void __stdcall glGetProgramInfoLog(GLuint program, GLsizei bufsize, GLsizei* length, GLchar* infolog)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003497{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003498 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 +00003499 program, bufsize, length, infolog);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003500
3501 try
3502 {
3503 if (bufsize < 0)
3504 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003505 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003506 }
3507
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003508 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003509
3510 if (context)
3511 {
3512 gl::Program *programObject = context->getProgram(program);
3513
3514 if (!programObject)
3515 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003516 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003517 }
3518
3519 programObject->getInfoLog(bufsize, length, infolog);
3520 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003521 }
3522 catch(std::bad_alloc&)
3523 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003524 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003525 }
3526}
3527
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003528void __stdcall glGetQueryivEXT(GLenum target, GLenum pname, GLint *params)
3529{
3530 EVENT("GLenum target = 0x%X, GLenum pname = 0x%X, GLint *params = 0x%0.8p)", target, pname, params);
3531
3532 try
3533 {
3534 switch (pname)
3535 {
3536 case GL_CURRENT_QUERY_EXT:
3537 break;
3538 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003539 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003540 }
3541
3542 gl::Context *context = gl::getNonLostContext();
3543
3544 if (context)
3545 {
3546 params[0] = context->getActiveQuery(target);
3547 }
3548 }
3549 catch(std::bad_alloc&)
3550 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003551 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003552 }
3553}
3554
3555void __stdcall glGetQueryObjectuivEXT(GLuint id, GLenum pname, GLuint *params)
3556{
3557 EVENT("(GLuint id = %d, GLenum pname = 0x%X, GLuint *params = 0x%0.8p)", id, pname, params);
3558
3559 try
3560 {
3561 switch (pname)
3562 {
3563 case GL_QUERY_RESULT_EXT:
3564 case GL_QUERY_RESULT_AVAILABLE_EXT:
3565 break;
3566 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003567 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003568 }
3569 gl::Context *context = gl::getNonLostContext();
3570
3571 if (context)
3572 {
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003573 gl::Query *queryObject = context->getQuery(id, false, GL_NONE);
3574
3575 if (!queryObject)
3576 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003577 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003578 }
3579
3580 if (context->getActiveQuery(queryObject->getType()) == id)
3581 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003582 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003583 }
3584
3585 switch(pname)
3586 {
3587 case GL_QUERY_RESULT_EXT:
3588 params[0] = queryObject->getResult();
3589 break;
3590 case GL_QUERY_RESULT_AVAILABLE_EXT:
3591 params[0] = queryObject->isResultAvailable();
3592 break;
3593 default:
3594 ASSERT(false);
3595 }
3596 }
3597 }
3598 catch(std::bad_alloc&)
3599 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003600 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003601 }
3602}
3603
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003604void __stdcall glGetRenderbufferParameteriv(GLenum target, GLenum pname, GLint* params)
3605{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003606 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 +00003607
3608 try
3609 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003610 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003611
3612 if (context)
3613 {
3614 if (target != GL_RENDERBUFFER)
3615 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003616 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003617 }
3618
daniel@transgaming.com428d1582010-05-04 03:35:25 +00003619 if (context->getRenderbufferHandle() == 0)
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003620 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003621 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003622 }
3623
daniel@transgaming.com428d1582010-05-04 03:35:25 +00003624 gl::Renderbuffer *renderbuffer = context->getRenderbuffer(context->getRenderbufferHandle());
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003625
3626 switch (pname)
3627 {
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +00003628 case GL_RENDERBUFFER_WIDTH: *params = renderbuffer->getWidth(); break;
3629 case GL_RENDERBUFFER_HEIGHT: *params = renderbuffer->getHeight(); break;
3630 case GL_RENDERBUFFER_INTERNAL_FORMAT: *params = renderbuffer->getInternalFormat(); break;
3631 case GL_RENDERBUFFER_RED_SIZE: *params = renderbuffer->getRedSize(); break;
3632 case GL_RENDERBUFFER_GREEN_SIZE: *params = renderbuffer->getGreenSize(); break;
3633 case GL_RENDERBUFFER_BLUE_SIZE: *params = renderbuffer->getBlueSize(); break;
3634 case GL_RENDERBUFFER_ALPHA_SIZE: *params = renderbuffer->getAlphaSize(); break;
3635 case GL_RENDERBUFFER_DEPTH_SIZE: *params = renderbuffer->getDepthSize(); break;
3636 case GL_RENDERBUFFER_STENCIL_SIZE: *params = renderbuffer->getStencilSize(); break;
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00003637 case GL_RENDERBUFFER_SAMPLES_ANGLE:
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +00003638 if (context->getMaxSupportedSamples() != 0)
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00003639 {
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +00003640 *params = renderbuffer->getSamples();
3641 }
3642 else
3643 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003644 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00003645 }
3646 break;
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003647 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003648 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003649 }
3650 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003651 }
3652 catch(std::bad_alloc&)
3653 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003654 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003655 }
3656}
3657
3658void __stdcall glGetShaderiv(GLuint shader, GLenum pname, GLint* params)
3659{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003660 EVENT("(GLuint shader = %d, GLenum pname = %d, GLint* params = 0x%0.8p)", shader, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003661
3662 try
3663 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003664 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003665
3666 if (context)
3667 {
3668 gl::Shader *shaderObject = context->getShader(shader);
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00003669
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003670 if (!shaderObject)
3671 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003672 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003673 }
3674
3675 switch (pname)
3676 {
3677 case GL_SHADER_TYPE:
3678 *params = shaderObject->getType();
3679 return;
3680 case GL_DELETE_STATUS:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003681 *params = shaderObject->isFlaggedForDeletion();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003682 return;
3683 case GL_COMPILE_STATUS:
3684 *params = shaderObject->isCompiled() ? GL_TRUE : GL_FALSE;
3685 return;
3686 case GL_INFO_LOG_LENGTH:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003687 *params = shaderObject->getInfoLogLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003688 return;
3689 case GL_SHADER_SOURCE_LENGTH:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003690 *params = shaderObject->getSourceLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003691 return;
zmo@google.coma574f782011-10-03 21:45:23 +00003692 case GL_TRANSLATED_SHADER_SOURCE_LENGTH_ANGLE:
3693 *params = shaderObject->getTranslatedSourceLength();
3694 return;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003695 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003696 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003697 }
3698 }
3699 }
3700 catch(std::bad_alloc&)
3701 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003702 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003703 }
3704}
3705
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00003706void __stdcall glGetShaderInfoLog(GLuint shader, GLsizei bufsize, GLsizei* length, GLchar* infolog)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003707{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003708 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 +00003709 shader, bufsize, length, infolog);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003710
3711 try
3712 {
3713 if (bufsize < 0)
3714 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003715 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003716 }
3717
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003718 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003719
3720 if (context)
3721 {
3722 gl::Shader *shaderObject = context->getShader(shader);
3723
3724 if (!shaderObject)
3725 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003726 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003727 }
3728
3729 shaderObject->getInfoLog(bufsize, length, infolog);
3730 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003731 }
3732 catch(std::bad_alloc&)
3733 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003734 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003735 }
3736}
3737
3738void __stdcall glGetShaderPrecisionFormat(GLenum shadertype, GLenum precisiontype, GLint* range, GLint* precision)
3739{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003740 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 +00003741 shadertype, precisiontype, range, precision);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003742
3743 try
3744 {
daniel@transgaming.com6c785212010-03-30 03:36:17 +00003745 switch (shadertype)
3746 {
3747 case GL_VERTEX_SHADER:
3748 case GL_FRAGMENT_SHADER:
3749 break;
3750 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003751 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com6c785212010-03-30 03:36:17 +00003752 }
3753
3754 switch (precisiontype)
3755 {
3756 case GL_LOW_FLOAT:
3757 case GL_MEDIUM_FLOAT:
3758 case GL_HIGH_FLOAT:
3759 // Assume IEEE 754 precision
3760 range[0] = 127;
3761 range[1] = 127;
daniel@transgaming.comc5c15382010-04-23 18:34:49 +00003762 *precision = 23;
daniel@transgaming.com6c785212010-03-30 03:36:17 +00003763 break;
3764 case GL_LOW_INT:
3765 case GL_MEDIUM_INT:
3766 case GL_HIGH_INT:
3767 // Some (most) hardware only supports single-precision floating-point numbers,
3768 // which can accurately represent integers up to +/-16777216
3769 range[0] = 24;
3770 range[1] = 24;
daniel@transgaming.comc5c15382010-04-23 18:34:49 +00003771 *precision = 0;
daniel@transgaming.com6c785212010-03-30 03:36:17 +00003772 break;
3773 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003774 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com6c785212010-03-30 03:36:17 +00003775 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003776 }
3777 catch(std::bad_alloc&)
3778 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003779 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003780 }
3781}
3782
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00003783void __stdcall glGetShaderSource(GLuint shader, GLsizei bufsize, GLsizei* length, GLchar* source)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003784{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003785 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 +00003786 shader, bufsize, length, source);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003787
3788 try
3789 {
3790 if (bufsize < 0)
3791 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003792 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003793 }
3794
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003795 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003796
3797 if (context)
3798 {
3799 gl::Shader *shaderObject = context->getShader(shader);
3800
3801 if (!shaderObject)
3802 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003803 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003804 }
3805
3806 shaderObject->getSource(bufsize, length, source);
3807 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003808 }
3809 catch(std::bad_alloc&)
3810 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003811 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003812 }
3813}
3814
zmo@google.coma574f782011-10-03 21:45:23 +00003815void __stdcall glGetTranslatedShaderSourceANGLE(GLuint shader, GLsizei bufsize, GLsizei* length, GLchar* source)
3816{
3817 EVENT("(GLuint shader = %d, GLsizei bufsize = %d, GLsizei* length = 0x%0.8p, GLchar* source = 0x%0.8p)",
3818 shader, bufsize, length, source);
3819
3820 try
3821 {
3822 if (bufsize < 0)
3823 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003824 return gl::error(GL_INVALID_VALUE);
zmo@google.coma574f782011-10-03 21:45:23 +00003825 }
3826
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003827 gl::Context *context = gl::getNonLostContext();
zmo@google.coma574f782011-10-03 21:45:23 +00003828
3829 if (context)
3830 {
3831 gl::Shader *shaderObject = context->getShader(shader);
3832
3833 if (!shaderObject)
3834 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003835 return gl::error(GL_INVALID_OPERATION);
zmo@google.coma574f782011-10-03 21:45:23 +00003836 }
3837
3838 shaderObject->getTranslatedSource(bufsize, length, source);
3839 }
3840 }
3841 catch(std::bad_alloc&)
3842 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003843 return gl::error(GL_OUT_OF_MEMORY);
zmo@google.coma574f782011-10-03 21:45:23 +00003844 }
3845}
3846
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003847const GLubyte* __stdcall glGetString(GLenum name)
3848{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003849 EVENT("(GLenum name = 0x%X)", name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003850
3851 try
3852 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003853 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com3e4c6002010-05-05 18:50:13 +00003854
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003855 switch (name)
3856 {
3857 case GL_VENDOR:
daniel@transgaming.coma0ce7e62011-01-25 14:47:16 +00003858 return (GLubyte*)"Google Inc.";
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003859 case GL_RENDERER:
daniel@transgaming.comc23ff642011-08-16 20:28:45 +00003860 return (GLubyte*)((context != NULL) ? context->getRendererString() : "ANGLE");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003861 case GL_VERSION:
daniel@transgaming.com1825d8e2012-08-27 16:25:29 +00003862 return (GLubyte*)"OpenGL ES 2.0 (ANGLE " VERSION_STRING ")";
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003863 case GL_SHADING_LANGUAGE_VERSION:
daniel@transgaming.com1825d8e2012-08-27 16:25:29 +00003864 return (GLubyte*)"OpenGL ES GLSL ES 1.00 (ANGLE " VERSION_STRING ")";
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003865 case GL_EXTENSIONS:
daniel@transgaming.com3e4c6002010-05-05 18:50:13 +00003866 return (GLubyte*)((context != NULL) ? context->getExtensionString() : "");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003867 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003868 return gl::error(GL_INVALID_ENUM, (GLubyte*)NULL);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003869 }
3870 }
3871 catch(std::bad_alloc&)
3872 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003873 return gl::error(GL_OUT_OF_MEMORY, (GLubyte*)NULL);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003874 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003875}
3876
3877void __stdcall glGetTexParameterfv(GLenum target, GLenum pname, GLfloat* params)
3878{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003879 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 +00003880
3881 try
3882 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003883 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003884
3885 if (context)
3886 {
3887 gl::Texture *texture;
3888
3889 switch (target)
3890 {
3891 case GL_TEXTURE_2D:
3892 texture = context->getTexture2D();
3893 break;
3894 case GL_TEXTURE_CUBE_MAP:
3895 texture = context->getTextureCubeMap();
3896 break;
3897 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003898 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003899 }
3900
3901 switch (pname)
3902 {
3903 case GL_TEXTURE_MAG_FILTER:
3904 *params = (GLfloat)texture->getMagFilter();
3905 break;
3906 case GL_TEXTURE_MIN_FILTER:
3907 *params = (GLfloat)texture->getMinFilter();
3908 break;
3909 case GL_TEXTURE_WRAP_S:
3910 *params = (GLfloat)texture->getWrapS();
3911 break;
3912 case GL_TEXTURE_WRAP_T:
3913 *params = (GLfloat)texture->getWrapT();
3914 break;
daniel@transgaming.comd30bd0a2011-11-11 04:10:34 +00003915 case GL_TEXTURE_IMMUTABLE_FORMAT_EXT:
3916 *params = (GLfloat)(texture->isImmutable() ? GL_TRUE : GL_FALSE);
3917 break;
daniel@transgaming.com7d18c172011-11-11 04:18:21 +00003918 case GL_TEXTURE_USAGE_ANGLE:
3919 *params = (GLfloat)texture->getUsage();
3920 break;
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00003921 case GL_TEXTURE_MAX_ANISOTROPY_EXT:
3922 if (!context->supportsTextureFilterAnisotropy())
3923 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003924 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00003925 }
3926 *params = (GLfloat)texture->getMaxAnisotropy();
3927 break;
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003928 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003929 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003930 }
3931 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003932 }
3933 catch(std::bad_alloc&)
3934 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003935 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003936 }
3937}
3938
3939void __stdcall glGetTexParameteriv(GLenum target, GLenum pname, GLint* params)
3940{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003941 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 +00003942
3943 try
3944 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003945 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003946
3947 if (context)
3948 {
3949 gl::Texture *texture;
3950
3951 switch (target)
3952 {
3953 case GL_TEXTURE_2D:
3954 texture = context->getTexture2D();
3955 break;
3956 case GL_TEXTURE_CUBE_MAP:
3957 texture = context->getTextureCubeMap();
3958 break;
3959 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003960 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003961 }
3962
3963 switch (pname)
3964 {
3965 case GL_TEXTURE_MAG_FILTER:
3966 *params = texture->getMagFilter();
3967 break;
3968 case GL_TEXTURE_MIN_FILTER:
3969 *params = texture->getMinFilter();
3970 break;
3971 case GL_TEXTURE_WRAP_S:
3972 *params = texture->getWrapS();
3973 break;
3974 case GL_TEXTURE_WRAP_T:
3975 *params = texture->getWrapT();
3976 break;
daniel@transgaming.comd30bd0a2011-11-11 04:10:34 +00003977 case GL_TEXTURE_IMMUTABLE_FORMAT_EXT:
3978 *params = texture->isImmutable() ? GL_TRUE : GL_FALSE;
3979 break;
daniel@transgaming.com7d18c172011-11-11 04:18:21 +00003980 case GL_TEXTURE_USAGE_ANGLE:
3981 *params = texture->getUsage();
3982 break;
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00003983 case GL_TEXTURE_MAX_ANISOTROPY_EXT:
3984 if (!context->supportsTextureFilterAnisotropy())
3985 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003986 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00003987 }
3988 *params = (GLint)texture->getMaxAnisotropy();
3989 break;
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003990 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003991 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003992 }
3993 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003994 }
3995 catch(std::bad_alloc&)
3996 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003997 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003998 }
3999}
4000
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004001void __stdcall glGetnUniformfvEXT(GLuint program, GLint location, GLsizei bufSize, GLfloat* params)
4002{
4003 EVENT("(GLuint program = %d, GLint location = %d, GLsizei bufSize = %d, GLfloat* params = 0x%0.8p)",
4004 program, location, bufSize, params);
4005
4006 try
4007 {
4008 if (bufSize < 0)
4009 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004010 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004011 }
4012
4013 gl::Context *context = gl::getNonLostContext();
4014
4015 if (context)
4016 {
4017 if (program == 0)
4018 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004019 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004020 }
4021
4022 gl::Program *programObject = context->getProgram(program);
4023
daniel@transgaming.com716056c2012-07-24 18:38:59 +00004024 if (!programObject || !programObject->isLinked())
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004025 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004026 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004027 }
4028
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00004029 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
4030 if (!programBinary)
4031 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004032 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00004033 }
4034
4035 if (!programBinary->getUniformfv(location, &bufSize, params))
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004036 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004037 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004038 }
4039 }
4040 }
4041 catch(std::bad_alloc&)
4042 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004043 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004044 }
4045}
4046
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004047void __stdcall glGetUniformfv(GLuint program, GLint location, GLfloat* params)
4048{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004049 EVENT("(GLuint program = %d, GLint location = %d, GLfloat* params = 0x%0.8p)", program, location, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004050
4051 try
4052 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004053 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004054
4055 if (context)
4056 {
4057 if (program == 0)
4058 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004059 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004060 }
4061
4062 gl::Program *programObject = context->getProgram(program);
4063
daniel@transgaming.com716056c2012-07-24 18:38:59 +00004064 if (!programObject || !programObject->isLinked())
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004065 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004066 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004067 }
4068
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00004069 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
4070 if (!programBinary)
4071 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004072 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00004073 }
4074
4075 if (!programBinary->getUniformfv(location, NULL, params))
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004076 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004077 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004078 }
4079 }
4080 }
4081 catch(std::bad_alloc&)
4082 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004083 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004084 }
4085}
4086
4087void __stdcall glGetnUniformivEXT(GLuint program, GLint location, GLsizei bufSize, GLint* params)
4088{
4089 EVENT("(GLuint program = %d, GLint location = %d, GLsizei bufSize = %d, GLint* params = 0x%0.8p)",
4090 program, location, bufSize, params);
4091
4092 try
4093 {
4094 if (bufSize < 0)
4095 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004096 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004097 }
4098
4099 gl::Context *context = gl::getNonLostContext();
4100
4101 if (context)
4102 {
4103 if (program == 0)
4104 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004105 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004106 }
4107
4108 gl::Program *programObject = context->getProgram(program);
4109
daniel@transgaming.com716056c2012-07-24 18:38:59 +00004110 if (!programObject || !programObject->isLinked())
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004111 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004112 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004113 }
4114
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00004115 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
4116 if (!programBinary)
4117 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004118 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00004119 }
4120
4121 if (!programBinary->getUniformiv(location, &bufSize, params))
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004122 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004123 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004124 }
4125 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004126 }
4127 catch(std::bad_alloc&)
4128 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004129 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004130 }
4131}
4132
4133void __stdcall glGetUniformiv(GLuint program, GLint location, GLint* params)
4134{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004135 EVENT("(GLuint program = %d, GLint location = %d, GLint* params = 0x%0.8p)", program, location, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004136
4137 try
4138 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004139 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004140
4141 if (context)
4142 {
4143 if (program == 0)
4144 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004145 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004146 }
4147
4148 gl::Program *programObject = context->getProgram(program);
4149
daniel@transgaming.com716056c2012-07-24 18:38:59 +00004150 if (!programObject || !programObject->isLinked())
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004151 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004152 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004153 }
4154
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00004155 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
4156 if (!programBinary)
4157 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004158 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00004159 }
4160
4161 if (!programBinary->getUniformiv(location, NULL, params))
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004162 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004163 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004164 }
4165 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004166 }
4167 catch(std::bad_alloc&)
4168 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004169 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004170 }
4171}
4172
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00004173int __stdcall glGetUniformLocation(GLuint program, const GLchar* name)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004174{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004175 EVENT("(GLuint program = %d, const GLchar* name = 0x%0.8p)", program, name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004176
4177 try
4178 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004179 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004180
4181 if (strstr(name, "gl_") == name)
4182 {
4183 return -1;
4184 }
4185
4186 if (context)
4187 {
4188 gl::Program *programObject = context->getProgram(program);
4189
4190 if (!programObject)
4191 {
daniel@transgaming.comd1abe5b2010-04-13 19:53:33 +00004192 if (context->getShader(program))
4193 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004194 return gl::error(GL_INVALID_OPERATION, -1);
daniel@transgaming.comd1abe5b2010-04-13 19:53:33 +00004195 }
4196 else
4197 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004198 return gl::error(GL_INVALID_VALUE, -1);
daniel@transgaming.comd1abe5b2010-04-13 19:53:33 +00004199 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004200 }
4201
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00004202 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
daniel@transgaming.com716056c2012-07-24 18:38:59 +00004203 if (!programObject->isLinked() || !programBinary)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004204 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004205 return gl::error(GL_INVALID_OPERATION, -1);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004206 }
4207
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00004208 return programBinary->getUniformLocation(name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004209 }
4210 }
4211 catch(std::bad_alloc&)
4212 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004213 return gl::error(GL_OUT_OF_MEMORY, -1);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004214 }
4215
4216 return -1;
4217}
4218
4219void __stdcall glGetVertexAttribfv(GLuint index, GLenum pname, GLfloat* params)
4220{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004221 EVENT("(GLuint index = %d, GLenum pname = 0x%X, GLfloat* params = 0x%0.8p)", index, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004222
4223 try
4224 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004225 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004226
daniel@transgaming.come0078962010-04-15 20:45:08 +00004227 if (context)
4228 {
4229 if (index >= gl::MAX_VERTEX_ATTRIBS)
4230 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004231 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004232 }
4233
daniel@transgaming.com83921382011-01-08 05:46:00 +00004234 const gl::VertexAttribute &attribState = context->getVertexAttribState(index);
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004235
daniel@transgaming.come0078962010-04-15 20:45:08 +00004236 switch (pname)
4237 {
4238 case GL_VERTEX_ATTRIB_ARRAY_ENABLED:
daniel@transgaming.com83921382011-01-08 05:46:00 +00004239 *params = (GLfloat)(attribState.mArrayEnabled ? GL_TRUE : GL_FALSE);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004240 break;
4241 case GL_VERTEX_ATTRIB_ARRAY_SIZE:
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004242 *params = (GLfloat)attribState.mSize;
daniel@transgaming.come0078962010-04-15 20:45:08 +00004243 break;
4244 case GL_VERTEX_ATTRIB_ARRAY_STRIDE:
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004245 *params = (GLfloat)attribState.mStride;
daniel@transgaming.come0078962010-04-15 20:45:08 +00004246 break;
4247 case GL_VERTEX_ATTRIB_ARRAY_TYPE:
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004248 *params = (GLfloat)attribState.mType;
daniel@transgaming.come0078962010-04-15 20:45:08 +00004249 break;
4250 case GL_VERTEX_ATTRIB_ARRAY_NORMALIZED:
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004251 *params = (GLfloat)(attribState.mNormalized ? GL_TRUE : GL_FALSE);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004252 break;
4253 case GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING:
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +00004254 *params = (GLfloat)attribState.mBoundBuffer.id();
daniel@transgaming.come0078962010-04-15 20:45:08 +00004255 break;
4256 case GL_CURRENT_VERTEX_ATTRIB:
4257 for (int i = 0; i < 4; ++i)
4258 {
shannon.woods%transgaming.com@gtempaccount.com3026dc72013-04-13 03:37:27 +00004259 params[i] = attribState.mCurrentValue.FloatValues[i];
daniel@transgaming.come0078962010-04-15 20:45:08 +00004260 }
4261 break;
shannon.woods%transgaming.com@gtempaccount.com14eb55e2013-04-13 03:35:06 +00004262 case GL_VERTEX_ATTRIB_ARRAY_DIVISOR:
4263 // Don't verify ES3 context because GL_VERTEX_ATTRIB_ARRAY_DIVISOR_ANGLE uses
4264 // the same constant.
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00004265 *params = (GLfloat)attribState.mDivisor;
4266 break;
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004267 default: return gl::error(GL_INVALID_ENUM);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004268 }
4269 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004270 }
4271 catch(std::bad_alloc&)
4272 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004273 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004274 }
4275}
4276
4277void __stdcall glGetVertexAttribiv(GLuint index, GLenum pname, GLint* params)
4278{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004279 EVENT("(GLuint index = %d, GLenum pname = 0x%X, GLint* params = 0x%0.8p)", index, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004280
4281 try
4282 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004283 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004284
daniel@transgaming.come0078962010-04-15 20:45:08 +00004285 if (context)
4286 {
4287 if (index >= gl::MAX_VERTEX_ATTRIBS)
4288 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004289 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004290 }
4291
daniel@transgaming.com83921382011-01-08 05:46:00 +00004292 const gl::VertexAttribute &attribState = context->getVertexAttribState(index);
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004293
daniel@transgaming.come0078962010-04-15 20:45:08 +00004294 switch (pname)
4295 {
4296 case GL_VERTEX_ATTRIB_ARRAY_ENABLED:
daniel@transgaming.com83921382011-01-08 05:46:00 +00004297 *params = (attribState.mArrayEnabled ? GL_TRUE : GL_FALSE);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004298 break;
4299 case GL_VERTEX_ATTRIB_ARRAY_SIZE:
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004300 *params = attribState.mSize;
daniel@transgaming.come0078962010-04-15 20:45:08 +00004301 break;
4302 case GL_VERTEX_ATTRIB_ARRAY_STRIDE:
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004303 *params = attribState.mStride;
daniel@transgaming.come0078962010-04-15 20:45:08 +00004304 break;
4305 case GL_VERTEX_ATTRIB_ARRAY_TYPE:
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004306 *params = attribState.mType;
daniel@transgaming.come0078962010-04-15 20:45:08 +00004307 break;
4308 case GL_VERTEX_ATTRIB_ARRAY_NORMALIZED:
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004309 *params = (attribState.mNormalized ? GL_TRUE : GL_FALSE);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004310 break;
4311 case GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING:
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +00004312 *params = attribState.mBoundBuffer.id();
daniel@transgaming.come0078962010-04-15 20:45:08 +00004313 break;
4314 case GL_CURRENT_VERTEX_ATTRIB:
4315 for (int i = 0; i < 4; ++i)
4316 {
shannon.woods%transgaming.com@gtempaccount.com3026dc72013-04-13 03:37:27 +00004317 float currentValue = attribState.mCurrentValue.FloatValues[i];
daniel@transgaming.come0078962010-04-15 20:45:08 +00004318 params[i] = (GLint)(currentValue > 0.0f ? floor(currentValue + 0.5f) : ceil(currentValue - 0.5f));
4319 }
4320 break;
shannon.woods%transgaming.com@gtempaccount.com14eb55e2013-04-13 03:35:06 +00004321 case GL_VERTEX_ATTRIB_ARRAY_DIVISOR:
4322 // Don't verify ES3 context because GL_VERTEX_ATTRIB_ARRAY_DIVISOR_ANGLE uses
4323 // the same constant.
4324 META_ASSERT(GL_VERTEX_ATTRIB_ARRAY_DIVISOR == GL_VERTEX_ATTRIB_ARRAY_DIVISOR_ANGLE);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00004325 *params = (GLint)attribState.mDivisor;
4326 break;
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004327 default: return gl::error(GL_INVALID_ENUM);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004328 }
4329 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004330 }
4331 catch(std::bad_alloc&)
4332 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004333 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004334 }
4335}
4336
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00004337void __stdcall glGetVertexAttribPointerv(GLuint index, GLenum pname, GLvoid** pointer)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004338{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004339 EVENT("(GLuint index = %d, GLenum pname = 0x%X, GLvoid** pointer = 0x%0.8p)", index, pname, pointer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004340
4341 try
4342 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004343 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004344
daniel@transgaming.come0078962010-04-15 20:45:08 +00004345 if (context)
4346 {
4347 if (index >= gl::MAX_VERTEX_ATTRIBS)
4348 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004349 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004350 }
4351
4352 if (pname != GL_VERTEX_ATTRIB_ARRAY_POINTER)
4353 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004354 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004355 }
4356
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004357 *pointer = const_cast<GLvoid*>(context->getVertexAttribPointer(index));
daniel@transgaming.come0078962010-04-15 20:45:08 +00004358 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004359 }
4360 catch(std::bad_alloc&)
4361 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004362 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004363 }
4364}
4365
4366void __stdcall glHint(GLenum target, GLenum mode)
4367{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004368 EVENT("(GLenum target = 0x%X, GLenum mode = 0x%X)", target, mode);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004369
4370 try
4371 {
alokp@chromium.orgd303ef92010-09-09 17:30:15 +00004372 switch (mode)
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00004373 {
alokp@chromium.orgd303ef92010-09-09 17:30:15 +00004374 case GL_FASTEST:
4375 case GL_NICEST:
4376 case GL_DONT_CARE:
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00004377 break;
4378 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004379 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00004380 }
4381
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004382 gl::Context *context = gl::getNonLostContext();
alokp@chromium.orgd303ef92010-09-09 17:30:15 +00004383 switch (target)
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00004384 {
alokp@chromium.orgd303ef92010-09-09 17:30:15 +00004385 case GL_GENERATE_MIPMAP_HINT:
4386 if (context) context->setGenerateMipmapHint(mode);
4387 break;
4388 case GL_FRAGMENT_SHADER_DERIVATIVE_HINT_OES:
4389 if (context) context->setFragmentShaderDerivativeHint(mode);
4390 break;
4391 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004392 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00004393 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004394 }
4395 catch(std::bad_alloc&)
4396 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004397 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004398 }
4399}
4400
4401GLboolean __stdcall glIsBuffer(GLuint buffer)
4402{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004403 EVENT("(GLuint buffer = %d)", buffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004404
4405 try
4406 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004407 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004408
4409 if (context && buffer)
4410 {
4411 gl::Buffer *bufferObject = context->getBuffer(buffer);
4412
4413 if (bufferObject)
4414 {
4415 return GL_TRUE;
4416 }
4417 }
4418 }
4419 catch(std::bad_alloc&)
4420 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004421 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004422 }
4423
4424 return GL_FALSE;
4425}
4426
4427GLboolean __stdcall glIsEnabled(GLenum cap)
4428{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004429 EVENT("(GLenum cap = 0x%X)", cap);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004430
4431 try
4432 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004433 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004434
4435 if (context)
4436 {
4437 switch (cap)
4438 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004439 case GL_CULL_FACE: return context->isCullFaceEnabled();
4440 case GL_POLYGON_OFFSET_FILL: return context->isPolygonOffsetFillEnabled();
4441 case GL_SAMPLE_ALPHA_TO_COVERAGE: return context->isSampleAlphaToCoverageEnabled();
4442 case GL_SAMPLE_COVERAGE: return context->isSampleCoverageEnabled();
4443 case GL_SCISSOR_TEST: return context->isScissorTestEnabled();
4444 case GL_STENCIL_TEST: return context->isStencilTestEnabled();
4445 case GL_DEPTH_TEST: return context->isDepthTestEnabled();
4446 case GL_BLEND: return context->isBlendEnabled();
4447 case GL_DITHER: return context->isDitherEnabled();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004448 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004449 return gl::error(GL_INVALID_ENUM, false);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004450 }
4451 }
4452 }
4453 catch(std::bad_alloc&)
4454 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004455 return gl::error(GL_OUT_OF_MEMORY, false);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004456 }
4457
4458 return false;
4459}
4460
daniel@transgaming.comfe208882010-09-01 15:47:57 +00004461GLboolean __stdcall glIsFenceNV(GLuint fence)
4462{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004463 EVENT("(GLuint fence = %d)", fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004464
4465 try
4466 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004467 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004468
4469 if (context)
4470 {
4471 gl::Fence *fenceObject = context->getFence(fence);
4472
4473 if (fenceObject == NULL)
4474 {
4475 return GL_FALSE;
4476 }
4477
4478 return fenceObject->isFence();
4479 }
4480 }
4481 catch(std::bad_alloc&)
4482 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004483 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004484 }
4485
4486 return GL_FALSE;
daniel@transgaming.comfe208882010-09-01 15:47:57 +00004487}
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004488
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004489GLboolean __stdcall glIsFramebuffer(GLuint framebuffer)
4490{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004491 EVENT("(GLuint framebuffer = %d)", framebuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004492
4493 try
4494 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004495 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004496
4497 if (context && framebuffer)
4498 {
4499 gl::Framebuffer *framebufferObject = context->getFramebuffer(framebuffer);
4500
4501 if (framebufferObject)
4502 {
4503 return GL_TRUE;
4504 }
4505 }
4506 }
4507 catch(std::bad_alloc&)
4508 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004509 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004510 }
4511
4512 return GL_FALSE;
4513}
4514
4515GLboolean __stdcall glIsProgram(GLuint program)
4516{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004517 EVENT("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004518
4519 try
4520 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004521 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004522
4523 if (context && program)
4524 {
4525 gl::Program *programObject = context->getProgram(program);
4526
4527 if (programObject)
4528 {
4529 return GL_TRUE;
4530 }
4531 }
4532 }
4533 catch(std::bad_alloc&)
4534 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004535 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004536 }
4537
4538 return GL_FALSE;
4539}
4540
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00004541GLboolean __stdcall glIsQueryEXT(GLuint id)
4542{
4543 EVENT("(GLuint id = %d)", id);
4544
4545 try
4546 {
4547 if (id == 0)
4548 {
4549 return GL_FALSE;
4550 }
4551
4552 gl::Context *context = gl::getNonLostContext();
4553
4554 if (context)
4555 {
4556 gl::Query *queryObject = context->getQuery(id, false, GL_NONE);
4557
4558 if (queryObject)
4559 {
4560 return GL_TRUE;
4561 }
4562 }
4563 }
4564 catch(std::bad_alloc&)
4565 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004566 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00004567 }
4568
4569 return GL_FALSE;
4570}
4571
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004572GLboolean __stdcall glIsRenderbuffer(GLuint renderbuffer)
4573{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004574 EVENT("(GLuint renderbuffer = %d)", renderbuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004575
4576 try
4577 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004578 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004579
4580 if (context && renderbuffer)
4581 {
4582 gl::Renderbuffer *renderbufferObject = context->getRenderbuffer(renderbuffer);
4583
4584 if (renderbufferObject)
4585 {
4586 return GL_TRUE;
4587 }
4588 }
4589 }
4590 catch(std::bad_alloc&)
4591 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004592 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004593 }
4594
4595 return GL_FALSE;
4596}
4597
4598GLboolean __stdcall glIsShader(GLuint shader)
4599{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004600 EVENT("(GLuint shader = %d)", shader);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004601
4602 try
4603 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004604 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004605
4606 if (context && shader)
4607 {
4608 gl::Shader *shaderObject = context->getShader(shader);
4609
4610 if (shaderObject)
4611 {
4612 return GL_TRUE;
4613 }
4614 }
4615 }
4616 catch(std::bad_alloc&)
4617 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004618 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004619 }
4620
4621 return GL_FALSE;
4622}
4623
4624GLboolean __stdcall glIsTexture(GLuint texture)
4625{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004626 EVENT("(GLuint texture = %d)", texture);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004627
4628 try
4629 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004630 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004631
4632 if (context && texture)
4633 {
4634 gl::Texture *textureObject = context->getTexture(texture);
4635
4636 if (textureObject)
4637 {
4638 return GL_TRUE;
4639 }
4640 }
4641 }
4642 catch(std::bad_alloc&)
4643 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004644 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004645 }
4646
4647 return GL_FALSE;
4648}
4649
4650void __stdcall glLineWidth(GLfloat width)
4651{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004652 EVENT("(GLfloat width = %f)", width);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004653
4654 try
4655 {
4656 if (width <= 0.0f)
4657 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004658 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004659 }
4660
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004661 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com32e58cd2010-03-24 09:44:10 +00004662
4663 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004664 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004665 context->setLineWidth(width);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004666 }
4667 }
4668 catch(std::bad_alloc&)
4669 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004670 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004671 }
4672}
4673
4674void __stdcall glLinkProgram(GLuint program)
4675{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004676 EVENT("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004677
4678 try
4679 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004680 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004681
4682 if (context)
4683 {
4684 gl::Program *programObject = context->getProgram(program);
4685
4686 if (!programObject)
4687 {
daniel@transgaming.com277b7142010-04-13 03:26:44 +00004688 if (context->getShader(program))
4689 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004690 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com277b7142010-04-13 03:26:44 +00004691 }
4692 else
4693 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004694 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com277b7142010-04-13 03:26:44 +00004695 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004696 }
4697
daniel@transgaming.com95d29422012-07-24 18:36:10 +00004698 context->linkProgram(program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004699 }
4700 }
4701 catch(std::bad_alloc&)
4702 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004703 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004704 }
4705}
4706
4707void __stdcall glPixelStorei(GLenum pname, GLint param)
4708{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004709 EVENT("(GLenum pname = 0x%X, GLint param = %d)", pname, param);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004710
4711 try
4712 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004713 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004714
4715 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004716 {
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004717 switch (pname)
4718 {
4719 case GL_UNPACK_ALIGNMENT:
4720 if (param != 1 && param != 2 && param != 4 && param != 8)
4721 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004722 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004723 }
4724
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004725 context->setUnpackAlignment(param);
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004726 break;
4727
4728 case GL_PACK_ALIGNMENT:
4729 if (param != 1 && param != 2 && param != 4 && param != 8)
4730 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004731 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004732 }
4733
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004734 context->setPackAlignment(param);
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004735 break;
4736
bsalomon@google.com56d46ab2011-11-23 14:53:10 +00004737 case GL_PACK_REVERSE_ROW_ORDER_ANGLE:
4738 context->setPackReverseRowOrder(param != 0);
4739 break;
4740
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004741 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004742 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004743 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004744 }
4745 }
4746 catch(std::bad_alloc&)
4747 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004748 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004749 }
4750}
4751
4752void __stdcall glPolygonOffset(GLfloat factor, GLfloat units)
4753{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004754 EVENT("(GLfloat factor = %f, GLfloat units = %f)", factor, units);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004755
4756 try
4757 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004758 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comaede6302010-04-29 03:35:48 +00004759
4760 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004761 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004762 context->setPolygonOffsetParams(factor, units);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004763 }
4764 }
4765 catch(std::bad_alloc&)
4766 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004767 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004768 }
4769}
4770
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00004771void __stdcall glReadnPixelsEXT(GLint x, GLint y, GLsizei width, GLsizei height,
4772 GLenum format, GLenum type, GLsizei bufSize,
4773 GLvoid *data)
4774{
4775 EVENT("(GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d, "
4776 "GLenum format = 0x%X, GLenum type = 0x%X, GLsizei bufSize = 0x%d, GLvoid *data = 0x%0.8p)",
4777 x, y, width, height, format, type, bufSize, data);
4778
4779 try
4780 {
4781 if (width < 0 || height < 0 || bufSize < 0)
4782 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004783 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00004784 }
4785
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00004786 gl::Context *context = gl::getNonLostContext();
4787
4788 if (context)
4789 {
daniel@transgaming.com42944b02012-09-27 17:45:57 +00004790 GLenum currentFormat, currentType;
4791
4792 // Failure in getCurrentReadFormatType indicates that no color attachment is currently bound,
4793 // and attempting to read back if that's the case is an error. The error will be registered
4794 // by getCurrentReadFormat.
4795 if (!context->getCurrentReadFormatType(&currentFormat, &currentType))
4796 return;
4797
4798 if (!(currentFormat == format && currentType == type) && !validReadFormatType(format, type))
4799 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004800 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com42944b02012-09-27 17:45:57 +00004801 }
4802
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00004803 context->readPixels(x, y, width, height, format, type, &bufSize, data);
4804 }
4805 }
4806 catch(std::bad_alloc&)
4807 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004808 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00004809 }
4810}
4811
4812void __stdcall glReadPixels(GLint x, GLint y, GLsizei width, GLsizei height,
4813 GLenum format, GLenum type, GLvoid* pixels)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004814{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004815 EVENT("(GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00004816 "GLenum format = 0x%X, GLenum type = 0x%X, GLvoid* pixels = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00004817 x, y, width, height, format, type, pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004818
4819 try
4820 {
4821 if (width < 0 || height < 0)
4822 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004823 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004824 }
4825
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004826 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004827
4828 if (context)
4829 {
daniel@transgaming.com42944b02012-09-27 17:45:57 +00004830 GLenum currentFormat, currentType;
4831
4832 // Failure in getCurrentReadFormatType indicates that no color attachment is currently bound,
4833 // and attempting to read back if that's the case is an error. The error will be registered
4834 // by getCurrentReadFormat.
4835 if (!context->getCurrentReadFormatType(&currentFormat, &currentType))
4836 return;
4837
4838 if (!(currentFormat == format && currentType == type) && !validReadFormatType(format, type))
4839 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004840 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com42944b02012-09-27 17:45:57 +00004841 }
4842
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00004843 context->readPixels(x, y, width, height, format, type, NULL, pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004844 }
4845 }
4846 catch(std::bad_alloc&)
4847 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004848 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004849 }
4850}
4851
4852void __stdcall glReleaseShaderCompiler(void)
4853{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004854 EVENT("()");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004855
4856 try
4857 {
4858 gl::Shader::releaseCompiler();
4859 }
4860 catch(std::bad_alloc&)
4861 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004862 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004863 }
4864}
4865
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00004866void __stdcall glRenderbufferStorageMultisampleANGLE(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004867{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004868 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 +00004869 target, samples, internalformat, width, height);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004870
4871 try
4872 {
4873 switch (target)
4874 {
4875 case GL_RENDERBUFFER:
4876 break;
4877 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004878 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004879 }
4880
daniel@transgaming.comedc19182010-10-15 17:57:55 +00004881 if (!gl::IsColorRenderable(internalformat) && !gl::IsDepthRenderable(internalformat) && !gl::IsStencilRenderable(internalformat))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004882 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004883 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004884 }
4885
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00004886 if (width < 0 || height < 0 || samples < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004887 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004888 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004889 }
4890
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004891 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004892
4893 if (context)
4894 {
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00004895 if (width > context->getMaximumRenderbufferDimension() ||
4896 height > context->getMaximumRenderbufferDimension() ||
4897 samples > context->getMaxSupportedSamples())
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00004898 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004899 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00004900 }
4901
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +00004902 GLuint handle = context->getRenderbufferHandle();
4903 if (handle == 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004904 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004905 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004906 }
4907
4908 switch (internalformat)
4909 {
4910 case GL_DEPTH_COMPONENT16:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004911 case GL_RGBA4:
4912 case GL_RGB5_A1:
4913 case GL_RGB565:
daniel@transgaming.com63977542010-08-24 19:21:02 +00004914 case GL_RGB8_OES:
4915 case GL_RGBA8_OES:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004916 case GL_STENCIL_INDEX8:
daniel@transgaming.comcdacc8e2010-07-28 19:20:50 +00004917 case GL_DEPTH24_STENCIL8_OES:
daniel@transgaming.com70062c92012-11-28 19:32:30 +00004918 context->setRenderbufferStorage(width, height, internalformat, samples);
daniel@transgaming.comcdacc8e2010-07-28 19:20:50 +00004919 break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004920 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004921 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004922 }
4923 }
4924 }
4925 catch(std::bad_alloc&)
4926 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004927 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004928 }
4929}
4930
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00004931void __stdcall glRenderbufferStorage(GLenum target, GLenum internalformat, GLsizei width, GLsizei height)
4932{
4933 glRenderbufferStorageMultisampleANGLE(target, 0, internalformat, width, height);
4934}
4935
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004936void __stdcall glSampleCoverage(GLclampf value, GLboolean invert)
4937{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00004938 EVENT("(GLclampf value = %f, GLboolean invert = %u)", value, invert);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004939
4940 try
4941 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004942 gl::Context* context = gl::getNonLostContext();
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00004943
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004944 if (context)
4945 {
daniel@transgaming.coma36f98e2010-05-18 18:51:09 +00004946 context->setSampleCoverageParams(gl::clamp01(value), invert == GL_TRUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004947 }
4948 }
4949 catch(std::bad_alloc&)
4950 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004951 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004952 }
4953}
4954
daniel@transgaming.comfe208882010-09-01 15:47:57 +00004955void __stdcall glSetFenceNV(GLuint fence, GLenum condition)
4956{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004957 EVENT("(GLuint fence = %d, GLenum condition = 0x%X)", fence, condition);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004958
4959 try
4960 {
4961 if (condition != GL_ALL_COMPLETED_NV)
4962 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004963 return gl::error(GL_INVALID_ENUM);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004964 }
4965
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004966 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004967
4968 if (context)
4969 {
4970 gl::Fence *fenceObject = context->getFence(fence);
4971
4972 if (fenceObject == NULL)
4973 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004974 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004975 }
4976
4977 fenceObject->setFence(condition);
4978 }
4979 }
4980 catch(std::bad_alloc&)
4981 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004982 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004983 }
daniel@transgaming.comfe208882010-09-01 15:47:57 +00004984}
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004985
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004986void __stdcall glScissor(GLint x, GLint y, GLsizei width, GLsizei height)
4987{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004988 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 +00004989
4990 try
4991 {
4992 if (width < 0 || height < 0)
4993 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004994 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004995 }
4996
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004997 gl::Context* context = gl::getNonLostContext();
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00004998
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004999 if (context)
5000 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00005001 context->setScissorParams(x, y, width, height);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005002 }
5003 }
5004 catch(std::bad_alloc&)
5005 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005006 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005007 }
5008}
5009
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00005010void __stdcall glShaderBinary(GLsizei n, const GLuint* shaders, GLenum binaryformat, const GLvoid* binary, GLsizei length)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005011{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005012 EVENT("(GLsizei n = %d, const GLuint* shaders = 0x%0.8p, GLenum binaryformat = 0x%X, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00005013 "const GLvoid* binary = 0x%0.8p, GLsizei length = %d)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00005014 n, shaders, binaryformat, binary, length);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005015
5016 try
5017 {
daniel@transgaming.comd1f667f2010-04-29 03:38:52 +00005018 // No binary shader formats are supported.
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005019 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005020 }
5021 catch(std::bad_alloc&)
5022 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005023 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005024 }
5025}
5026
shannon.woods%transgaming.com@gtempaccount.com5f339332013-04-13 03:29:02 +00005027void __stdcall glShaderSource(GLuint shader, GLsizei count, const GLchar* const* string, const GLint* length)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005028{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005029 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 +00005030 shader, count, string, length);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005031
5032 try
5033 {
daniel@transgaming.com8e6a6be2010-04-13 03:26:41 +00005034 if (count < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005035 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005036 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005037 }
5038
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005039 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005040
5041 if (context)
5042 {
5043 gl::Shader *shaderObject = context->getShader(shader);
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00005044
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005045 if (!shaderObject)
5046 {
daniel@transgaming.com8e6a6be2010-04-13 03:26:41 +00005047 if (context->getProgram(shader))
5048 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005049 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com8e6a6be2010-04-13 03:26:41 +00005050 }
5051 else
5052 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005053 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com8e6a6be2010-04-13 03:26:41 +00005054 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005055 }
5056
5057 shaderObject->setSource(count, string, length);
5058 }
5059 }
5060 catch(std::bad_alloc&)
5061 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005062 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005063 }
5064}
5065
5066void __stdcall glStencilFunc(GLenum func, GLint ref, GLuint mask)
5067{
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00005068 glStencilFuncSeparate(GL_FRONT_AND_BACK, func, ref, mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005069}
5070
5071void __stdcall glStencilFuncSeparate(GLenum face, GLenum func, GLint ref, GLuint mask)
5072{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005073 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 +00005074
5075 try
5076 {
5077 switch (face)
5078 {
5079 case GL_FRONT:
5080 case GL_BACK:
5081 case GL_FRONT_AND_BACK:
5082 break;
5083 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005084 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005085 }
5086
5087 switch (func)
5088 {
5089 case GL_NEVER:
5090 case GL_ALWAYS:
5091 case GL_LESS:
5092 case GL_LEQUAL:
5093 case GL_EQUAL:
5094 case GL_GEQUAL:
5095 case GL_GREATER:
5096 case GL_NOTEQUAL:
5097 break;
5098 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005099 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005100 }
5101
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005102 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005103
5104 if (context)
5105 {
5106 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
5107 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00005108 context->setStencilParams(func, ref, mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005109 }
5110
5111 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
5112 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00005113 context->setStencilBackParams(func, ref, mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005114 }
5115 }
5116 }
5117 catch(std::bad_alloc&)
5118 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005119 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005120 }
5121}
5122
5123void __stdcall glStencilMask(GLuint mask)
5124{
5125 glStencilMaskSeparate(GL_FRONT_AND_BACK, mask);
5126}
5127
5128void __stdcall glStencilMaskSeparate(GLenum face, GLuint mask)
5129{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005130 EVENT("(GLenum face = 0x%X, GLuint mask = %d)", face, mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005131
5132 try
5133 {
5134 switch (face)
5135 {
5136 case GL_FRONT:
5137 case GL_BACK:
5138 case GL_FRONT_AND_BACK:
5139 break;
5140 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005141 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005142 }
5143
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005144 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005145
5146 if (context)
5147 {
5148 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
5149 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00005150 context->setStencilWritemask(mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005151 }
5152
5153 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
5154 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00005155 context->setStencilBackWritemask(mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005156 }
5157 }
5158 }
5159 catch(std::bad_alloc&)
5160 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005161 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005162 }
5163}
5164
5165void __stdcall glStencilOp(GLenum fail, GLenum zfail, GLenum zpass)
5166{
5167 glStencilOpSeparate(GL_FRONT_AND_BACK, fail, zfail, zpass);
5168}
5169
5170void __stdcall glStencilOpSeparate(GLenum face, GLenum fail, GLenum zfail, GLenum zpass)
5171{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005172 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 +00005173 face, fail, zfail, zpass);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005174
5175 try
5176 {
5177 switch (face)
5178 {
5179 case GL_FRONT:
5180 case GL_BACK:
5181 case GL_FRONT_AND_BACK:
5182 break;
5183 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005184 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005185 }
5186
5187 switch (fail)
5188 {
5189 case GL_ZERO:
5190 case GL_KEEP:
5191 case GL_REPLACE:
5192 case GL_INCR:
5193 case GL_DECR:
5194 case GL_INVERT:
5195 case GL_INCR_WRAP:
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00005196 case GL_DECR_WRAP:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005197 break;
5198 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005199 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005200 }
5201
5202 switch (zfail)
5203 {
5204 case GL_ZERO:
5205 case GL_KEEP:
5206 case GL_REPLACE:
5207 case GL_INCR:
5208 case GL_DECR:
5209 case GL_INVERT:
5210 case GL_INCR_WRAP:
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00005211 case GL_DECR_WRAP:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005212 break;
5213 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005214 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005215 }
5216
5217 switch (zpass)
5218 {
5219 case GL_ZERO:
5220 case GL_KEEP:
5221 case GL_REPLACE:
5222 case GL_INCR:
5223 case GL_DECR:
5224 case GL_INVERT:
5225 case GL_INCR_WRAP:
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00005226 case GL_DECR_WRAP:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005227 break;
5228 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005229 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005230 }
5231
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005232 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005233
5234 if (context)
5235 {
5236 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
5237 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00005238 context->setStencilOperations(fail, zfail, zpass);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005239 }
5240
5241 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
5242 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00005243 context->setStencilBackOperations(fail, zfail, zpass);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005244 }
5245 }
5246 }
5247 catch(std::bad_alloc&)
5248 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005249 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005250 }
5251}
5252
daniel@transgaming.comfe208882010-09-01 15:47:57 +00005253GLboolean __stdcall glTestFenceNV(GLuint fence)
5254{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005255 EVENT("(GLuint fence = %d)", fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005256
5257 try
5258 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005259 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005260
5261 if (context)
5262 {
5263 gl::Fence *fenceObject = context->getFence(fence);
5264
5265 if (fenceObject == NULL)
5266 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005267 return gl::error(GL_INVALID_OPERATION, GL_TRUE);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005268 }
5269
5270 return fenceObject->testFence();
5271 }
5272 }
5273 catch(std::bad_alloc&)
5274 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005275 gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005276 }
5277
5278 return GL_TRUE;
daniel@transgaming.comfe208882010-09-01 15:47:57 +00005279}
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005280
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00005281void __stdcall glTexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height,
5282 GLint border, GLenum format, GLenum type, const GLvoid* pixels)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005283{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005284 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 +00005285 "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 +00005286 target, level, internalformat, width, height, border, format, type, pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005287
5288 try
5289 {
daniel@transgaming.com4f9ef0d2011-05-30 23:51:19 +00005290 if (!validImageSize(level, width, height))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005291 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005292 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005293 }
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00005294
apatrick@chromium.orge057c5d2012-01-26 19:18:24 +00005295 if (internalformat != GLint(format))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005296 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005297 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005298 }
5299
daniel@transgaming.com6377e362012-06-05 19:49:55 +00005300 // validate <type> by itself (used as secondary key below)
5301 switch (type)
5302 {
5303 case GL_UNSIGNED_BYTE:
5304 case GL_UNSIGNED_SHORT_5_6_5:
5305 case GL_UNSIGNED_SHORT_4_4_4_4:
5306 case GL_UNSIGNED_SHORT_5_5_5_1:
5307 case GL_UNSIGNED_SHORT:
5308 case GL_UNSIGNED_INT:
5309 case GL_UNSIGNED_INT_24_8_OES:
5310 case GL_HALF_FLOAT_OES:
5311 case GL_FLOAT:
5312 break;
5313 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005314 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com6377e362012-06-05 19:49:55 +00005315 }
5316
5317 // validate <format> + <type> combinations
5318 // - invalid <format> -> sets INVALID_ENUM
5319 // - invalid <format>+<type> combination -> sets INVALID_OPERATION
daniel@transgaming.com8a0a2db2011-03-21 16:38:20 +00005320 switch (format)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005321 {
5322 case GL_ALPHA:
5323 case GL_LUMINANCE:
5324 case GL_LUMINANCE_ALPHA:
5325 switch (type)
5326 {
5327 case GL_UNSIGNED_BYTE:
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00005328 case GL_FLOAT:
5329 case GL_HALF_FLOAT_OES:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005330 break;
5331 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005332 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005333 }
5334 break;
5335 case GL_RGB:
5336 switch (type)
5337 {
5338 case GL_UNSIGNED_BYTE:
5339 case GL_UNSIGNED_SHORT_5_6_5:
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00005340 case GL_FLOAT:
5341 case GL_HALF_FLOAT_OES:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005342 break;
5343 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005344 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005345 }
5346 break;
5347 case GL_RGBA:
5348 switch (type)
5349 {
5350 case GL_UNSIGNED_BYTE:
5351 case GL_UNSIGNED_SHORT_4_4_4_4:
5352 case GL_UNSIGNED_SHORT_5_5_5_1:
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00005353 case GL_FLOAT:
5354 case GL_HALF_FLOAT_OES:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005355 break;
5356 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005357 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005358 }
5359 break;
daniel@transgaming.coma9198d92010-08-08 04:49:56 +00005360 case GL_BGRA_EXT:
5361 switch (type)
5362 {
5363 case GL_UNSIGNED_BYTE:
5364 break;
5365 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005366 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.coma9198d92010-08-08 04:49:56 +00005367 }
5368 break;
daniel@transgaming.com01868132010-08-24 19:21:17 +00005369 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT: // error cases for compressed textures are handled below
5370 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
gman@chromium.org50c526d2011-08-10 05:19:44 +00005371 case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
5372 case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
daniel@transgaming.com01868132010-08-24 19:21:17 +00005373 break;
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00005374 case GL_DEPTH_COMPONENT:
5375 switch (type)
5376 {
5377 case GL_UNSIGNED_SHORT:
5378 case GL_UNSIGNED_INT:
5379 break;
5380 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005381 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00005382 }
5383 break;
5384 case GL_DEPTH_STENCIL_OES:
5385 switch (type)
5386 {
5387 case GL_UNSIGNED_INT_24_8_OES:
5388 break;
5389 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005390 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00005391 }
5392 break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005393 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005394 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005395 }
5396
5397 if (border != 0)
5398 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005399 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005400 }
5401
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005402 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005403
5404 if (context)
5405 {
daniel@transgaming.com32b11442011-11-19 02:42:48 +00005406 if (level > context->getMaximumTextureLevel())
5407 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005408 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com32b11442011-11-19 02:42:48 +00005409 }
5410
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00005411 switch (target)
5412 {
5413 case GL_TEXTURE_2D:
5414 if (width > (context->getMaximumTextureDimension() >> level) ||
5415 height > (context->getMaximumTextureDimension() >> level))
5416 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005417 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00005418 }
5419 break;
5420 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
5421 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
5422 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
5423 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
5424 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
5425 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
5426 if (width != height)
5427 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005428 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00005429 }
5430
5431 if (width > (context->getMaximumCubeTextureDimension() >> level) ||
5432 height > (context->getMaximumCubeTextureDimension() >> level))
5433 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005434 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00005435 }
5436 break;
5437 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005438 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00005439 }
5440
gman@chromium.org50c526d2011-08-10 05:19:44 +00005441 switch (format) {
5442 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
5443 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
5444 if (context->supportsDXT1Textures())
daniel@transgaming.com01868132010-08-24 19:21:17 +00005445 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005446 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com01868132010-08-24 19:21:17 +00005447 }
5448 else
5449 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005450 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com01868132010-08-24 19:21:17 +00005451 }
gman@chromium.org50c526d2011-08-10 05:19:44 +00005452 break;
5453 case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
5454 if (context->supportsDXT3Textures())
5455 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005456 return gl::error(GL_INVALID_OPERATION);
gman@chromium.org50c526d2011-08-10 05:19:44 +00005457 }
5458 else
5459 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005460 return gl::error(GL_INVALID_ENUM);
gman@chromium.org50c526d2011-08-10 05:19:44 +00005461 }
5462 break;
5463 case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
5464 if (context->supportsDXT5Textures())
5465 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005466 return gl::error(GL_INVALID_OPERATION);
gman@chromium.org50c526d2011-08-10 05:19:44 +00005467 }
5468 else
5469 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005470 return gl::error(GL_INVALID_ENUM);
gman@chromium.org50c526d2011-08-10 05:19:44 +00005471 }
5472 break;
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00005473 case GL_DEPTH_COMPONENT:
5474 case GL_DEPTH_STENCIL_OES:
5475 if (!context->supportsDepthTextures())
5476 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005477 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00005478 }
daniel@transgaming.com0c854682012-05-31 01:14:11 +00005479 if (target != GL_TEXTURE_2D)
5480 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005481 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com0c854682012-05-31 01:14:11 +00005482 }
daniel@transgaming.com797924b2012-06-05 19:50:01 +00005483 // OES_depth_texture supports loading depth data and multiple levels,
5484 // but ANGLE_depth_texture does not
5485 if (pixels != NULL || level != 0)
daniel@transgaming.com0c854682012-05-31 01:14:11 +00005486 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005487 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com0c854682012-05-31 01:14:11 +00005488 }
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00005489 break;
gman@chromium.org50c526d2011-08-10 05:19:44 +00005490 default:
5491 break;
daniel@transgaming.com01868132010-08-24 19:21:17 +00005492 }
5493
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00005494 if (type == GL_FLOAT)
5495 {
daniel@transgaming.combbeffbb2011-11-09 17:46:11 +00005496 if (!context->supportsFloat32Textures())
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00005497 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005498 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00005499 }
5500 }
5501 else if (type == GL_HALF_FLOAT_OES)
5502 {
daniel@transgaming.combbeffbb2011-11-09 17:46:11 +00005503 if (!context->supportsFloat16Textures())
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00005504 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005505 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00005506 }
5507 }
5508
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005509 if (target == GL_TEXTURE_2D)
5510 {
5511 gl::Texture2D *texture = context->getTexture2D();
5512
5513 if (!texture)
5514 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005515 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005516 }
5517
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005518 if (texture->isImmutable())
5519 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005520 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005521 }
5522
daniel@transgaming.com8a0a2db2011-03-21 16:38:20 +00005523 texture->setImage(level, width, height, format, type, context->getUnpackAlignment(), pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005524 }
5525 else
5526 {
5527 gl::TextureCubeMap *texture = context->getTextureCubeMap();
5528
5529 if (!texture)
5530 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005531 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005532 }
5533
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005534 if (texture->isImmutable())
5535 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005536 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005537 }
5538
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005539 switch (target)
5540 {
5541 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
daniel@transgaming.com8a0a2db2011-03-21 16:38:20 +00005542 texture->setImagePosX(level, width, height, format, type, context->getUnpackAlignment(), pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005543 break;
5544 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
daniel@transgaming.com8a0a2db2011-03-21 16:38:20 +00005545 texture->setImageNegX(level, width, height, format, type, context->getUnpackAlignment(), pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005546 break;
5547 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
daniel@transgaming.com8a0a2db2011-03-21 16:38:20 +00005548 texture->setImagePosY(level, width, height, format, type, context->getUnpackAlignment(), pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005549 break;
5550 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
daniel@transgaming.com8a0a2db2011-03-21 16:38:20 +00005551 texture->setImageNegY(level, width, height, format, type, context->getUnpackAlignment(), pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005552 break;
5553 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
daniel@transgaming.com8a0a2db2011-03-21 16:38:20 +00005554 texture->setImagePosZ(level, width, height, format, type, context->getUnpackAlignment(), pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005555 break;
5556 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
daniel@transgaming.com8a0a2db2011-03-21 16:38:20 +00005557 texture->setImageNegZ(level, width, height, format, type, context->getUnpackAlignment(), pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005558 break;
5559 default: UNREACHABLE();
5560 }
5561 }
5562 }
5563 }
5564 catch(std::bad_alloc&)
5565 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005566 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005567 }
5568}
5569
5570void __stdcall glTexParameterf(GLenum target, GLenum pname, GLfloat param)
5571{
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005572 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLint param = %f)", target, pname, param);
5573
5574 try
5575 {
5576 gl::Context *context = gl::getNonLostContext();
5577
5578 if (context)
5579 {
5580 gl::Texture *texture;
5581
5582 switch (target)
5583 {
5584 case GL_TEXTURE_2D:
5585 texture = context->getTexture2D();
5586 break;
5587 case GL_TEXTURE_CUBE_MAP:
5588 texture = context->getTextureCubeMap();
5589 break;
5590 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005591 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005592 }
5593
5594 switch (pname)
5595 {
5596 case GL_TEXTURE_WRAP_S:
5597 if (!texture->setWrapS((GLenum)param))
5598 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005599 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005600 }
5601 break;
5602 case GL_TEXTURE_WRAP_T:
5603 if (!texture->setWrapT((GLenum)param))
5604 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005605 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005606 }
5607 break;
5608 case GL_TEXTURE_MIN_FILTER:
5609 if (!texture->setMinFilter((GLenum)param))
5610 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005611 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005612 }
5613 break;
5614 case GL_TEXTURE_MAG_FILTER:
5615 if (!texture->setMagFilter((GLenum)param))
5616 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005617 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005618 }
5619 break;
5620 case GL_TEXTURE_USAGE_ANGLE:
5621 if (!texture->setUsage((GLenum)param))
5622 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005623 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005624 }
5625 break;
5626 case GL_TEXTURE_MAX_ANISOTROPY_EXT:
5627 if (!context->supportsTextureFilterAnisotropy())
5628 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005629 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005630 }
5631 if (!texture->setMaxAnisotropy((float)param, context->getTextureMaxAnisotropy()))
5632 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005633 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005634 }
5635 break;
5636 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005637 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005638 }
5639 }
5640 }
5641 catch(std::bad_alloc&)
5642 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005643 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005644 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005645}
5646
5647void __stdcall glTexParameterfv(GLenum target, GLenum pname, const GLfloat* params)
5648{
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005649 glTexParameterf(target, pname, (GLfloat)*params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005650}
5651
5652void __stdcall glTexParameteri(GLenum target, GLenum pname, GLint param)
5653{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005654 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLint param = %d)", target, pname, param);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005655
5656 try
5657 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005658 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005659
5660 if (context)
5661 {
5662 gl::Texture *texture;
5663
5664 switch (target)
5665 {
5666 case GL_TEXTURE_2D:
5667 texture = context->getTexture2D();
5668 break;
5669 case GL_TEXTURE_CUBE_MAP:
5670 texture = context->getTextureCubeMap();
5671 break;
5672 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005673 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005674 }
5675
5676 switch (pname)
5677 {
5678 case GL_TEXTURE_WRAP_S:
5679 if (!texture->setWrapS((GLenum)param))
5680 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005681 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005682 }
5683 break;
5684 case GL_TEXTURE_WRAP_T:
5685 if (!texture->setWrapT((GLenum)param))
5686 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005687 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005688 }
5689 break;
5690 case GL_TEXTURE_MIN_FILTER:
5691 if (!texture->setMinFilter((GLenum)param))
5692 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005693 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005694 }
5695 break;
5696 case GL_TEXTURE_MAG_FILTER:
5697 if (!texture->setMagFilter((GLenum)param))
5698 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005699 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005700 }
5701 break;
daniel@transgaming.com7d18c172011-11-11 04:18:21 +00005702 case GL_TEXTURE_USAGE_ANGLE:
5703 if (!texture->setUsage((GLenum)param))
5704 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005705 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com7d18c172011-11-11 04:18:21 +00005706 }
5707 break;
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005708 case GL_TEXTURE_MAX_ANISOTROPY_EXT:
5709 if (!context->supportsTextureFilterAnisotropy())
5710 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005711 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005712 }
5713 if (!texture->setMaxAnisotropy((float)param, context->getTextureMaxAnisotropy()))
5714 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005715 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005716 }
5717 break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005718 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005719 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005720 }
5721 }
5722 }
5723 catch(std::bad_alloc&)
5724 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005725 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005726 }
5727}
5728
5729void __stdcall glTexParameteriv(GLenum target, GLenum pname, const GLint* params)
5730{
5731 glTexParameteri(target, pname, *params);
5732}
5733
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005734void __stdcall glTexStorage2DEXT(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height)
5735{
5736 EVENT("(GLenum target = 0x%X, GLsizei levels = %d, GLenum internalformat = 0x%X, GLsizei width = %d, GLsizei height = %d)",
5737 target, levels, internalformat, width, height);
5738
5739 try
5740 {
5741 if (target != GL_TEXTURE_2D && target != GL_TEXTURE_CUBE_MAP)
5742 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005743 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005744 }
5745
5746 if (width < 1 || height < 1 || levels < 1)
5747 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005748 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005749 }
5750
5751 if (target == GL_TEXTURE_CUBE_MAP && width != height)
5752 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005753 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005754 }
5755
daniel@transgaming.com45b888a2011-11-16 03:56:39 +00005756 if (levels != 1 && levels != gl::log2(std::max(width, height)) + 1)
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005757 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005758 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005759 }
5760
5761 GLenum format = gl::ExtractFormat(internalformat);
5762 GLenum type = gl::ExtractType(internalformat);
5763
5764 if (format == GL_NONE || type == GL_NONE)
5765 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005766 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005767 }
5768
5769 gl::Context *context = gl::getNonLostContext();
5770
5771 if (context)
5772 {
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00005773 switch (target)
5774 {
5775 case GL_TEXTURE_2D:
5776 if (width > context->getMaximumTextureDimension() ||
5777 height > context->getMaximumTextureDimension())
5778 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005779 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00005780 }
5781 break;
5782 case GL_TEXTURE_CUBE_MAP:
5783 if (width > context->getMaximumCubeTextureDimension() ||
5784 height > context->getMaximumCubeTextureDimension())
5785 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005786 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00005787 }
5788 break;
5789 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005790 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00005791 }
5792
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005793 if (levels != 1 && !context->supportsNonPower2Texture())
5794 {
5795 if (!gl::isPow2(width) || !gl::isPow2(height))
5796 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005797 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005798 }
5799 }
5800
daniel@transgaming.come1077362011-11-11 04:16:50 +00005801 switch (internalformat)
5802 {
5803 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
5804 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
5805 if (!context->supportsDXT1Textures())
5806 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005807 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.come1077362011-11-11 04:16:50 +00005808 }
5809 break;
5810 case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
5811 if (!context->supportsDXT3Textures())
5812 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005813 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.come1077362011-11-11 04:16:50 +00005814 }
5815 break;
5816 case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
5817 if (!context->supportsDXT5Textures())
5818 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005819 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.come1077362011-11-11 04:16:50 +00005820 }
5821 break;
daniel@transgaming.comff941aa2011-11-11 04:17:09 +00005822 case GL_RGBA32F_EXT:
5823 case GL_RGB32F_EXT:
5824 case GL_ALPHA32F_EXT:
5825 case GL_LUMINANCE32F_EXT:
5826 case GL_LUMINANCE_ALPHA32F_EXT:
5827 if (!context->supportsFloat32Textures())
5828 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005829 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comff941aa2011-11-11 04:17:09 +00005830 }
5831 break;
5832 case GL_RGBA16F_EXT:
5833 case GL_RGB16F_EXT:
5834 case GL_ALPHA16F_EXT:
5835 case GL_LUMINANCE16F_EXT:
5836 case GL_LUMINANCE_ALPHA16F_EXT:
5837 if (!context->supportsFloat16Textures())
5838 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005839 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comff941aa2011-11-11 04:17:09 +00005840 }
5841 break;
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00005842 case GL_DEPTH_COMPONENT16:
5843 case GL_DEPTH_COMPONENT32_OES:
5844 case GL_DEPTH24_STENCIL8_OES:
5845 if (!context->supportsDepthTextures())
5846 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005847 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00005848 }
daniel@transgaming.com0c854682012-05-31 01:14:11 +00005849 if (target != GL_TEXTURE_2D)
5850 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005851 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com0c854682012-05-31 01:14:11 +00005852 }
daniel@transgaming.com797924b2012-06-05 19:50:01 +00005853 // ANGLE_depth_texture only supports 1-level textures
5854 if (levels != 1)
5855 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005856 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com797924b2012-06-05 19:50:01 +00005857 }
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00005858 break;
5859 default:
5860 break;
daniel@transgaming.come1077362011-11-11 04:16:50 +00005861 }
5862
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005863 if (target == GL_TEXTURE_2D)
5864 {
5865 gl::Texture2D *texture = context->getTexture2D();
5866
5867 if (!texture || texture->id() == 0)
5868 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005869 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005870 }
5871
5872 if (texture->isImmutable())
5873 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005874 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005875 }
5876
5877 texture->storage(levels, internalformat, width, height);
5878 }
5879 else if (target == GL_TEXTURE_CUBE_MAP)
5880 {
5881 gl::TextureCubeMap *texture = context->getTextureCubeMap();
5882
5883 if (!texture || texture->id() == 0)
5884 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005885 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005886 }
5887
5888 if (texture->isImmutable())
5889 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005890 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005891 }
5892
5893 texture->storage(levels, internalformat, width);
5894 }
5895 else UNREACHABLE();
5896 }
5897 }
5898 catch(std::bad_alloc&)
5899 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005900 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005901 }
5902}
5903
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00005904void __stdcall glTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height,
5905 GLenum format, GLenum type, const GLvoid* pixels)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005906{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005907 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00005908 "GLsizei width = %d, GLsizei height = %d, GLenum format = 0x%X, GLenum type = 0x%X, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00005909 "const GLvoid* pixels = 0x%0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005910 target, level, xoffset, yoffset, width, height, format, type, pixels);
5911
5912 try
5913 {
apatrick@chromium.org551022e2012-01-23 19:56:54 +00005914 if (!gl::IsInternalTextureTarget(target))
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005915 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005916 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005917 }
5918
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00005919 if (level < 0 || xoffset < 0 || yoffset < 0 || width < 0 || height < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005920 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005921 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005922 }
5923
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005924 if (std::numeric_limits<GLsizei>::max() - xoffset < width || std::numeric_limits<GLsizei>::max() - yoffset < height)
5925 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005926 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005927 }
5928
daniel@transgaming.com8833dd22012-06-05 19:49:58 +00005929 if (!checkTextureFormatType(format, type))
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005930 {
daniel@transgaming.com8833dd22012-06-05 19:49:58 +00005931 return; // error is set by helper function
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005932 }
5933
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005934 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005935
5936 if (context)
5937 {
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00005938 if (level > context->getMaximumTextureLevel())
5939 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005940 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00005941 }
5942
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00005943 if (format == GL_FLOAT)
5944 {
daniel@transgaming.combbeffbb2011-11-09 17:46:11 +00005945 if (!context->supportsFloat32Textures())
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00005946 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005947 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00005948 }
5949 }
5950 else if (format == GL_HALF_FLOAT_OES)
5951 {
daniel@transgaming.combbeffbb2011-11-09 17:46:11 +00005952 if (!context->supportsFloat16Textures())
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00005953 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005954 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00005955 }
5956 }
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00005957 else if (gl::IsDepthTexture(format))
5958 {
5959 if (!context->supportsDepthTextures())
5960 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005961 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00005962 }
daniel@transgaming.com0c854682012-05-31 01:14:11 +00005963 if (target != GL_TEXTURE_2D)
5964 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005965 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com0c854682012-05-31 01:14:11 +00005966 }
5967 // OES_depth_texture supports loading depth data, but ANGLE_depth_texture does not
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005968 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00005969 }
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00005970
daniel@transgaming.com1d2d3c42012-05-31 01:14:15 +00005971 if (width == 0 || height == 0 || pixels == NULL)
5972 {
5973 return;
5974 }
5975
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005976 if (target == GL_TEXTURE_2D)
5977 {
5978 gl::Texture2D *texture = context->getTexture2D();
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00005979 if (validateSubImageParams2D(false, width, height, xoffset, yoffset, level, format, type, texture))
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005980 {
daniel@transgaming.com343373a2011-11-29 19:42:32 +00005981 texture->subImage(level, xoffset, yoffset, width, height, format, type, context->getUnpackAlignment(), pixels);
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005982 }
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005983 }
daniel@transgaming.com19ffc242010-05-04 03:35:21 +00005984 else if (gl::IsCubemapTextureTarget(target))
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005985 {
5986 gl::TextureCubeMap *texture = context->getTextureCubeMap();
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00005987 if (validateSubImageParamsCube(false, width, height, xoffset, yoffset, target, level, format, type, texture))
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005988 {
daniel@transgaming.com343373a2011-11-29 19:42:32 +00005989 texture->subImage(target, level, xoffset, yoffset, width, height, format, type, context->getUnpackAlignment(), pixels);
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005990 }
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005991 }
5992 else
5993 {
5994 UNREACHABLE();
5995 }
5996 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005997 }
5998 catch(std::bad_alloc&)
5999 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006000 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006001 }
6002}
6003
6004void __stdcall glUniform1f(GLint location, GLfloat x)
6005{
6006 glUniform1fv(location, 1, &x);
6007}
6008
6009void __stdcall glUniform1fv(GLint location, GLsizei count, const GLfloat* v)
6010{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006011 EVENT("(GLint location = %d, GLsizei count = %d, const GLfloat* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006012
6013 try
6014 {
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006015 if (count < 0)
6016 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006017 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006018 }
6019
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006020 if (location == -1)
6021 {
6022 return;
6023 }
6024
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006025 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006026
6027 if (context)
6028 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00006029 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006030 if (!programBinary)
6031 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006032 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006033 }
6034
6035 if (!programBinary->setUniform1fv(location, count, v))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006036 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006037 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006038 }
6039 }
6040 }
6041 catch(std::bad_alloc&)
6042 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006043 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006044 }
6045}
6046
6047void __stdcall glUniform1i(GLint location, GLint x)
6048{
6049 glUniform1iv(location, 1, &x);
6050}
6051
6052void __stdcall glUniform1iv(GLint location, GLsizei count, const GLint* v)
6053{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006054 EVENT("(GLint location = %d, GLsizei count = %d, const GLint* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006055
6056 try
6057 {
6058 if (count < 0)
6059 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006060 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006061 }
6062
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006063 if (location == -1)
6064 {
6065 return;
6066 }
6067
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006068 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006069
6070 if (context)
6071 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00006072 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006073 if (!programBinary)
6074 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006075 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006076 }
6077
6078 if (!programBinary->setUniform1iv(location, count, v))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006079 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006080 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006081 }
6082 }
6083 }
6084 catch(std::bad_alloc&)
6085 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006086 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006087 }
6088}
6089
6090void __stdcall glUniform2f(GLint location, GLfloat x, GLfloat y)
6091{
6092 GLfloat xy[2] = {x, y};
6093
6094 glUniform2fv(location, 1, (GLfloat*)&xy);
6095}
6096
6097void __stdcall glUniform2fv(GLint location, GLsizei count, const GLfloat* v)
6098{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006099 EVENT("(GLint location = %d, GLsizei count = %d, const GLfloat* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006100
6101 try
6102 {
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006103 if (count < 0)
6104 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006105 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006106 }
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006107
6108 if (location == -1)
6109 {
6110 return;
6111 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006112
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006113 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006114
6115 if (context)
6116 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00006117 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006118 if (!programBinary)
6119 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006120 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006121 }
6122
6123 if (!programBinary->setUniform2fv(location, count, v))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006124 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006125 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006126 }
6127 }
6128 }
6129 catch(std::bad_alloc&)
6130 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006131 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006132 }
6133}
6134
6135void __stdcall glUniform2i(GLint location, GLint x, GLint y)
6136{
6137 GLint xy[4] = {x, y};
6138
6139 glUniform2iv(location, 1, (GLint*)&xy);
6140}
6141
6142void __stdcall glUniform2iv(GLint location, GLsizei count, const GLint* v)
6143{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006144 EVENT("(GLint location = %d, GLsizei count = %d, const GLint* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006145
6146 try
6147 {
6148 if (count < 0)
6149 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006150 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006151 }
6152
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006153 if (location == -1)
6154 {
6155 return;
6156 }
6157
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006158 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006159
6160 if (context)
6161 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00006162 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006163 if (!programBinary)
6164 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006165 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006166 }
6167
6168 if (!programBinary->setUniform2iv(location, count, v))
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006169 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006170 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006171 }
6172 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006173 }
6174 catch(std::bad_alloc&)
6175 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006176 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006177 }
6178}
6179
6180void __stdcall glUniform3f(GLint location, GLfloat x, GLfloat y, GLfloat z)
6181{
6182 GLfloat xyz[3] = {x, y, z};
6183
6184 glUniform3fv(location, 1, (GLfloat*)&xyz);
6185}
6186
6187void __stdcall glUniform3fv(GLint location, GLsizei count, const GLfloat* v)
6188{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006189 EVENT("(GLint location = %d, GLsizei count = %d, const GLfloat* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006190
6191 try
6192 {
6193 if (count < 0)
6194 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006195 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006196 }
6197
6198 if (location == -1)
6199 {
6200 return;
6201 }
6202
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006203 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006204
6205 if (context)
6206 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00006207 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006208 if (!programBinary)
6209 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006210 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006211 }
6212
6213 if (!programBinary->setUniform3fv(location, count, v))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006214 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006215 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006216 }
6217 }
6218 }
6219 catch(std::bad_alloc&)
6220 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006221 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006222 }
6223}
6224
6225void __stdcall glUniform3i(GLint location, GLint x, GLint y, GLint z)
6226{
6227 GLint xyz[3] = {x, y, z};
6228
6229 glUniform3iv(location, 1, (GLint*)&xyz);
6230}
6231
6232void __stdcall glUniform3iv(GLint location, GLsizei count, const GLint* v)
6233{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006234 EVENT("(GLint location = %d, GLsizei count = %d, const GLint* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006235
6236 try
6237 {
6238 if (count < 0)
6239 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006240 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006241 }
6242
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006243 if (location == -1)
6244 {
6245 return;
6246 }
6247
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006248 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006249
6250 if (context)
6251 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00006252 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006253 if (!programBinary)
6254 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006255 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006256 }
6257
6258 if (!programBinary->setUniform3iv(location, count, v))
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006259 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006260 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006261 }
6262 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006263 }
6264 catch(std::bad_alloc&)
6265 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006266 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006267 }
6268}
6269
6270void __stdcall glUniform4f(GLint location, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
6271{
6272 GLfloat xyzw[4] = {x, y, z, w};
6273
6274 glUniform4fv(location, 1, (GLfloat*)&xyzw);
6275}
6276
6277void __stdcall glUniform4fv(GLint location, GLsizei count, const GLfloat* v)
6278{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006279 EVENT("(GLint location = %d, GLsizei count = %d, const GLfloat* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006280
6281 try
6282 {
6283 if (count < 0)
6284 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006285 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006286 }
6287
6288 if (location == -1)
6289 {
6290 return;
6291 }
6292
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006293 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006294
6295 if (context)
6296 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00006297 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006298 if (!programBinary)
6299 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006300 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006301 }
6302
6303 if (!programBinary->setUniform4fv(location, count, v))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006304 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006305 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006306 }
6307 }
6308 }
6309 catch(std::bad_alloc&)
6310 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006311 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006312 }
6313}
6314
6315void __stdcall glUniform4i(GLint location, GLint x, GLint y, GLint z, GLint w)
6316{
6317 GLint xyzw[4] = {x, y, z, w};
6318
6319 glUniform4iv(location, 1, (GLint*)&xyzw);
6320}
6321
6322void __stdcall glUniform4iv(GLint location, GLsizei count, const GLint* v)
6323{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006324 EVENT("(GLint location = %d, GLsizei count = %d, const GLint* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006325
6326 try
6327 {
6328 if (count < 0)
6329 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006330 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006331 }
6332
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006333 if (location == -1)
6334 {
6335 return;
6336 }
6337
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006338 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006339
6340 if (context)
6341 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00006342 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006343 if (!programBinary)
6344 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006345 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006346 }
6347
6348 if (!programBinary->setUniform4iv(location, count, v))
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006349 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006350 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006351 }
6352 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006353 }
6354 catch(std::bad_alloc&)
6355 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006356 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006357 }
6358}
6359
6360void __stdcall glUniformMatrix2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
6361{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006362 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00006363 location, count, transpose, value);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006364
6365 try
6366 {
6367 if (count < 0 || transpose != GL_FALSE)
6368 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006369 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006370 }
6371
6372 if (location == -1)
6373 {
6374 return;
6375 }
6376
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006377 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006378
6379 if (context)
6380 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00006381 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006382 if (!programBinary)
6383 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006384 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006385 }
6386
6387 if (!programBinary->setUniformMatrix2fv(location, count, value))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006388 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006389 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006390 }
6391 }
6392 }
6393 catch(std::bad_alloc&)
6394 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006395 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006396 }
6397}
6398
6399void __stdcall glUniformMatrix3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
6400{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006401 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00006402 location, count, transpose, value);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006403
6404 try
6405 {
6406 if (count < 0 || transpose != GL_FALSE)
6407 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006408 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006409 }
6410
6411 if (location == -1)
6412 {
6413 return;
6414 }
6415
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006416 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006417
6418 if (context)
6419 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00006420 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006421 if (!programBinary)
6422 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006423 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006424 }
6425
6426 if (!programBinary->setUniformMatrix3fv(location, count, value))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006427 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006428 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006429 }
6430 }
6431 }
6432 catch(std::bad_alloc&)
6433 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006434 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006435 }
6436}
6437
6438void __stdcall glUniformMatrix4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
6439{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006440 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00006441 location, count, transpose, value);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006442
6443 try
6444 {
6445 if (count < 0 || transpose != GL_FALSE)
6446 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006447 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006448 }
6449
6450 if (location == -1)
6451 {
6452 return;
6453 }
6454
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006455 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006456
6457 if (context)
6458 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00006459 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006460 if (!programBinary)
6461 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006462 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006463 }
6464
6465 if (!programBinary->setUniformMatrix4fv(location, count, value))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006466 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006467 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006468 }
6469 }
6470 }
6471 catch(std::bad_alloc&)
6472 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006473 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006474 }
6475}
6476
6477void __stdcall glUseProgram(GLuint program)
6478{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006479 EVENT("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006480
6481 try
6482 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006483 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006484
6485 if (context)
6486 {
6487 gl::Program *programObject = context->getProgram(program);
6488
daniel@transgaming.comc8478202010-04-13 19:53:35 +00006489 if (!programObject && program != 0)
6490 {
6491 if (context->getShader(program))
6492 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006493 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comc8478202010-04-13 19:53:35 +00006494 }
6495 else
6496 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006497 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comc8478202010-04-13 19:53:35 +00006498 }
6499 }
6500
daniel@transgaming.com716056c2012-07-24 18:38:59 +00006501 if (program != 0 && !programObject->isLinked())
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006502 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006503 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006504 }
6505
6506 context->useProgram(program);
6507 }
6508 }
6509 catch(std::bad_alloc&)
6510 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006511 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006512 }
6513}
6514
6515void __stdcall glValidateProgram(GLuint program)
6516{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006517 EVENT("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006518
6519 try
6520 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006521 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00006522
6523 if (context)
6524 {
6525 gl::Program *programObject = context->getProgram(program);
6526
6527 if (!programObject)
6528 {
6529 if (context->getShader(program))
6530 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006531 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00006532 }
6533 else
6534 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006535 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00006536 }
6537 }
6538
apatrick@chromium.org253b8d22012-06-22 19:27:21 +00006539 programObject->validate();
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00006540 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006541 }
6542 catch(std::bad_alloc&)
6543 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006544 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006545 }
6546}
6547
6548void __stdcall glVertexAttrib1f(GLuint index, GLfloat x)
6549{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006550 EVENT("(GLuint index = %d, GLfloat x = %f)", index, x);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006551
6552 try
6553 {
6554 if (index >= gl::MAX_VERTEX_ATTRIBS)
6555 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006556 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006557 }
6558
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006559 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006560
6561 if (context)
6562 {
6563 GLfloat vals[4] = { x, 0, 0, 1 };
6564 context->setVertexAttrib(index, vals);
6565 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006566 }
6567 catch(std::bad_alloc&)
6568 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006569 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006570 }
6571}
6572
6573void __stdcall glVertexAttrib1fv(GLuint index, const GLfloat* values)
6574{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006575 EVENT("(GLuint index = %d, const GLfloat* values = 0x%0.8p)", index, values);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006576
6577 try
6578 {
6579 if (index >= gl::MAX_VERTEX_ATTRIBS)
6580 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006581 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006582 }
6583
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006584 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006585
6586 if (context)
6587 {
6588 GLfloat vals[4] = { values[0], 0, 0, 1 };
6589 context->setVertexAttrib(index, vals);
6590 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006591 }
6592 catch(std::bad_alloc&)
6593 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006594 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006595 }
6596}
6597
6598void __stdcall glVertexAttrib2f(GLuint index, GLfloat x, GLfloat y)
6599{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006600 EVENT("(GLuint index = %d, GLfloat x = %f, GLfloat y = %f)", index, x, y);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006601
6602 try
6603 {
6604 if (index >= gl::MAX_VERTEX_ATTRIBS)
6605 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006606 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006607 }
6608
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006609 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006610
6611 if (context)
6612 {
6613 GLfloat vals[4] = { x, y, 0, 1 };
6614 context->setVertexAttrib(index, vals);
6615 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006616 }
6617 catch(std::bad_alloc&)
6618 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006619 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006620 }
6621}
6622
6623void __stdcall glVertexAttrib2fv(GLuint index, const GLfloat* values)
6624{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006625 EVENT("(GLuint index = %d, const GLfloat* values = 0x%0.8p)", index, values);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006626
6627 try
6628 {
6629 if (index >= gl::MAX_VERTEX_ATTRIBS)
6630 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006631 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006632 }
6633
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006634 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006635
6636 if (context)
6637 {
6638 GLfloat vals[4] = { values[0], values[1], 0, 1 };
6639 context->setVertexAttrib(index, vals);
6640 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006641 }
6642 catch(std::bad_alloc&)
6643 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006644 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006645 }
6646}
6647
6648void __stdcall glVertexAttrib3f(GLuint index, GLfloat x, GLfloat y, GLfloat z)
6649{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006650 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 +00006651
6652 try
6653 {
6654 if (index >= gl::MAX_VERTEX_ATTRIBS)
6655 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006656 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006657 }
6658
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006659 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006660
6661 if (context)
6662 {
6663 GLfloat vals[4] = { x, y, z, 1 };
6664 context->setVertexAttrib(index, vals);
6665 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006666 }
6667 catch(std::bad_alloc&)
6668 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006669 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006670 }
6671}
6672
6673void __stdcall glVertexAttrib3fv(GLuint index, const GLfloat* values)
6674{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006675 EVENT("(GLuint index = %d, const GLfloat* values = 0x%0.8p)", index, values);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006676
6677 try
6678 {
6679 if (index >= gl::MAX_VERTEX_ATTRIBS)
6680 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006681 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006682 }
6683
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006684 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006685
6686 if (context)
6687 {
6688 GLfloat vals[4] = { values[0], values[1], values[2], 1 };
6689 context->setVertexAttrib(index, vals);
6690 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006691 }
6692 catch(std::bad_alloc&)
6693 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006694 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006695 }
6696}
6697
6698void __stdcall glVertexAttrib4f(GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
6699{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006700 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 +00006701
6702 try
6703 {
6704 if (index >= gl::MAX_VERTEX_ATTRIBS)
6705 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006706 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006707 }
6708
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006709 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006710
6711 if (context)
6712 {
6713 GLfloat vals[4] = { x, y, z, w };
6714 context->setVertexAttrib(index, vals);
6715 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006716 }
6717 catch(std::bad_alloc&)
6718 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006719 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006720 }
6721}
6722
6723void __stdcall glVertexAttrib4fv(GLuint index, const GLfloat* values)
6724{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006725 EVENT("(GLuint index = %d, const GLfloat* values = 0x%0.8p)", index, values);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006726
6727 try
6728 {
6729 if (index >= gl::MAX_VERTEX_ATTRIBS)
6730 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006731 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006732 }
6733
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006734 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006735
6736 if (context)
6737 {
6738 context->setVertexAttrib(index, values);
6739 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006740 }
6741 catch(std::bad_alloc&)
6742 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006743 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006744 }
6745}
6746
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00006747void __stdcall glVertexAttribDivisorANGLE(GLuint index, GLuint divisor)
6748{
6749 EVENT("(GLuint index = %d, GLuint divisor = %d)", index, divisor);
6750
6751 try
6752 {
6753 if (index >= gl::MAX_VERTEX_ATTRIBS)
6754 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006755 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00006756 }
6757
6758 gl::Context *context = gl::getNonLostContext();
6759
6760 if (context)
6761 {
6762 context->setVertexAttribDivisor(index, divisor);
6763 }
6764 }
6765 catch(std::bad_alloc&)
6766 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006767 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00006768 }
6769}
6770
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00006771void __stdcall glVertexAttribPointer(GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid* ptr)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006772{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006773 EVENT("(GLuint index = %d, GLint size = %d, GLenum type = 0x%X, "
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006774 "GLboolean normalized = %u, GLsizei stride = %d, const GLvoid* ptr = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00006775 index, size, type, normalized, stride, ptr);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006776
6777 try
6778 {
6779 if (index >= gl::MAX_VERTEX_ATTRIBS)
6780 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006781 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006782 }
6783
6784 if (size < 1 || size > 4)
6785 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006786 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006787 }
6788
shannon.woods%transgaming.com@gtempaccount.com1a4e09a2013-04-13 03:33:30 +00006789 gl::Context *context = gl::getNonLostContext();
6790
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006791 switch (type)
6792 {
6793 case GL_BYTE:
6794 case GL_UNSIGNED_BYTE:
6795 case GL_SHORT:
6796 case GL_UNSIGNED_SHORT:
6797 case GL_FIXED:
6798 case GL_FLOAT:
6799 break;
shannon.woods%transgaming.com@gtempaccount.com1a4e09a2013-04-13 03:33:30 +00006800
6801 case GL_HALF_FLOAT:
6802 if (context && context->getClientVersion() < 3)
6803 {
6804 return gl::error(GL_INVALID_ENUM);
6805 }
6806 else
6807 {
6808 break;
6809 }
6810
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006811 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006812 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006813 }
6814
6815 if (stride < 0)
6816 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006817 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006818 }
6819
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006820 if (context)
6821 {
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +00006822 context->setVertexAttribState(index, context->getArrayBuffer(), size, type, (normalized == GL_TRUE), stride, ptr);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006823 }
6824 }
6825 catch(std::bad_alloc&)
6826 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006827 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006828 }
6829}
6830
6831void __stdcall glViewport(GLint x, GLint y, GLsizei width, GLsizei height)
6832{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006833 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 +00006834
6835 try
6836 {
6837 if (width < 0 || height < 0)
6838 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006839 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006840 }
6841
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006842 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006843
6844 if (context)
6845 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00006846 context->setViewportParams(x, y, width, height);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006847 }
6848 }
6849 catch(std::bad_alloc&)
6850 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006851 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006852 }
6853}
6854
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006855// OpenGL ES 3.0 functions
6856
6857void __stdcall glReadBuffer(GLenum mode)
6858{
6859 EVENT("(GLenum mode = 0x%X)", mode);
6860
6861 try
6862 {
6863 gl::Context *context = gl::getNonLostContext();
6864
6865 if (context)
6866 {
6867 if (context->getClientVersion() < 3)
6868 {
6869 return gl::error(GL_INVALID_OPERATION);
6870 }
6871 }
6872
6873 UNIMPLEMENTED();
6874 }
6875 catch(std::bad_alloc&)
6876 {
6877 return gl::error(GL_OUT_OF_MEMORY);
6878 }
6879}
6880
6881void __stdcall glDrawRangeElements(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid* indices)
6882{
6883 EVENT("(GLenum mode = 0x%X, GLuint start = %u, GLuint end = %u, GLsizei count = %d, GLenum type = 0x%X, "
6884 "const GLvoid* indices = 0x%0.8p)", mode, start, end, count, type, indices);
6885
6886 try
6887 {
6888 gl::Context *context = gl::getNonLostContext();
6889
6890 if (context)
6891 {
6892 if (context->getClientVersion() < 3)
6893 {
6894 return gl::error(GL_INVALID_OPERATION);
6895 }
6896 }
6897
6898 UNIMPLEMENTED();
6899 }
6900 catch(std::bad_alloc&)
6901 {
6902 return gl::error(GL_OUT_OF_MEMORY);
6903 }
6904}
6905
6906void __stdcall glTexImage3D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid* pixels)
6907{
6908 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint internalformat = %d, GLsizei width = %d, "
6909 "GLsizei height = %d, GLsizei depth = %d, GLint border = %d, GLenum format = 0x%X, "
6910 "GLenum type = 0x%X, const GLvoid* pixels = 0x%0.8p)",
6911 target, level, internalformat, width, height, depth, border, format, type, pixels);
6912
6913 try
6914 {
6915 gl::Context *context = gl::getNonLostContext();
6916
6917 if (context)
6918 {
6919 if (context->getClientVersion() < 3)
6920 {
6921 return gl::error(GL_INVALID_OPERATION);
6922 }
6923 }
6924
6925 UNIMPLEMENTED();
6926 }
6927 catch(std::bad_alloc&)
6928 {
6929 return gl::error(GL_OUT_OF_MEMORY);
6930 }
6931}
6932
6933void __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)
6934{
6935 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
6936 "GLint zoffset = %d, GLsizei width = %d, GLsizei height = %d, GLsizei depth = %d, "
6937 "GLenum format = 0x%X, GLenum type = 0x%X, const GLvoid* pixels = 0x%0.8p)",
6938 target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels);
6939
6940 try
6941 {
6942 gl::Context *context = gl::getNonLostContext();
6943
6944 if (context)
6945 {
6946 if (context->getClientVersion() < 3)
6947 {
6948 return gl::error(GL_INVALID_OPERATION);
6949 }
6950 }
6951
6952 UNIMPLEMENTED();
6953 }
6954 catch(std::bad_alloc&)
6955 {
6956 return gl::error(GL_OUT_OF_MEMORY);
6957 }
6958}
6959
6960void __stdcall glCopyTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height)
6961{
6962 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
6963 "GLint zoffset = %d, GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d)",
6964 target, level, xoffset, yoffset, zoffset, x, y, width, height);
6965
6966 try
6967 {
6968 gl::Context *context = gl::getNonLostContext();
6969
6970 if (context)
6971 {
6972 if (context->getClientVersion() < 3)
6973 {
6974 return gl::error(GL_INVALID_OPERATION);
6975 }
6976 }
6977
6978 UNIMPLEMENTED();
6979 }
6980 catch(std::bad_alloc&)
6981 {
6982 return gl::error(GL_OUT_OF_MEMORY);
6983 }
6984}
6985
6986void __stdcall glCompressedTexImage3D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid* data)
6987{
6988 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint internalformat = %d, GLsizei width = %d, "
6989 "GLsizei height = %d, GLsizei depth = %d, GLint border = %d, GLsizei imageSize = %d, "
6990 "const GLvoid* data = 0x%0.8p)",
6991 target, level, internalformat, width, height, depth, border, imageSize, data);
6992
6993 try
6994 {
6995 gl::Context *context = gl::getNonLostContext();
6996
6997 if (context)
6998 {
6999 if (context->getClientVersion() < 3)
7000 {
7001 return gl::error(GL_INVALID_OPERATION);
7002 }
7003 }
7004
7005 UNIMPLEMENTED();
7006 }
7007 catch(std::bad_alloc&)
7008 {
7009 return gl::error(GL_OUT_OF_MEMORY);
7010 }
7011}
7012
7013void __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)
7014{
7015 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
7016 "GLint zoffset = %d, GLsizei width = %d, GLsizei height = %d, GLsizei depth = %d, "
7017 "GLenum format = 0x%X, GLsizei imageSize = %d, const GLvoid* data = 0x%0.8p)",
7018 target, level, xoffset, yoffset, zoffset, width, height, depth, format, imageSize, data);
7019
7020 try
7021 {
7022 gl::Context *context = gl::getNonLostContext();
7023
7024 if (context)
7025 {
7026 if (context->getClientVersion() < 3)
7027 {
7028 return gl::error(GL_INVALID_OPERATION);
7029 }
7030 }
7031
7032 UNIMPLEMENTED();
7033 }
7034 catch(std::bad_alloc&)
7035 {
7036 return gl::error(GL_OUT_OF_MEMORY);
7037 }
7038}
7039
7040void __stdcall glGenQueries(GLsizei n, GLuint* ids)
7041{
7042 EVENT("(GLsizei n = %d, GLuint* ids = 0x%0.8p)", n, ids);
7043
7044 try
7045 {
7046 gl::Context *context = gl::getNonLostContext();
7047
7048 if (context)
7049 {
7050 if (context->getClientVersion() < 3)
7051 {
7052 return gl::error(GL_INVALID_OPERATION);
7053 }
7054 }
7055
7056 UNIMPLEMENTED();
7057 }
7058 catch(std::bad_alloc&)
7059 {
7060 return gl::error(GL_OUT_OF_MEMORY);
7061 }
7062}
7063
7064void __stdcall glDeleteQueries(GLsizei n, const GLuint* ids)
7065{
7066 EVENT("(GLsizei n = %d, GLuint* ids = 0x%0.8p)", n, ids);
7067
7068 try
7069 {
7070 gl::Context *context = gl::getNonLostContext();
7071
7072 if (context)
7073 {
7074 if (context->getClientVersion() < 3)
7075 {
7076 return gl::error(GL_INVALID_OPERATION);
7077 }
7078 }
7079
7080 UNIMPLEMENTED();
7081 }
7082 catch(std::bad_alloc&)
7083 {
7084 return gl::error(GL_OUT_OF_MEMORY);
7085 }
7086}
7087
7088GLboolean __stdcall glIsQuery(GLuint id)
7089{
7090 EVENT("(GLuint id = %u)", id);
7091
7092 try
7093 {
7094 gl::Context *context = gl::getNonLostContext();
7095
7096 if (context)
7097 {
7098 if (context->getClientVersion() < 3)
7099 {
7100 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
7101 }
7102 }
7103
7104 UNIMPLEMENTED();
7105 }
7106 catch(std::bad_alloc&)
7107 {
7108 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
7109 }
7110
7111 return GL_FALSE;
7112}
7113
7114void __stdcall glBeginQuery(GLenum target, GLuint id)
7115{
7116 EVENT("(GLenum target = 0x%X, GLuint id = %u)", target, id);
7117
7118 try
7119 {
7120 gl::Context *context = gl::getNonLostContext();
7121
7122 if (context)
7123 {
7124 if (context->getClientVersion() < 3)
7125 {
7126 return gl::error(GL_INVALID_OPERATION);
7127 }
7128 }
7129
7130 UNIMPLEMENTED();
7131 }
7132 catch(std::bad_alloc&)
7133 {
7134 return gl::error(GL_OUT_OF_MEMORY);
7135 }
7136}
7137
7138void __stdcall glEndQuery(GLenum target)
7139{
7140 EVENT("(GLenum target = 0x%X)", target);
7141
7142 try
7143 {
7144 gl::Context *context = gl::getNonLostContext();
7145
7146 if (context)
7147 {
7148 if (context->getClientVersion() < 3)
7149 {
7150 return gl::error(GL_INVALID_OPERATION);
7151 }
7152 }
7153
7154 UNIMPLEMENTED();
7155 }
7156 catch(std::bad_alloc&)
7157 {
7158 return gl::error(GL_OUT_OF_MEMORY);
7159 }
7160}
7161
7162void __stdcall glGetQueryiv(GLenum target, GLenum pname, GLint* params)
7163{
7164 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLint* params = 0x%0.8p)", target, pname, params);
7165
7166 try
7167 {
7168 gl::Context *context = gl::getNonLostContext();
7169
7170 if (context)
7171 {
7172 if (context->getClientVersion() < 3)
7173 {
7174 return gl::error(GL_INVALID_OPERATION);
7175 }
7176 }
7177
7178 UNIMPLEMENTED();
7179 }
7180 catch(std::bad_alloc&)
7181 {
7182 return gl::error(GL_OUT_OF_MEMORY);
7183 }
7184}
7185
7186void __stdcall glGetQueryObjectuiv(GLuint id, GLenum pname, GLuint* params)
7187{
7188 EVENT("(GLuint id = %u, GLenum pname = 0x%X, GLint* params = 0x%0.8p)", id, pname, params);
7189
7190 try
7191 {
7192 gl::Context *context = gl::getNonLostContext();
7193
7194 if (context)
7195 {
7196 if (context->getClientVersion() < 3)
7197 {
7198 return gl::error(GL_INVALID_OPERATION);
7199 }
7200 }
7201
7202 UNIMPLEMENTED();
7203 }
7204 catch(std::bad_alloc&)
7205 {
7206 return gl::error(GL_OUT_OF_MEMORY);
7207 }
7208}
7209
7210GLboolean __stdcall glUnmapBuffer(GLenum target)
7211{
7212 EVENT("(GLenum target = 0x%X)", target);
7213
7214 try
7215 {
7216 gl::Context *context = gl::getNonLostContext();
7217
7218 if (context)
7219 {
7220 if (context->getClientVersion() < 3)
7221 {
7222 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
7223 }
7224 }
7225
7226 UNIMPLEMENTED();
7227 }
7228 catch(std::bad_alloc&)
7229 {
7230 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
7231 }
7232
7233 return GL_FALSE;
7234}
7235
7236void __stdcall glGetBufferPointerv(GLenum target, GLenum pname, GLvoid** params)
7237{
7238 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLvoid** params = 0x%0.8p)", target, pname, params);
7239
7240 try
7241 {
7242 gl::Context *context = gl::getNonLostContext();
7243
7244 if (context)
7245 {
7246 if (context->getClientVersion() < 3)
7247 {
7248 return gl::error(GL_INVALID_OPERATION);
7249 }
7250 }
7251
7252 UNIMPLEMENTED();
7253 }
7254 catch(std::bad_alloc&)
7255 {
7256 return gl::error(GL_OUT_OF_MEMORY);
7257 }
7258}
7259
7260void __stdcall glDrawBuffers(GLsizei n, const GLenum* bufs)
7261{
7262 EVENT("(GLsizei n = %d, const GLenum* bufs = 0x%0.8p)", n, bufs);
7263
7264 try
7265 {
7266 gl::Context *context = gl::getNonLostContext();
7267
7268 if (context)
7269 {
7270 if (context->getClientVersion() < 3)
7271 {
7272 return gl::error(GL_INVALID_OPERATION);
7273 }
7274 }
7275
7276 UNIMPLEMENTED();
7277 }
7278 catch(std::bad_alloc&)
7279 {
7280 return gl::error(GL_OUT_OF_MEMORY);
7281 }
7282}
7283
7284void __stdcall glUniformMatrix2x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
7285{
7286 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
7287 location, count, transpose, value);
7288
7289 try
7290 {
7291 gl::Context *context = gl::getNonLostContext();
7292
7293 if (context)
7294 {
7295 if (context->getClientVersion() < 3)
7296 {
7297 return gl::error(GL_INVALID_OPERATION);
7298 }
7299 }
7300
7301 UNIMPLEMENTED();
7302 }
7303 catch(std::bad_alloc&)
7304 {
7305 return gl::error(GL_OUT_OF_MEMORY);
7306 }
7307}
7308
7309void __stdcall glUniformMatrix3x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
7310{
7311 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
7312 location, count, transpose, value);
7313
7314 try
7315 {
7316 gl::Context *context = gl::getNonLostContext();
7317
7318 if (context)
7319 {
7320 if (context->getClientVersion() < 3)
7321 {
7322 return gl::error(GL_INVALID_OPERATION);
7323 }
7324 }
7325
7326 UNIMPLEMENTED();
7327 }
7328 catch(std::bad_alloc&)
7329 {
7330 return gl::error(GL_OUT_OF_MEMORY);
7331 }
7332}
7333
7334void __stdcall glUniformMatrix2x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
7335{
7336 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
7337 location, count, transpose, value);
7338
7339 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 }
7349 }
7350
7351 UNIMPLEMENTED();
7352 }
7353 catch(std::bad_alloc&)
7354 {
7355 return gl::error(GL_OUT_OF_MEMORY);
7356 }
7357}
7358
7359void __stdcall glUniformMatrix4x2fv(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 glUniformMatrix3x4fv(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 glUniformMatrix4x3fv(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 glBlitFramebuffer(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter)
7435{
7436 EVENT("(GLint srcX0 = %d, GLint srcY0 = %d, GLint srcX1 = %d, GLint srcY1 = %d, GLint dstX0 = %d, "
7437 "GLint dstY0 = %d, GLint dstX1 = %d, GLint dstY1 = %d, GLbitfield mask = 0x%X, GLenum filter = 0x%X)",
7438 srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter);
7439
7440 try
7441 {
7442 gl::Context *context = gl::getNonLostContext();
7443
7444 if (context)
7445 {
7446 if (context->getClientVersion() < 3)
7447 {
7448 return gl::error(GL_INVALID_OPERATION);
7449 }
7450 }
7451
7452 UNIMPLEMENTED();
7453 }
7454 catch(std::bad_alloc&)
7455 {
7456 return gl::error(GL_OUT_OF_MEMORY);
7457 }
7458}
7459
7460void __stdcall glRenderbufferStorageMultisample(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height)
7461{
7462 EVENT("(GLenum target = 0x%X, GLsizei samples = %d, GLenum internalformat = 0x%X, GLsizei width = %d, GLsizei height = %d)",
7463 target, samples, internalformat, width, height);
7464
7465 try
7466 {
7467 gl::Context *context = gl::getNonLostContext();
7468
7469 if (context)
7470 {
7471 if (context->getClientVersion() < 3)
7472 {
7473 return gl::error(GL_INVALID_OPERATION);
7474 }
7475 }
7476
7477 UNIMPLEMENTED();
7478 }
7479 catch(std::bad_alloc&)
7480 {
7481 return gl::error(GL_OUT_OF_MEMORY);
7482 }
7483}
7484
7485void __stdcall glFramebufferTextureLayer(GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer)
7486{
7487 EVENT("(GLenum target = 0x%X, GLenum attachment = 0x%X, GLuint texture = %u, GLint level = %d, GLint layer = %d)",
7488 target, attachment, texture, level, layer);
7489
7490 try
7491 {
7492 gl::Context *context = gl::getNonLostContext();
7493
7494 if (context)
7495 {
7496 if (context->getClientVersion() < 3)
7497 {
7498 return gl::error(GL_INVALID_OPERATION);
7499 }
7500 }
7501
7502 UNIMPLEMENTED();
7503 }
7504 catch(std::bad_alloc&)
7505 {
7506 return gl::error(GL_OUT_OF_MEMORY);
7507 }
7508}
7509
7510GLvoid* __stdcall glMapBufferRange(GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access)
7511{
7512 EVENT("(GLenum target = 0x%X, GLintptr offset = %d, GLsizeiptr length = %d, GLbitfield access = 0x%X)",
7513 target, offset, length, access);
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, reinterpret_cast<GLvoid*>(NULL));
7524 }
7525 }
7526
7527 UNIMPLEMENTED();
7528 }
7529 catch(std::bad_alloc&)
7530 {
7531 return gl::error(GL_OUT_OF_MEMORY, reinterpret_cast<GLvoid*>(NULL));
7532 }
7533
7534 return NULL;
7535}
7536
7537void __stdcall glFlushMappedBufferRange(GLenum target, GLintptr offset, GLsizeiptr length)
7538{
7539 EVENT("(GLenum target = 0x%X, GLintptr offset = %d, GLsizeiptr length = %d)", target, offset, length);
7540
7541 try
7542 {
7543 gl::Context *context = gl::getNonLostContext();
7544
7545 if (context)
7546 {
7547 if (context->getClientVersion() < 3)
7548 {
7549 return gl::error(GL_INVALID_OPERATION);
7550 }
7551 }
7552
7553 UNIMPLEMENTED();
7554 }
7555 catch(std::bad_alloc&)
7556 {
7557 return gl::error(GL_OUT_OF_MEMORY);
7558 }
7559}
7560
7561void __stdcall glBindVertexArray(GLuint array)
7562{
7563 EVENT("(GLuint array = %u)", array);
7564
7565 try
7566 {
7567 gl::Context *context = gl::getNonLostContext();
7568
7569 if (context)
7570 {
7571 if (context->getClientVersion() < 3)
7572 {
7573 return gl::error(GL_INVALID_OPERATION);
7574 }
7575 }
7576
7577 UNIMPLEMENTED();
7578 }
7579 catch(std::bad_alloc&)
7580 {
7581 return gl::error(GL_OUT_OF_MEMORY);
7582 }
7583}
7584
7585void __stdcall glDeleteVertexArrays(GLsizei n, const GLuint* arrays)
7586{
7587 EVENT("(GLsizei n = %d, const GLuint* arrays = 0x%0.8p)", n, arrays);
7588
7589 try
7590 {
7591 gl::Context *context = gl::getNonLostContext();
7592
7593 if (context)
7594 {
7595 if (context->getClientVersion() < 3)
7596 {
7597 return gl::error(GL_INVALID_OPERATION);
7598 }
7599 }
7600
7601 UNIMPLEMENTED();
7602 }
7603 catch(std::bad_alloc&)
7604 {
7605 return gl::error(GL_OUT_OF_MEMORY);
7606 }
7607}
7608
7609void __stdcall glGenVertexArrays(GLsizei n, GLuint* arrays)
7610{
7611 EVENT("(GLsizei n = %d, GLuint* arrays = 0x%0.8p)", n, arrays);
7612
7613 try
7614 {
7615 gl::Context *context = gl::getNonLostContext();
7616
7617 if (context)
7618 {
7619 if (context->getClientVersion() < 3)
7620 {
7621 return gl::error(GL_INVALID_OPERATION);
7622 }
7623 }
7624
7625 UNIMPLEMENTED();
7626 }
7627 catch(std::bad_alloc&)
7628 {
7629 return gl::error(GL_OUT_OF_MEMORY);
7630 }
7631}
7632
7633GLboolean __stdcall glIsVertexArray(GLuint array)
7634{
7635 EVENT("(GLuint array = %u)", array);
7636
7637 try
7638 {
7639 gl::Context *context = gl::getNonLostContext();
7640
7641 if (context)
7642 {
7643 if (context->getClientVersion() < 3)
7644 {
7645 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
7646 }
7647 }
7648
7649 UNIMPLEMENTED();
7650 }
7651 catch(std::bad_alloc&)
7652 {
7653 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
7654 }
7655
7656 return GL_FALSE;
7657}
7658
7659void __stdcall glGetIntegeri_v(GLenum target, GLuint index, GLint* data)
7660{
7661 EVENT("(GLenum target = 0x%X, GLuint index = %u, GLint* data = 0x%0.8p)",
7662 target, index, data);
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 glBeginTransformFeedback(GLenum primitiveMode)
7685{
7686 EVENT("(GLenum primitiveMode = 0x%X)", primitiveMode);
7687
7688 try
7689 {
7690 gl::Context *context = gl::getNonLostContext();
7691
7692 if (context)
7693 {
7694 if (context->getClientVersion() < 3)
7695 {
7696 return gl::error(GL_INVALID_OPERATION);
7697 }
7698 }
7699
7700 UNIMPLEMENTED();
7701 }
7702 catch(std::bad_alloc&)
7703 {
7704 return gl::error(GL_OUT_OF_MEMORY);
7705 }
7706}
7707
7708void __stdcall glEndTransformFeedback(void)
7709{
7710 EVENT("(void)");
7711
7712 try
7713 {
7714 gl::Context *context = gl::getNonLostContext();
7715
7716 if (context)
7717 {
7718 if (context->getClientVersion() < 3)
7719 {
7720 return gl::error(GL_INVALID_OPERATION);
7721 }
7722 }
7723
7724 UNIMPLEMENTED();
7725 }
7726 catch(std::bad_alloc&)
7727 {
7728 return gl::error(GL_OUT_OF_MEMORY);
7729 }
7730}
7731
7732void __stdcall glBindBufferRange(GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size)
7733{
7734 EVENT("(GLenum target = 0x%X, GLuint index = %u, GLuint buffer = %u, GLintptr offset = %d, GLsizeiptr size = %d)",
7735 target, index, buffer, offset, size);
7736
7737 try
7738 {
7739 gl::Context *context = gl::getNonLostContext();
7740
7741 if (context)
7742 {
7743 if (context->getClientVersion() < 3)
7744 {
7745 return gl::error(GL_INVALID_OPERATION);
7746 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007747
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007748 switch (target)
7749 {
7750 case GL_TRANSFORM_FEEDBACK_BUFFER:
7751 if (index > context->getMaxTransformFeedbackBufferBindings())
7752 {
7753 return gl::error(GL_INVALID_VALUE);
7754 }
7755 break;
7756
7757 case GL_UNIFORM_BUFFER:
7758 if (index >= context->getMaximumCombinedUniformBufferBindings())
7759 {
7760 return gl::error(GL_INVALID_VALUE);
7761 }
7762 break;
7763
7764 default:
7765 return gl::error(GL_INVALID_ENUM);
7766 }
7767
7768 gl::Buffer *bufferObject = context->getBuffer(buffer);
7769 if (!bufferObject)
7770 {
7771 // Buffer index must not have been valid
7772 return gl::error(GL_INVALID_VALUE);
7773 }
7774
7775 if (size <= 0 || static_cast<unsigned int>(offset + size) > bufferObject->size())
7776 {
7777 return gl::error(GL_INVALID_VALUE);
7778 }
7779
7780 switch (target)
7781 {
7782 case GL_TRANSFORM_FEEDBACK_BUFFER:
7783 context->bindTransformFeedbackBuffer(buffer, index, offset, size);
7784 break;
7785
7786 case GL_UNIFORM_BUFFER:
7787 context->bindUniformBuffer(buffer, index, offset, size);
7788 break;
7789
7790 default:
7791 UNREACHABLE();
7792 }
7793 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007794 }
7795 catch(std::bad_alloc&)
7796 {
7797 return gl::error(GL_OUT_OF_MEMORY);
7798 }
7799}
7800
7801void __stdcall glBindBufferBase(GLenum target, GLuint index, GLuint buffer)
7802{
7803 EVENT("(GLenum target = 0x%X, GLuint index = %u, GLuint buffer = %u)",
7804 target, index, buffer);
7805
7806 try
7807 {
7808 gl::Context *context = gl::getNonLostContext();
7809
7810 if (context)
7811 {
7812 if (context->getClientVersion() < 3)
7813 {
7814 return gl::error(GL_INVALID_OPERATION);
7815 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007816
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007817 switch (target)
7818 {
7819 case GL_TRANSFORM_FEEDBACK_BUFFER:
7820 if (index > context->getMaxTransformFeedbackBufferBindings())
7821 {
7822 return gl::error(GL_INVALID_VALUE);
7823 }
7824 break;
7825
7826 case GL_UNIFORM_BUFFER:
7827 if (index > context->getMaximumCombinedUniformBufferBindings())
7828 {
7829 return gl::error(GL_INVALID_VALUE);
7830 }
7831 break;
7832
7833 default:
7834 return gl::error(GL_INVALID_ENUM);
7835 }
7836
7837 gl::Buffer *bufferObject = context->getBuffer(buffer);
7838 if (!bufferObject)
7839 {
7840 // Buffer index must not have been valid
7841 return gl::error(GL_INVALID_VALUE);
7842 }
7843
7844 switch (target)
7845 {
7846 case GL_TRANSFORM_FEEDBACK_BUFFER:
7847 context->bindTransformFeedbackBuffer(buffer, index, 0, -1);
7848 break;
7849
7850 case GL_UNIFORM_BUFFER:
7851 context->bindUniformBuffer(buffer, index, 0, -1);
7852 break;
7853
7854 default:
7855 UNREACHABLE();
7856 }
7857 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007858 }
7859 catch(std::bad_alloc&)
7860 {
7861 return gl::error(GL_OUT_OF_MEMORY);
7862 }
7863}
7864
7865void __stdcall glTransformFeedbackVaryings(GLuint program, GLsizei count, const GLchar* const* varyings, GLenum bufferMode)
7866{
7867 EVENT("(GLuint program = %u, GLsizei count = %d, const GLchar* const* varyings = 0x%0.8p, GLenum bufferMode = 0x%X)",
7868 program, count, varyings, bufferMode);
7869
7870 try
7871 {
7872 gl::Context *context = gl::getNonLostContext();
7873
7874 if (context)
7875 {
7876 if (context->getClientVersion() < 3)
7877 {
7878 return gl::error(GL_INVALID_OPERATION);
7879 }
7880 }
7881
7882 UNIMPLEMENTED();
7883 }
7884 catch(std::bad_alloc&)
7885 {
7886 return gl::error(GL_OUT_OF_MEMORY);
7887 }
7888}
7889
7890void __stdcall glGetTransformFeedbackVarying(GLuint program, GLuint index, GLsizei bufSize, GLsizei* length, GLsizei* size, GLenum* type, GLchar* name)
7891{
7892 EVENT("(GLuint program = %u, GLuint index = %u, GLsizei bufSize = %d, GLsizei* length = 0x%0.8p, "
7893 "GLsizei* size = 0x%0.8p, GLenum* type = 0x%0.8p, GLchar* name = 0x%0.8p)",
7894 program, index, bufSize, length, size, type, name);
7895
7896 try
7897 {
7898 gl::Context *context = gl::getNonLostContext();
7899
7900 if (context)
7901 {
7902 if (context->getClientVersion() < 3)
7903 {
7904 return gl::error(GL_INVALID_OPERATION);
7905 }
7906 }
7907
7908 UNIMPLEMENTED();
7909 }
7910 catch(std::bad_alloc&)
7911 {
7912 return gl::error(GL_OUT_OF_MEMORY);
7913 }
7914}
7915
7916void __stdcall glVertexAttribIPointer(GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid* pointer)
7917{
7918 EVENT("(GLuint index = %u, GLint size = %d, GLenum type = 0x%X, GLsizei stride = %d, const GLvoid* pointer = 0x%0.8p)",
7919 index, size, type, stride, pointer);
7920
7921 try
7922 {
7923 gl::Context *context = gl::getNonLostContext();
7924
7925 if (context)
7926 {
7927 if (context->getClientVersion() < 3)
7928 {
7929 return gl::error(GL_INVALID_OPERATION);
7930 }
7931 }
7932
7933 UNIMPLEMENTED();
7934 }
7935 catch(std::bad_alloc&)
7936 {
7937 return gl::error(GL_OUT_OF_MEMORY);
7938 }
7939}
7940
7941void __stdcall glGetVertexAttribIiv(GLuint index, GLenum pname, GLint* params)
7942{
7943 EVENT("(GLuint index = %u, GLenum pname = 0x%X, GLint* params = 0x%0.8p)",
7944 index, pname, params);
7945
7946 try
7947 {
7948 gl::Context *context = gl::getNonLostContext();
7949
7950 if (context)
7951 {
7952 if (context->getClientVersion() < 3)
7953 {
7954 return gl::error(GL_INVALID_OPERATION);
7955 }
7956 }
7957
7958 UNIMPLEMENTED();
7959 }
7960 catch(std::bad_alloc&)
7961 {
7962 return gl::error(GL_OUT_OF_MEMORY);
7963 }
7964}
7965
7966void __stdcall glGetVertexAttribIuiv(GLuint index, GLenum pname, GLuint* params)
7967{
7968 EVENT("(GLuint index = %u, GLenum pname = 0x%X, GLuint* params = 0x%0.8p)",
7969 index, pname, params);
7970
7971 try
7972 {
7973 gl::Context *context = gl::getNonLostContext();
7974
7975 if (context)
7976 {
7977 if (context->getClientVersion() < 3)
7978 {
7979 return gl::error(GL_INVALID_OPERATION);
7980 }
7981 }
7982
7983 UNIMPLEMENTED();
7984 }
7985 catch(std::bad_alloc&)
7986 {
7987 return gl::error(GL_OUT_OF_MEMORY);
7988 }
7989}
7990
7991void __stdcall glVertexAttribI4i(GLuint index, GLint x, GLint y, GLint z, GLint w)
7992{
7993 EVENT("(GLuint index = %u, GLint x = %d, GLint y = %d, GLint z = %d, GLint w = %d)",
7994 index, x, y, z, w);
7995
7996 try
7997 {
7998 gl::Context *context = gl::getNonLostContext();
7999
8000 if (context)
8001 {
8002 if (context->getClientVersion() < 3)
8003 {
8004 return gl::error(GL_INVALID_OPERATION);
8005 }
8006 }
8007
8008 UNIMPLEMENTED();
8009 }
8010 catch(std::bad_alloc&)
8011 {
8012 return gl::error(GL_OUT_OF_MEMORY);
8013 }
8014}
8015
8016void __stdcall glVertexAttribI4ui(GLuint index, GLuint x, GLuint y, GLuint z, GLuint w)
8017{
8018 EVENT("(GLuint index = %u, GLuint x = %u, GLuint y = %u, GLuint z = %u, GLuint w = %u)",
8019 index, x, y, z, w);
8020
8021 try
8022 {
8023 gl::Context *context = gl::getNonLostContext();
8024
8025 if (context)
8026 {
8027 if (context->getClientVersion() < 3)
8028 {
8029 return gl::error(GL_INVALID_OPERATION);
8030 }
8031 }
8032
8033 UNIMPLEMENTED();
8034 }
8035 catch(std::bad_alloc&)
8036 {
8037 return gl::error(GL_OUT_OF_MEMORY);
8038 }
8039}
8040
8041void __stdcall glVertexAttribI4iv(GLuint index, const GLint* v)
8042{
8043 EVENT("(GLuint index = %u, const GLint* v = 0x%0.8p)", index, v);
8044
8045 try
8046 {
8047 gl::Context *context = gl::getNonLostContext();
8048
8049 if (context)
8050 {
8051 if (context->getClientVersion() < 3)
8052 {
8053 return gl::error(GL_INVALID_OPERATION);
8054 }
8055 }
8056
8057 UNIMPLEMENTED();
8058 }
8059 catch(std::bad_alloc&)
8060 {
8061 return gl::error(GL_OUT_OF_MEMORY);
8062 }
8063}
8064
8065void __stdcall glVertexAttribI4uiv(GLuint index, const GLuint* v)
8066{
8067 EVENT("(GLuint index = %u, const GLuint* v = 0x%0.8p)", index, v);
8068
8069 try
8070 {
8071 gl::Context *context = gl::getNonLostContext();
8072
8073 if (context)
8074 {
8075 if (context->getClientVersion() < 3)
8076 {
8077 return gl::error(GL_INVALID_OPERATION);
8078 }
8079 }
8080
8081 UNIMPLEMENTED();
8082 }
8083 catch(std::bad_alloc&)
8084 {
8085 return gl::error(GL_OUT_OF_MEMORY);
8086 }
8087}
8088
8089void __stdcall glGetUniformuiv(GLuint program, GLint location, GLuint* params)
8090{
8091 EVENT("(GLuint program = %u, GLint location = %d, GLuint* params = 0x%0.8p)",
8092 program, location, params);
8093
8094 try
8095 {
8096 gl::Context *context = gl::getNonLostContext();
8097
8098 if (context)
8099 {
8100 if (context->getClientVersion() < 3)
8101 {
8102 return gl::error(GL_INVALID_OPERATION);
8103 }
8104 }
8105
8106 UNIMPLEMENTED();
8107 }
8108 catch(std::bad_alloc&)
8109 {
8110 return gl::error(GL_OUT_OF_MEMORY);
8111 }
8112}
8113
8114GLint __stdcall glGetFragDataLocation(GLuint program, const GLchar *name)
8115{
8116 EVENT("(GLuint program = %u, const GLchar *name = 0x%0.8p)",
8117 program, name);
8118
8119 try
8120 {
8121 gl::Context *context = gl::getNonLostContext();
8122
8123 if (context)
8124 {
8125 if (context->getClientVersion() < 3)
8126 {
8127 return gl::error(GL_INVALID_OPERATION, 0);
8128 }
8129 }
8130
8131 UNIMPLEMENTED();
8132 }
8133 catch(std::bad_alloc&)
8134 {
8135 return gl::error(GL_OUT_OF_MEMORY, 0);
8136 }
8137
8138 return 0;
8139}
8140
8141void __stdcall glUniform1ui(GLint location, GLuint v0)
8142{
8143 EVENT("(GLint location = %d, GLuint v0 = %u)",
8144 location, v0);
8145
8146 try
8147 {
8148 gl::Context *context = gl::getNonLostContext();
8149
8150 if (context)
8151 {
8152 if (context->getClientVersion() < 3)
8153 {
8154 return gl::error(GL_INVALID_OPERATION);
8155 }
8156 }
8157
8158 UNIMPLEMENTED();
8159 }
8160 catch(std::bad_alloc&)
8161 {
8162 return gl::error(GL_OUT_OF_MEMORY);
8163 }
8164}
8165
8166void __stdcall glUniform2ui(GLint location, GLuint v0, GLuint v1)
8167{
8168 EVENT("(GLint location = %d, GLuint v0 = %u, GLuint v1 = %u)",
8169 location, v0, v1);
8170
8171 try
8172 {
8173 gl::Context *context = gl::getNonLostContext();
8174
8175 if (context)
8176 {
8177 if (context->getClientVersion() < 3)
8178 {
8179 return gl::error(GL_INVALID_OPERATION);
8180 }
8181 }
8182
8183 UNIMPLEMENTED();
8184 }
8185 catch(std::bad_alloc&)
8186 {
8187 return gl::error(GL_OUT_OF_MEMORY);
8188 }
8189}
8190
8191void __stdcall glUniform3ui(GLint location, GLuint v0, GLuint v1, GLuint v2)
8192{
8193 EVENT("(GLint location = %d, GLuint v0 = %u, GLuint v1 = %u, GLuint v2 = %u)",
8194 location, v0, v1, v2);
8195
8196 try
8197 {
8198 gl::Context *context = gl::getNonLostContext();
8199
8200 if (context)
8201 {
8202 if (context->getClientVersion() < 3)
8203 {
8204 return gl::error(GL_INVALID_OPERATION);
8205 }
8206 }
8207
8208 UNIMPLEMENTED();
8209 }
8210 catch(std::bad_alloc&)
8211 {
8212 return gl::error(GL_OUT_OF_MEMORY);
8213 }
8214}
8215
8216void __stdcall glUniform4ui(GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3)
8217{
8218 EVENT("(GLint location = %d, GLuint v0 = %u, GLuint v1 = %u, GLuint v2 = %u, GLuint v3 = %u)",
8219 location, v0, v1, v2, v3);
8220
8221 try
8222 {
8223 gl::Context *context = gl::getNonLostContext();
8224
8225 if (context)
8226 {
8227 if (context->getClientVersion() < 3)
8228 {
8229 return gl::error(GL_INVALID_OPERATION);
8230 }
8231 }
8232
8233 UNIMPLEMENTED();
8234 }
8235 catch(std::bad_alloc&)
8236 {
8237 return gl::error(GL_OUT_OF_MEMORY);
8238 }
8239}
8240
8241void __stdcall glUniform1uiv(GLint location, GLsizei count, const GLuint* value)
8242{
8243 EVENT("(GLint location = %d, GLsizei count = %d, const GLuint* value = 0x%0.8p)",
8244 location, count, value);
8245
8246 try
8247 {
8248 gl::Context *context = gl::getNonLostContext();
8249
8250 if (context)
8251 {
8252 if (context->getClientVersion() < 3)
8253 {
8254 return gl::error(GL_INVALID_OPERATION);
8255 }
8256 }
8257
8258 UNIMPLEMENTED();
8259 }
8260 catch(std::bad_alloc&)
8261 {
8262 return gl::error(GL_OUT_OF_MEMORY);
8263 }
8264}
8265
8266void __stdcall glUniform2uiv(GLint location, GLsizei count, const GLuint* value)
8267{
8268 EVENT("(GLint location = %d, GLsizei count = %d, const GLuint* value = 0x%0.8p)",
8269 location, count, value);
8270
8271 try
8272 {
8273 gl::Context *context = gl::getNonLostContext();
8274
8275 if (context)
8276 {
8277 if (context->getClientVersion() < 3)
8278 {
8279 return gl::error(GL_INVALID_OPERATION);
8280 }
8281 }
8282
8283 UNIMPLEMENTED();
8284 }
8285 catch(std::bad_alloc&)
8286 {
8287 return gl::error(GL_OUT_OF_MEMORY);
8288 }
8289}
8290
8291void __stdcall glUniform3uiv(GLint location, GLsizei count, const GLuint* value)
8292{
8293 EVENT("(GLint location = %d, GLsizei count = %d, const GLuint* value)",
8294 location, count, value);
8295
8296 try
8297 {
8298 gl::Context *context = gl::getNonLostContext();
8299
8300 if (context)
8301 {
8302 if (context->getClientVersion() < 3)
8303 {
8304 return gl::error(GL_INVALID_OPERATION);
8305 }
8306 }
8307
8308 UNIMPLEMENTED();
8309 }
8310 catch(std::bad_alloc&)
8311 {
8312 return gl::error(GL_OUT_OF_MEMORY);
8313 }
8314}
8315
8316void __stdcall glUniform4uiv(GLint location, GLsizei count, const GLuint* value)
8317{
8318 EVENT("(GLint location = %d, GLsizei count = %d, const GLuint* value = 0x%0.8p)",
8319 location, count, value);
8320
8321 try
8322 {
8323 gl::Context *context = gl::getNonLostContext();
8324
8325 if (context)
8326 {
8327 if (context->getClientVersion() < 3)
8328 {
8329 return gl::error(GL_INVALID_OPERATION);
8330 }
8331 }
8332
8333 UNIMPLEMENTED();
8334 }
8335 catch(std::bad_alloc&)
8336 {
8337 return gl::error(GL_OUT_OF_MEMORY);
8338 }
8339}
8340
8341void __stdcall glClearBufferiv(GLenum buffer, GLint drawbuffer, const GLint* value)
8342{
8343 EVENT("(GLenum buffer = 0x%X, GLint drawbuffer = %d, const GLint* value = 0x%0.8p)",
8344 buffer, drawbuffer, value);
8345
8346 try
8347 {
8348 gl::Context *context = gl::getNonLostContext();
8349
8350 if (context)
8351 {
8352 if (context->getClientVersion() < 3)
8353 {
8354 return gl::error(GL_INVALID_OPERATION);
8355 }
8356 }
8357
8358 UNIMPLEMENTED();
8359 }
8360 catch(std::bad_alloc&)
8361 {
8362 return gl::error(GL_OUT_OF_MEMORY);
8363 }
8364}
8365
8366void __stdcall glClearBufferuiv(GLenum buffer, GLint drawbuffer, const GLuint* value)
8367{
8368 EVENT("(GLenum buffer = 0x%X, GLint drawbuffer = %d, const GLuint* value = 0x%0.8p)",
8369 buffer, drawbuffer, value);
8370
8371 try
8372 {
8373 gl::Context *context = gl::getNonLostContext();
8374
8375 if (context)
8376 {
8377 if (context->getClientVersion() < 3)
8378 {
8379 return gl::error(GL_INVALID_OPERATION);
8380 }
8381 }
8382
8383 UNIMPLEMENTED();
8384 }
8385 catch(std::bad_alloc&)
8386 {
8387 return gl::error(GL_OUT_OF_MEMORY);
8388 }
8389}
8390
8391void __stdcall glClearBufferfv(GLenum buffer, GLint drawbuffer, const GLfloat* value)
8392{
8393 EVENT("(GLenum buffer = 0x%X, GLint drawbuffer = %d, const GLfloat* value = 0x%0.8p)",
8394 buffer, drawbuffer, value);
8395
8396 try
8397 {
8398 gl::Context *context = gl::getNonLostContext();
8399
8400 if (context)
8401 {
8402 if (context->getClientVersion() < 3)
8403 {
8404 return gl::error(GL_INVALID_OPERATION);
8405 }
8406 }
8407
8408 UNIMPLEMENTED();
8409 }
8410 catch(std::bad_alloc&)
8411 {
8412 return gl::error(GL_OUT_OF_MEMORY);
8413 }
8414}
8415
8416void __stdcall glClearBufferfi(GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil)
8417{
8418 EVENT("(GLenum buffer = 0x%X, GLint drawbuffer = %d, GLfloat depth, GLint stencil = %d)",
8419 buffer, drawbuffer, depth, stencil);
8420
8421 try
8422 {
8423 gl::Context *context = gl::getNonLostContext();
8424
8425 if (context)
8426 {
8427 if (context->getClientVersion() < 3)
8428 {
8429 return gl::error(GL_INVALID_OPERATION);
8430 }
8431 }
8432
8433 UNIMPLEMENTED();
8434 }
8435 catch(std::bad_alloc&)
8436 {
8437 return gl::error(GL_OUT_OF_MEMORY);
8438 }
8439}
8440
8441const GLubyte* __stdcall glGetStringi(GLenum name, GLuint index)
8442{
8443 EVENT("(GLenum name = 0x%X, GLuint index = %u)", name, index);
8444
8445 try
8446 {
8447 gl::Context *context = gl::getNonLostContext();
8448
8449 if (context)
8450 {
8451 if (context->getClientVersion() < 3)
8452 {
8453 return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLubyte*>(NULL));
8454 }
8455 }
8456
8457 UNIMPLEMENTED();
8458 }
8459 catch(std::bad_alloc&)
8460 {
8461 return gl::error(GL_OUT_OF_MEMORY, reinterpret_cast<GLubyte*>(NULL));
8462 }
8463
8464 return NULL;
8465}
8466
8467void __stdcall glCopyBufferSubData(GLenum readTarget, GLenum writeTarget, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size)
8468{
8469 EVENT("(GLenum readTarget = 0x%X, GLenum writeTarget = 0x%X, GLintptr readOffset = %d, GLintptr writeOffset = %d, GLsizeiptr size = %d)",
8470 readTarget, writeTarget, readOffset, writeOffset, size);
8471
8472 try
8473 {
8474 gl::Context *context = gl::getNonLostContext();
8475
8476 if (context)
8477 {
8478 if (context->getClientVersion() < 3)
8479 {
8480 return gl::error(GL_INVALID_OPERATION);
8481 }
8482 }
8483
8484 UNIMPLEMENTED();
8485 }
8486 catch(std::bad_alloc&)
8487 {
8488 return gl::error(GL_OUT_OF_MEMORY);
8489 }
8490}
8491
8492void __stdcall glGetUniformIndices(GLuint program, GLsizei uniformCount, const GLchar* const* uniformNames, GLuint* uniformIndices)
8493{
8494 EVENT("(GLuint program = %u, GLsizei uniformCount = %d, const GLchar* const* uniformNames = 0x%0.8p, GLuint* uniformIndices = 0x%0.8p)",
8495 program, uniformCount, uniformNames, uniformIndices);
8496
8497 try
8498 {
8499 gl::Context *context = gl::getNonLostContext();
8500
8501 if (context)
8502 {
8503 if (context->getClientVersion() < 3)
8504 {
8505 return gl::error(GL_INVALID_OPERATION);
8506 }
8507 }
8508
8509 UNIMPLEMENTED();
8510 }
8511 catch(std::bad_alloc&)
8512 {
8513 return gl::error(GL_OUT_OF_MEMORY);
8514 }
8515}
8516
8517void __stdcall glGetActiveUniformsiv(GLuint program, GLsizei uniformCount, const GLuint* uniformIndices, GLenum pname, GLint* params)
8518{
8519 EVENT("(GLuint program = %u, GLsizei uniformCount = %d, const GLuint* uniformIndices = 0x%0.8p, GLenum pname = 0x%X, GLint* params = 0x%0.8p)",
8520 program, uniformCount, uniformIndices, pname, params);
8521
8522 try
8523 {
8524 gl::Context *context = gl::getNonLostContext();
8525
8526 if (context)
8527 {
8528 if (context->getClientVersion() < 3)
8529 {
8530 return gl::error(GL_INVALID_OPERATION);
8531 }
8532 }
8533
8534 UNIMPLEMENTED();
8535 }
8536 catch(std::bad_alloc&)
8537 {
8538 return gl::error(GL_OUT_OF_MEMORY);
8539 }
8540}
8541
8542GLuint __stdcall glGetUniformBlockIndex(GLuint program, const GLchar* uniformBlockName)
8543{
8544 EVENT("(GLuint program = %u, const GLchar* uniformBlockName = 0x%0.8p)", program, uniformBlockName);
8545
8546 try
8547 {
8548 gl::Context *context = gl::getNonLostContext();
8549
8550 if (context)
8551 {
8552 if (context->getClientVersion() < 3)
8553 {
8554 return gl::error(GL_INVALID_OPERATION, 0);
8555 }
8556 }
8557
8558 UNIMPLEMENTED();
8559 }
8560 catch(std::bad_alloc&)
8561 {
8562 return gl::error(GL_OUT_OF_MEMORY, 0);
8563 }
8564
8565 return 0;
8566}
8567
8568void __stdcall glGetActiveUniformBlockiv(GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint* params)
8569{
8570 EVENT("(GLuint program = %u, GLuint uniformBlockIndex = %u, GLenum pname = 0x%X, GLint* params = 0x%0.8p)",
8571 program, uniformBlockIndex, pname, params);
8572
8573 try
8574 {
8575 gl::Context *context = gl::getNonLostContext();
8576
8577 if (context)
8578 {
8579 if (context->getClientVersion() < 3)
8580 {
8581 return gl::error(GL_INVALID_OPERATION);
8582 }
8583 }
8584
8585 UNIMPLEMENTED();
8586 }
8587 catch(std::bad_alloc&)
8588 {
8589 return gl::error(GL_OUT_OF_MEMORY);
8590 }
8591}
8592
8593void __stdcall glGetActiveUniformBlockName(GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei* length, GLchar* uniformBlockName)
8594{
8595 EVENT("(GLuint program = %u, GLuint uniformBlockIndex = %u, GLsizei bufSize = %d, GLsizei* length = 0x%0.8p, GLchar* uniformBlockName = 0x%0.8p)",
8596 program, uniformBlockIndex, bufSize, length, uniformBlockName);
8597
8598 try
8599 {
8600 gl::Context *context = gl::getNonLostContext();
8601
8602 if (context)
8603 {
8604 if (context->getClientVersion() < 3)
8605 {
8606 return gl::error(GL_INVALID_OPERATION);
8607 }
8608 }
8609
8610 UNIMPLEMENTED();
8611 }
8612 catch(std::bad_alloc&)
8613 {
8614 return gl::error(GL_OUT_OF_MEMORY);
8615 }
8616}
8617
8618void __stdcall glUniformBlockBinding(GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding)
8619{
8620 EVENT("(GLuint program = %u, GLuint uniformBlockIndex = %u, GLuint uniformBlockBinding = %u)",
8621 program, uniformBlockIndex, uniformBlockBinding);
8622
8623 try
8624 {
8625 gl::Context *context = gl::getNonLostContext();
8626
8627 if (context)
8628 {
8629 if (context->getClientVersion() < 3)
8630 {
8631 return gl::error(GL_INVALID_OPERATION);
8632 }
8633 }
8634
8635 UNIMPLEMENTED();
8636 }
8637 catch(std::bad_alloc&)
8638 {
8639 return gl::error(GL_OUT_OF_MEMORY);
8640 }
8641}
8642
8643void __stdcall glDrawArraysInstanced(GLenum mode, GLint first, GLsizei count, GLsizei instanceCount)
8644{
8645 EVENT("(GLenum mode = 0x%X, GLint first = %d, GLsizei count = %d, GLsizei instanceCount = %d)",
8646 mode, first, count, instanceCount);
8647
8648 try
8649 {
8650 gl::Context *context = gl::getNonLostContext();
8651
8652 if (context)
8653 {
8654 if (context->getClientVersion() < 3)
8655 {
8656 return gl::error(GL_INVALID_OPERATION);
8657 }
8658 }
8659
8660 UNIMPLEMENTED();
8661 }
8662 catch(std::bad_alloc&)
8663 {
8664 return gl::error(GL_OUT_OF_MEMORY);
8665 }
8666}
8667
8668void __stdcall glDrawElementsInstanced(GLenum mode, GLsizei count, GLenum type, const GLvoid* indices, GLsizei instanceCount)
8669{
8670 EVENT("(GLenum mode = 0x%X, GLsizei count = %d, GLenum type = 0x%X, const GLvoid* indices = 0x%0.8p, GLsizei instanceCount = %d)",
8671 mode, count, type, indices, instanceCount);
8672
8673 try
8674 {
8675 gl::Context *context = gl::getNonLostContext();
8676
8677 if (context)
8678 {
8679 if (context->getClientVersion() < 3)
8680 {
8681 return gl::error(GL_INVALID_OPERATION);
8682 }
8683 }
8684
8685 UNIMPLEMENTED();
8686 }
8687 catch(std::bad_alloc&)
8688 {
8689 return gl::error(GL_OUT_OF_MEMORY);
8690 }
8691}
8692
8693GLsync __stdcall glFenceSync(GLenum condition, GLbitfield flags)
8694{
8695 EVENT("(GLenum condition = 0x%X, GLbitfield flags = 0x%X)", condition, flags);
8696
8697 try
8698 {
8699 gl::Context *context = gl::getNonLostContext();
8700
8701 if (context)
8702 {
8703 if (context->getClientVersion() < 3)
8704 {
8705 return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLsync>(NULL));
8706 }
8707 }
8708
8709 UNIMPLEMENTED();
8710 }
8711 catch(std::bad_alloc&)
8712 {
8713 return gl::error(GL_OUT_OF_MEMORY, reinterpret_cast<GLsync>(NULL));
8714 }
8715
8716 return NULL;
8717}
8718
8719GLboolean __stdcall glIsSync(GLsync sync)
8720{
8721 EVENT("(GLsync sync = 0x%0.8p)", sync);
8722
8723 try
8724 {
8725 gl::Context *context = gl::getNonLostContext();
8726
8727 if (context)
8728 {
8729 if (context->getClientVersion() < 3)
8730 {
8731 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
8732 }
8733 }
8734
8735 UNIMPLEMENTED();
8736 }
8737 catch(std::bad_alloc&)
8738 {
8739 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
8740 }
8741
8742 return GL_FALSE;
8743}
8744
8745void __stdcall glDeleteSync(GLsync sync)
8746{
8747 EVENT("(GLsync sync = 0x%0.8p)", sync);
8748
8749 try
8750 {
8751 gl::Context *context = gl::getNonLostContext();
8752
8753 if (context)
8754 {
8755 if (context->getClientVersion() < 3)
8756 {
8757 return gl::error(GL_INVALID_OPERATION);
8758 }
8759 }
8760
8761 UNIMPLEMENTED();
8762 }
8763 catch(std::bad_alloc&)
8764 {
8765 return gl::error(GL_OUT_OF_MEMORY);
8766 }
8767}
8768
8769GLenum __stdcall glClientWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout)
8770{
8771 EVENT("(GLsync sync = 0x%0.8p, GLbitfield flags = 0x%X, GLuint64 timeout = %llu)",
8772 sync, flags, timeout);
8773
8774 try
8775 {
8776 gl::Context *context = gl::getNonLostContext();
8777
8778 if (context)
8779 {
8780 if (context->getClientVersion() < 3)
8781 {
8782 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
8783 }
8784 }
8785
8786 UNIMPLEMENTED();
8787 }
8788 catch(std::bad_alloc&)
8789 {
8790 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
8791 }
8792
8793 return GL_FALSE;
8794}
8795
8796void __stdcall glWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout)
8797{
8798 EVENT("(GLsync sync = 0x%0.8p, GLbitfield flags = 0x%X, GLuint64 timeout = %llu)",
8799 sync, flags, timeout);
8800
8801 try
8802 {
8803 gl::Context *context = gl::getNonLostContext();
8804
8805 if (context)
8806 {
8807 if (context->getClientVersion() < 3)
8808 {
8809 return gl::error(GL_INVALID_OPERATION);
8810 }
8811 }
8812
8813 UNIMPLEMENTED();
8814 }
8815 catch(std::bad_alloc&)
8816 {
8817 return gl::error(GL_OUT_OF_MEMORY);
8818 }
8819}
8820
8821void __stdcall glGetInteger64v(GLenum pname, GLint64* params)
8822{
8823 EVENT("(GLenum pname = 0x%X, GLint64* params = 0x%0.8p)",
8824 pname, params);
8825
8826 try
8827 {
8828 gl::Context *context = gl::getNonLostContext();
8829
8830 if (context)
8831 {
8832 if (context->getClientVersion() < 3)
8833 {
8834 return gl::error(GL_INVALID_OPERATION);
8835 }
8836 }
8837
8838 UNIMPLEMENTED();
8839 }
8840 catch(std::bad_alloc&)
8841 {
8842 return gl::error(GL_OUT_OF_MEMORY);
8843 }
8844}
8845
8846void __stdcall glGetSynciv(GLsync sync, GLenum pname, GLsizei bufSize, GLsizei* length, GLint* values)
8847{
8848 EVENT("(GLsync sync = 0x%0.8p, GLenum pname = 0x%X, GLsizei bufSize = %d, GLsizei* length = 0x%0.8p, GLint* values = 0x%0.8p)",
8849 sync, pname, bufSize, length, values);
8850
8851 try
8852 {
8853 gl::Context *context = gl::getNonLostContext();
8854
8855 if (context)
8856 {
8857 if (context->getClientVersion() < 3)
8858 {
8859 return gl::error(GL_INVALID_OPERATION);
8860 }
8861 }
8862
8863 UNIMPLEMENTED();
8864 }
8865 catch(std::bad_alloc&)
8866 {
8867 return gl::error(GL_OUT_OF_MEMORY);
8868 }
8869}
8870
8871void __stdcall glGetInteger64i_v(GLenum target, GLuint index, GLint64* data)
8872{
8873 EVENT("(GLenum target = 0x%X, GLuint index = %u, GLint64* data = 0x%0.8p)",
8874 target, index, data);
8875
8876 try
8877 {
8878 gl::Context *context = gl::getNonLostContext();
8879
8880 if (context)
8881 {
8882 if (context->getClientVersion() < 3)
8883 {
8884 return gl::error(GL_INVALID_OPERATION);
8885 }
8886 }
8887
8888 UNIMPLEMENTED();
8889 }
8890 catch(std::bad_alloc&)
8891 {
8892 return gl::error(GL_OUT_OF_MEMORY);
8893 }
8894}
8895
8896void __stdcall glGetBufferParameteri64v(GLenum target, GLenum pname, GLint64* params)
8897{
8898 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLint64* params = 0x%0.8p)",
8899 target, pname, params);
8900
8901 try
8902 {
8903 gl::Context *context = gl::getNonLostContext();
8904
8905 if (context)
8906 {
8907 if (context->getClientVersion() < 3)
8908 {
8909 return gl::error(GL_INVALID_OPERATION);
8910 }
8911 }
8912
8913 UNIMPLEMENTED();
8914 }
8915 catch(std::bad_alloc&)
8916 {
8917 return gl::error(GL_OUT_OF_MEMORY);
8918 }
8919}
8920
8921void __stdcall glGenSamplers(GLsizei count, GLuint* samplers)
8922{
8923 EVENT("(GLsizei count = %d, GLuint* samplers = 0x%0.8p)", count, samplers);
8924
8925 try
8926 {
8927 gl::Context *context = gl::getNonLostContext();
8928
8929 if (context)
8930 {
8931 if (context->getClientVersion() < 3)
8932 {
8933 return gl::error(GL_INVALID_OPERATION);
8934 }
8935 }
8936
8937 UNIMPLEMENTED();
8938 }
8939 catch(std::bad_alloc&)
8940 {
8941 return gl::error(GL_OUT_OF_MEMORY);
8942 }
8943}
8944
8945void __stdcall glDeleteSamplers(GLsizei count, const GLuint* samplers)
8946{
8947 EVENT("(GLsizei count = %d, const GLuint* samplers = 0x%0.8p)", count, samplers);
8948
8949 try
8950 {
8951 gl::Context *context = gl::getNonLostContext();
8952
8953 if (context)
8954 {
8955 if (context->getClientVersion() < 3)
8956 {
8957 return gl::error(GL_INVALID_OPERATION);
8958 }
8959 }
8960
8961 UNIMPLEMENTED();
8962 }
8963 catch(std::bad_alloc&)
8964 {
8965 return gl::error(GL_OUT_OF_MEMORY);
8966 }
8967}
8968
8969GLboolean __stdcall glIsSampler(GLuint sampler)
8970{
8971 EVENT("(GLuint sampler = %u)", sampler);
8972
8973 try
8974 {
8975 gl::Context *context = gl::getNonLostContext();
8976
8977 if (context)
8978 {
8979 if (context->getClientVersion() < 3)
8980 {
8981 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
8982 }
8983 }
8984
8985 UNIMPLEMENTED();
8986 }
8987 catch(std::bad_alloc&)
8988 {
8989 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
8990 }
8991
8992 return GL_FALSE;
8993}
8994
8995void __stdcall glBindSampler(GLuint unit, GLuint sampler)
8996{
8997 EVENT("(GLuint unit = %u, GLuint sampler = %u)", unit, sampler);
8998
8999 try
9000 {
9001 gl::Context *context = gl::getNonLostContext();
9002
9003 if (context)
9004 {
9005 if (context->getClientVersion() < 3)
9006 {
9007 return gl::error(GL_INVALID_OPERATION);
9008 }
9009 }
9010
9011 UNIMPLEMENTED();
9012 }
9013 catch(std::bad_alloc&)
9014 {
9015 return gl::error(GL_OUT_OF_MEMORY);
9016 }
9017}
9018
9019void __stdcall glSamplerParameteri(GLuint sampler, GLenum pname, GLint param)
9020{
9021 EVENT("(GLuint sampler = %u, GLenum pname = 0x%X, GLint param = %d)", sampler, pname, param);
9022
9023 try
9024 {
9025 gl::Context *context = gl::getNonLostContext();
9026
9027 if (context)
9028 {
9029 if (context->getClientVersion() < 3)
9030 {
9031 return gl::error(GL_INVALID_OPERATION);
9032 }
9033 }
9034
9035 UNIMPLEMENTED();
9036 }
9037 catch(std::bad_alloc&)
9038 {
9039 return gl::error(GL_OUT_OF_MEMORY);
9040 }
9041}
9042
9043void __stdcall glSamplerParameteriv(GLuint sampler, GLenum pname, const GLint* param)
9044{
9045 EVENT("(GLuint sampler = %u, GLenum pname = 0x%X, const GLint* param = 0x%0.8p)",
9046 sampler, pname, param);
9047
9048 try
9049 {
9050 gl::Context *context = gl::getNonLostContext();
9051
9052 if (context)
9053 {
9054 if (context->getClientVersion() < 3)
9055 {
9056 return gl::error(GL_INVALID_OPERATION);
9057 }
9058 }
9059
9060 UNIMPLEMENTED();
9061 }
9062 catch(std::bad_alloc&)
9063 {
9064 return gl::error(GL_OUT_OF_MEMORY);
9065 }
9066}
9067
9068void __stdcall glSamplerParameterf(GLuint sampler, GLenum pname, GLfloat param)
9069{
9070 EVENT("(GLuint sampler = %u, GLenum pname = 0x%X, GLfloat param = %g)", sampler, pname, param);
9071
9072 try
9073 {
9074 gl::Context *context = gl::getNonLostContext();
9075
9076 if (context)
9077 {
9078 if (context->getClientVersion() < 3)
9079 {
9080 return gl::error(GL_INVALID_OPERATION);
9081 }
9082 }
9083
9084 UNIMPLEMENTED();
9085 }
9086 catch(std::bad_alloc&)
9087 {
9088 return gl::error(GL_OUT_OF_MEMORY);
9089 }
9090}
9091
9092void __stdcall glSamplerParameterfv(GLuint sampler, GLenum pname, const GLfloat* param)
9093{
9094 EVENT("(GLuint sampler = %u, GLenum pname = 0x%X, const GLfloat* param = 0x%0.8p)", sampler, pname, param);
9095
9096 try
9097 {
9098 gl::Context *context = gl::getNonLostContext();
9099
9100 if (context)
9101 {
9102 if (context->getClientVersion() < 3)
9103 {
9104 return gl::error(GL_INVALID_OPERATION);
9105 }
9106 }
9107
9108 UNIMPLEMENTED();
9109 }
9110 catch(std::bad_alloc&)
9111 {
9112 return gl::error(GL_OUT_OF_MEMORY);
9113 }
9114}
9115
9116void __stdcall glGetSamplerParameteriv(GLuint sampler, GLenum pname, GLint* params)
9117{
9118 EVENT("(GLuint sampler = %u, GLenum pname = 0x%X, GLint* params = 0x%0.8p)", sampler, pname, params);
9119
9120 try
9121 {
9122 gl::Context *context = gl::getNonLostContext();
9123
9124 if (context)
9125 {
9126 if (context->getClientVersion() < 3)
9127 {
9128 return gl::error(GL_INVALID_OPERATION);
9129 }
9130 }
9131
9132 UNIMPLEMENTED();
9133 }
9134 catch(std::bad_alloc&)
9135 {
9136 return gl::error(GL_OUT_OF_MEMORY);
9137 }
9138}
9139
9140void __stdcall glGetSamplerParameterfv(GLuint sampler, GLenum pname, GLfloat* params)
9141{
9142 EVENT("(GLuint sample = %ur, GLenum pname = 0x%X, GLfloat* params = 0x%0.8p)", sampler, pname, params);
9143
9144 try
9145 {
9146 gl::Context *context = gl::getNonLostContext();
9147
9148 if (context)
9149 {
9150 if (context->getClientVersion() < 3)
9151 {
9152 return gl::error(GL_INVALID_OPERATION);
9153 }
9154 }
9155
9156 UNIMPLEMENTED();
9157 }
9158 catch(std::bad_alloc&)
9159 {
9160 return gl::error(GL_OUT_OF_MEMORY);
9161 }
9162}
9163
9164void __stdcall glVertexAttribDivisor(GLuint index, GLuint divisor)
9165{
9166 EVENT("(GLuint index = %u, GLuint divisor = %u)", index, divisor);
9167
9168 try
9169 {
shannon.woods%transgaming.com@gtempaccount.com8736bd62013-04-13 03:35:41 +00009170 if (index >= gl::MAX_VERTEX_ATTRIBS)
9171 {
9172 return gl::error(GL_INVALID_VALUE);
9173 }
9174
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009175 gl::Context *context = gl::getNonLostContext();
9176
9177 if (context)
9178 {
9179 if (context->getClientVersion() < 3)
9180 {
9181 return gl::error(GL_INVALID_OPERATION);
9182 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009183
shannon.woods%transgaming.com@gtempaccount.com8736bd62013-04-13 03:35:41 +00009184 context->setVertexAttribDivisor(index, divisor);
9185 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009186 }
9187 catch(std::bad_alloc&)
9188 {
9189 return gl::error(GL_OUT_OF_MEMORY);
9190 }
9191}
9192
9193void __stdcall glBindTransformFeedback(GLenum target, GLuint id)
9194{
9195 EVENT("(GLenum target = 0x%X, GLuint id = %u)", target, id);
9196
9197 try
9198 {
9199 gl::Context *context = gl::getNonLostContext();
9200
9201 if (context)
9202 {
9203 if (context->getClientVersion() < 3)
9204 {
9205 return gl::error(GL_INVALID_OPERATION);
9206 }
9207 }
9208
9209 UNIMPLEMENTED();
9210 }
9211 catch(std::bad_alloc&)
9212 {
9213 return gl::error(GL_OUT_OF_MEMORY);
9214 }
9215}
9216
9217void __stdcall glDeleteTransformFeedbacks(GLsizei n, const GLuint* ids)
9218{
9219 EVENT("(GLsizei n = %d, const GLuint* ids = 0x%0.8p)", n, ids);
9220
9221 try
9222 {
9223 gl::Context *context = gl::getNonLostContext();
9224
9225 if (context)
9226 {
9227 if (context->getClientVersion() < 3)
9228 {
9229 return gl::error(GL_INVALID_OPERATION);
9230 }
9231 }
9232
9233 UNIMPLEMENTED();
9234 }
9235 catch(std::bad_alloc&)
9236 {
9237 return gl::error(GL_OUT_OF_MEMORY);
9238 }
9239}
9240
9241void __stdcall glGenTransformFeedbacks(GLsizei n, GLuint* ids)
9242{
9243 EVENT("(GLsizei n = %d, GLuint* ids = 0x%0.8p)", n, ids);
9244
9245 try
9246 {
9247 gl::Context *context = gl::getNonLostContext();
9248
9249 if (context)
9250 {
9251 if (context->getClientVersion() < 3)
9252 {
9253 return gl::error(GL_INVALID_OPERATION);
9254 }
9255 }
9256
9257 UNIMPLEMENTED();
9258 }
9259 catch(std::bad_alloc&)
9260 {
9261 return gl::error(GL_OUT_OF_MEMORY);
9262 }
9263}
9264
9265GLboolean __stdcall glIsTransformFeedback(GLuint id)
9266{
9267 EVENT("(GLuint id = %u)", id);
9268
9269 try
9270 {
9271 gl::Context *context = gl::getNonLostContext();
9272
9273 if (context)
9274 {
9275 if (context->getClientVersion() < 3)
9276 {
9277 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
9278 }
9279 }
9280
9281 UNIMPLEMENTED();
9282 }
9283 catch(std::bad_alloc&)
9284 {
9285 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
9286 }
9287
9288 return GL_FALSE;
9289}
9290
9291void __stdcall glPauseTransformFeedback(void)
9292{
9293 EVENT("(void)");
9294
9295 try
9296 {
9297 gl::Context *context = gl::getNonLostContext();
9298
9299 if (context)
9300 {
9301 if (context->getClientVersion() < 3)
9302 {
9303 return gl::error(GL_INVALID_OPERATION);
9304 }
9305 }
9306
9307 UNIMPLEMENTED();
9308 }
9309 catch(std::bad_alloc&)
9310 {
9311 return gl::error(GL_OUT_OF_MEMORY);
9312 }
9313}
9314
9315void __stdcall glResumeTransformFeedback(void)
9316{
9317 EVENT("(void)");
9318
9319 try
9320 {
9321 gl::Context *context = gl::getNonLostContext();
9322
9323 if (context)
9324 {
9325 if (context->getClientVersion() < 3)
9326 {
9327 return gl::error(GL_INVALID_OPERATION);
9328 }
9329 }
9330
9331 UNIMPLEMENTED();
9332 }
9333 catch(std::bad_alloc&)
9334 {
9335 return gl::error(GL_OUT_OF_MEMORY);
9336 }
9337}
9338
9339void __stdcall glGetProgramBinary(GLuint program, GLsizei bufSize, GLsizei* length, GLenum* binaryFormat, GLvoid* binary)
9340{
9341 EVENT("(GLuint program = %u, GLsizei bufSize = %d, GLsizei* length = 0x%0.8p, GLenum* binaryFormat = 0x%0.8p, GLvoid* binary = 0x%0.8p)",
9342 program, bufSize, length, binaryFormat, binary);
9343
9344 try
9345 {
9346 gl::Context *context = gl::getNonLostContext();
9347
9348 if (context)
9349 {
9350 if (context->getClientVersion() < 3)
9351 {
9352 return gl::error(GL_INVALID_OPERATION);
9353 }
9354 }
9355
9356 UNIMPLEMENTED();
9357 }
9358 catch(std::bad_alloc&)
9359 {
9360 return gl::error(GL_OUT_OF_MEMORY);
9361 }
9362}
9363
9364void __stdcall glProgramBinary(GLuint program, GLenum binaryFormat, const GLvoid* binary, GLsizei length)
9365{
9366 EVENT("(GLuint program = %u, GLenum binaryFormat = 0x%X, const GLvoid* binary = 0x%0.8p, GLsizei length = %d)",
9367 program, binaryFormat, binary, length);
9368
9369 try
9370 {
9371 gl::Context *context = gl::getNonLostContext();
9372
9373 if (context)
9374 {
9375 if (context->getClientVersion() < 3)
9376 {
9377 return gl::error(GL_INVALID_OPERATION);
9378 }
9379 }
9380
9381 UNIMPLEMENTED();
9382 }
9383 catch(std::bad_alloc&)
9384 {
9385 return gl::error(GL_OUT_OF_MEMORY);
9386 }
9387}
9388
9389void __stdcall glProgramParameteri(GLuint program, GLenum pname, GLint value)
9390{
9391 EVENT("(GLuint program = %u, GLenum pname = 0x%X, GLint value = %d)",
9392 program, pname, value);
9393
9394 try
9395 {
9396 gl::Context *context = gl::getNonLostContext();
9397
9398 if (context)
9399 {
9400 if (context->getClientVersion() < 3)
9401 {
9402 return gl::error(GL_INVALID_OPERATION);
9403 }
9404 }
9405
9406 UNIMPLEMENTED();
9407 }
9408 catch(std::bad_alloc&)
9409 {
9410 return gl::error(GL_OUT_OF_MEMORY);
9411 }
9412}
9413
9414void __stdcall glInvalidateFramebuffer(GLenum target, GLsizei numAttachments, const GLenum* attachments)
9415{
9416 EVENT("(GLenum target = 0x%X, GLsizei numAttachments = %d, const GLenum* attachments = 0x%0.8p)",
9417 target, numAttachments, attachments);
9418
9419 try
9420 {
9421 gl::Context *context = gl::getNonLostContext();
9422
9423 if (context)
9424 {
9425 if (context->getClientVersion() < 3)
9426 {
9427 return gl::error(GL_INVALID_OPERATION);
9428 }
9429 }
9430
9431 UNIMPLEMENTED();
9432 }
9433 catch(std::bad_alloc&)
9434 {
9435 return gl::error(GL_OUT_OF_MEMORY);
9436 }
9437}
9438
9439void __stdcall glInvalidateSubFramebuffer(GLenum target, GLsizei numAttachments, const GLenum* attachments, GLint x, GLint y, GLsizei width, GLsizei height)
9440{
9441 EVENT("(GLenum target = 0x%X, GLsizei numAttachments = %d, const GLenum* attachments = 0x%0.8p, GLint x = %d, "
9442 "GLint y = %d, GLsizei width = %d, GLsizei height = %d)",
9443 target, numAttachments, attachments, x, y, width, height);
9444
9445 try
9446 {
9447 gl::Context *context = gl::getNonLostContext();
9448
9449 if (context)
9450 {
9451 if (context->getClientVersion() < 3)
9452 {
9453 return gl::error(GL_INVALID_OPERATION);
9454 }
9455 }
9456
9457 UNIMPLEMENTED();
9458 }
9459 catch(std::bad_alloc&)
9460 {
9461 return gl::error(GL_OUT_OF_MEMORY);
9462 }
9463}
9464
9465void __stdcall glTexStorage2D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height)
9466{
9467 EVENT("(GLenum target = 0x%X, GLsizei levels = %d, GLenum internalformat = 0x%X, GLsizei width = %d, GLsizei height = %d)",
9468 target, levels, internalformat, width, height);
9469
9470 try
9471 {
9472 gl::Context *context = gl::getNonLostContext();
9473
9474 if (context)
9475 {
9476 if (context->getClientVersion() < 3)
9477 {
9478 return gl::error(GL_INVALID_OPERATION);
9479 }
9480 }
9481
9482 UNIMPLEMENTED();
9483 }
9484 catch(std::bad_alloc&)
9485 {
9486 return gl::error(GL_OUT_OF_MEMORY);
9487 }
9488}
9489
9490void __stdcall glTexStorage3D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth)
9491{
9492 EVENT("(GLenum target = 0x%X, GLsizei levels = %d, GLenum internalformat = 0x%X, GLsizei width = %d, "
9493 "GLsizei height = %d, GLsizei depth = %d)",
9494 target, levels, internalformat, width, height, depth);
9495
9496 try
9497 {
9498 gl::Context *context = gl::getNonLostContext();
9499
9500 if (context)
9501 {
9502 if (context->getClientVersion() < 3)
9503 {
9504 return gl::error(GL_INVALID_OPERATION);
9505 }
shannon.woods%transgaming.com@gtempaccount.com14eb55e2013-04-13 03:35:06 +00009506 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009507 }
9508 catch(std::bad_alloc&)
9509 {
9510 return gl::error(GL_OUT_OF_MEMORY);
9511 }
9512}
9513
9514void __stdcall glGetInternalformativ(GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize, GLint* params)
9515{
9516 EVENT("(GLenum target = 0x%X, GLenum internalformat = 0x%X, GLenum pname = 0x%X, GLsizei bufSize = %d, "
9517 "GLint* params = 0x%0.8p)",
9518 target, internalformat, pname, bufSize, params);
9519
9520 try
9521 {
9522 gl::Context *context = gl::getNonLostContext();
9523
9524 if (context)
9525 {
9526 if (context->getClientVersion() < 3)
9527 {
9528 return gl::error(GL_INVALID_OPERATION);
9529 }
9530 }
9531
9532 UNIMPLEMENTED();
9533 }
9534 catch(std::bad_alloc&)
9535 {
9536 return gl::error(GL_OUT_OF_MEMORY);
9537 }
9538}
9539
9540// Extension functions
9541
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +00009542void __stdcall glBlitFramebufferANGLE(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1,
9543 GLbitfield mask, GLenum filter)
9544{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00009545 EVENT("(GLint srcX0 = %d, GLint srcY0 = %d, GLint srcX1 = %d, GLint srcY1 = %d, "
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +00009546 "GLint dstX0 = %d, GLint dstY0 = %d, GLint dstX1 = %d, GLint dstY1 = %d, "
9547 "GLbitfield mask = 0x%X, GLenum filter = 0x%X)",
9548 srcX0, srcY0, srcX1, srcX1, dstX0, dstY0, dstX1, dstY1, mask, filter);
9549
9550 try
9551 {
9552 switch (filter)
9553 {
9554 case GL_NEAREST:
9555 break;
9556 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00009557 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +00009558 }
9559
9560 if ((mask & ~(GL_COLOR_BUFFER_BIT | GL_STENCIL_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)) != 0)
9561 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00009562 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +00009563 }
9564
9565 if (srcX1 - srcX0 != dstX1 - dstX0 || srcY1 - srcY0 != dstY1 - dstY0)
9566 {
9567 ERR("Scaling and flipping in BlitFramebufferANGLE not supported by this implementation");
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00009568 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +00009569 }
9570
daniel@transgaming.com9d788502011-11-09 17:46:55 +00009571 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +00009572
9573 if (context)
9574 {
9575 if (context->getReadFramebufferHandle() == context->getDrawFramebufferHandle())
9576 {
9577 ERR("Blits with the same source and destination framebuffer are not supported by this implementation.");
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00009578 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +00009579 }
9580
9581 context->blitFramebuffer(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask);
9582 }
9583 }
9584 catch(std::bad_alloc&)
9585 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00009586 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +00009587 }
9588}
9589
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00009590void __stdcall glTexImage3DOES(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth,
9591 GLint border, GLenum format, GLenum type, const GLvoid* pixels)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00009592{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00009593 EVENT("(GLenum target = 0x%X, GLint level = %d, GLenum internalformat = 0x%X, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00009594 "GLsizei width = %d, GLsizei height = %d, GLsizei depth = %d, GLint border = %d, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00009595 "GLenum format = 0x%X, GLenum type = 0x%x, const GLvoid* pixels = 0x%0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00009596 target, level, internalformat, width, height, depth, border, format, type, pixels);
9597
9598 try
9599 {
9600 UNIMPLEMENTED(); // FIXME
9601 }
9602 catch(std::bad_alloc&)
9603 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00009604 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00009605 }
9606}
daniel@transgaming.comce3d0f22010-05-04 03:35:14 +00009607
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00009608void __stdcall glGetProgramBinaryOES(GLuint program, GLsizei bufSize, GLsizei *length,
9609 GLenum *binaryFormat, void *binary)
9610{
apatrick@chromium.org90080e32012-07-09 22:15:33 +00009611 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 +00009612 program, bufSize, length, binaryFormat, binary);
9613
9614 try
9615 {
9616 gl::Context *context = gl::getNonLostContext();
9617
9618 if (context)
9619 {
9620 gl::Program *programObject = context->getProgram(program);
9621
daniel@transgaming.com716056c2012-07-24 18:38:59 +00009622 if (!programObject || !programObject->isLinked())
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00009623 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00009624 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00009625 }
9626
9627 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
9628
9629 if (!programBinary)
9630 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00009631 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00009632 }
9633
apatrick@chromium.org90080e32012-07-09 22:15:33 +00009634 if (!programBinary->save(binary, bufSize, length))
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00009635 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00009636 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00009637 }
apatrick@chromium.org90080e32012-07-09 22:15:33 +00009638
9639 *binaryFormat = GL_PROGRAM_BINARY_ANGLE;
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00009640 }
9641 }
9642 catch(std::bad_alloc&)
9643 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00009644 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00009645 }
9646}
9647
9648void __stdcall glProgramBinaryOES(GLuint program, GLenum binaryFormat,
9649 const void *binary, GLint length)
9650{
9651 EVENT("(GLenum program = 0x%X, binaryFormat = 0x%x, binary = 0x%0.8p, length = %d)",
9652 program, binaryFormat, binary, length);
9653
9654 try
9655 {
9656 gl::Context *context = gl::getNonLostContext();
9657
9658 if (context)
9659 {
9660 if (binaryFormat != GL_PROGRAM_BINARY_ANGLE)
9661 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00009662 return gl::error(GL_INVALID_ENUM);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00009663 }
9664
9665 gl::Program *programObject = context->getProgram(program);
9666
9667 if (!programObject)
9668 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00009669 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00009670 }
9671
daniel@transgaming.com95d29422012-07-24 18:36:10 +00009672 context->setProgramBinary(program, binary, length);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00009673 }
9674 }
9675 catch(std::bad_alloc&)
9676 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00009677 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00009678 }
9679}
9680
shannon.woods%transgaming.com@gtempaccount.com4059a382013-04-13 03:31:16 +00009681void __stdcall glDrawBuffersEXT(GLsizei n, const GLenum *bufs)
9682{
9683 EVENT("(GLenum n = %d, bufs = 0x%0.8p)", n, bufs);
9684
9685 try
9686 {
9687 gl::Context *context = gl::getNonLostContext();
9688
9689 if (context)
9690 {
9691 if (n < 0 || (unsigned int)n > context->getMaximumRenderTargets())
9692 {
9693 return gl::error(GL_INVALID_VALUE);
9694 }
9695
9696 if (context->getDrawFramebufferHandle() == 0)
9697 {
shannon.woods%transgaming.com@gtempaccount.com2fa73c52013-04-13 03:37:20 +00009698 if (n != 1)
shannon.woods%transgaming.com@gtempaccount.com4059a382013-04-13 03:31:16 +00009699 {
9700 return gl::error(GL_INVALID_OPERATION);
9701 }
9702
shannon.woods%transgaming.com@gtempaccount.com2fa73c52013-04-13 03:37:20 +00009703 if (bufs[0] != GL_NONE && bufs[0] != GL_BACK)
shannon.woods%transgaming.com@gtempaccount.com4059a382013-04-13 03:31:16 +00009704 {
shannon.woods%transgaming.com@gtempaccount.com2fa73c52013-04-13 03:37:20 +00009705 return gl::error(GL_INVALID_OPERATION);
shannon.woods%transgaming.com@gtempaccount.com4059a382013-04-13 03:31:16 +00009706 }
9707 }
9708 else
9709 {
9710 for (int colorAttachment = 0; colorAttachment < n; colorAttachment++)
9711 {
9712 const GLenum attachment = GL_COLOR_ATTACHMENT0_EXT + colorAttachment;
9713 if (bufs[colorAttachment] != GL_NONE && bufs[colorAttachment] != attachment)
9714 {
9715 return gl::error(GL_INVALID_OPERATION);
9716 }
9717 }
9718 }
9719
9720 gl::Framebuffer *framebuffer = context->getDrawFramebuffer();
9721
9722 for (int colorAttachment = 0; colorAttachment < n; colorAttachment++)
9723 {
9724 framebuffer->setDrawBufferState(colorAttachment, bufs[colorAttachment]);
9725 }
shannon.woods%transgaming.com@gtempaccount.com2fa73c52013-04-13 03:37:20 +00009726
9727 for (int colorAttachment = n; colorAttachment < (int)context->getMaximumRenderTargets(); colorAttachment++)
9728 {
9729 framebuffer->setDrawBufferState(colorAttachment, GL_NONE);
9730 }
shannon.woods%transgaming.com@gtempaccount.com4059a382013-04-13 03:31:16 +00009731 }
9732 }
9733 catch (std::bad_alloc&)
9734 {
9735 return gl::error(GL_OUT_OF_MEMORY);
9736 }
9737}
9738
daniel@transgaming.comce3d0f22010-05-04 03:35:14 +00009739__eglMustCastToProperFunctionPointerType __stdcall glGetProcAddress(const char *procname)
9740{
9741 struct Extension
9742 {
9743 const char *name;
9744 __eglMustCastToProperFunctionPointerType address;
9745 };
9746
9747 static const Extension glExtensions[] =
9748 {
9749 {"glTexImage3DOES", (__eglMustCastToProperFunctionPointerType)glTexImage3DOES},
daniel@transgaming.com01868132010-08-24 19:21:17 +00009750 {"glBlitFramebufferANGLE", (__eglMustCastToProperFunctionPointerType)glBlitFramebufferANGLE},
daniel@transgaming.com1fe96c92011-01-14 15:08:44 +00009751 {"glRenderbufferStorageMultisampleANGLE", (__eglMustCastToProperFunctionPointerType)glRenderbufferStorageMultisampleANGLE},
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00009752 {"glDeleteFencesNV", (__eglMustCastToProperFunctionPointerType)glDeleteFencesNV},
9753 {"glGenFencesNV", (__eglMustCastToProperFunctionPointerType)glGenFencesNV},
9754 {"glIsFenceNV", (__eglMustCastToProperFunctionPointerType)glIsFenceNV},
9755 {"glTestFenceNV", (__eglMustCastToProperFunctionPointerType)glTestFenceNV},
9756 {"glGetFenceivNV", (__eglMustCastToProperFunctionPointerType)glGetFenceivNV},
9757 {"glFinishFenceNV", (__eglMustCastToProperFunctionPointerType)glFinishFenceNV},
9758 {"glSetFenceNV", (__eglMustCastToProperFunctionPointerType)glSetFenceNV},
zmo@google.coma574f782011-10-03 21:45:23 +00009759 {"glGetTranslatedShaderSourceANGLE", (__eglMustCastToProperFunctionPointerType)glGetTranslatedShaderSourceANGLE},
daniel@transgaming.com0bd1f2f2011-11-11 04:19:03 +00009760 {"glTexStorage2DEXT", (__eglMustCastToProperFunctionPointerType)glTexStorage2DEXT},
daniel@transgaming.com709ed112011-11-12 03:18:10 +00009761 {"glGetGraphicsResetStatusEXT", (__eglMustCastToProperFunctionPointerType)glGetGraphicsResetStatusEXT},
9762 {"glReadnPixelsEXT", (__eglMustCastToProperFunctionPointerType)glReadnPixelsEXT},
9763 {"glGetnUniformfvEXT", (__eglMustCastToProperFunctionPointerType)glGetnUniformfvEXT},
9764 {"glGetnUniformivEXT", (__eglMustCastToProperFunctionPointerType)glGetnUniformivEXT},
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00009765 {"glGenQueriesEXT", (__eglMustCastToProperFunctionPointerType)glGenQueriesEXT},
9766 {"glDeleteQueriesEXT", (__eglMustCastToProperFunctionPointerType)glDeleteQueriesEXT},
9767 {"glIsQueryEXT", (__eglMustCastToProperFunctionPointerType)glIsQueryEXT},
9768 {"glBeginQueryEXT", (__eglMustCastToProperFunctionPointerType)glBeginQueryEXT},
9769 {"glEndQueryEXT", (__eglMustCastToProperFunctionPointerType)glEndQueryEXT},
9770 {"glGetQueryivEXT", (__eglMustCastToProperFunctionPointerType)glGetQueryivEXT},
9771 {"glGetQueryObjectuivEXT", (__eglMustCastToProperFunctionPointerType)glGetQueryObjectuivEXT},
shannon.woods%transgaming.com@gtempaccount.com77d94722013-04-13 03:34:22 +00009772 {"glDrawBuffersEXT", (__eglMustCastToProperFunctionPointerType)glDrawBuffersEXT},
daniel@transgaming.comdce02fd2012-01-27 15:39:51 +00009773 {"glVertexAttribDivisorANGLE", (__eglMustCastToProperFunctionPointerType)glVertexAttribDivisorANGLE},
9774 {"glDrawArraysInstancedANGLE", (__eglMustCastToProperFunctionPointerType)glDrawArraysInstancedANGLE},
9775 {"glDrawElementsInstancedANGLE", (__eglMustCastToProperFunctionPointerType)glDrawElementsInstancedANGLE},
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00009776 {"glGetProgramBinaryOES", (__eglMustCastToProperFunctionPointerType)glGetProgramBinaryOES},
9777 {"glProgramBinaryOES", (__eglMustCastToProperFunctionPointerType)glProgramBinaryOES}, };
daniel@transgaming.comce3d0f22010-05-04 03:35:14 +00009778
shannon.woods@transgaming.comd438fd42013-02-28 23:17:45 +00009779 for (unsigned int ext = 0; ext < ArraySize(glExtensions); ext++)
daniel@transgaming.comce3d0f22010-05-04 03:35:14 +00009780 {
9781 if (strcmp(procname, glExtensions[ext].name) == 0)
9782 {
9783 return (__eglMustCastToProperFunctionPointerType)glExtensions[ext].address;
9784 }
9785 }
9786
9787 return NULL;
9788}
9789
daniel@transgaming.com17f548c2011-11-09 17:47:02 +00009790// Non-public functions used by EGL
9791
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00009792bool __stdcall glBindTexImage(egl::Surface *surface)
jbauman@chromium.orgae345802011-03-30 22:04:25 +00009793{
9794 EVENT("(egl::Surface* surface = 0x%0.8p)",
9795 surface);
9796
9797 try
9798 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00009799 gl::Context *context = gl::getNonLostContext();
jbauman@chromium.orgae345802011-03-30 22:04:25 +00009800
9801 if (context)
9802 {
9803 gl::Texture2D *textureObject = context->getTexture2D();
9804
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00009805 if (textureObject->isImmutable())
9806 {
9807 return false;
9808 }
9809
jbauman@chromium.orgae345802011-03-30 22:04:25 +00009810 if (textureObject)
9811 {
9812 textureObject->bindTexImage(surface);
9813 }
9814 }
9815 }
9816 catch(std::bad_alloc&)
9817 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00009818 return gl::error(GL_OUT_OF_MEMORY, false);
jbauman@chromium.orgae345802011-03-30 22:04:25 +00009819 }
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00009820
9821 return true;
jbauman@chromium.orgae345802011-03-30 22:04:25 +00009822}
9823
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00009824}