blob: 3979dcb39ba883f58271cda9c501fff4d822d559 [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//
shannon.woods%transgaming.com@gtempaccount.com8dce6512013-04-13 03:42:19 +00003// Copyright (c) 2002-2013 The ANGLE Project Authors. All rights reserved.
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004// Use of this source code is governed by a BSD-style license that can be
5// found in the LICENSE file.
6//
7
8// libGLESv2.cpp: Implements the exported OpenGL ES 2.0 functions.
9
daniel@transgaming.coma0ce7e62011-01-25 14:47:16 +000010#include "common/version.h"
daniel@transgaming.combbf56f72010-04-20 18:52:13 +000011
12#include "libGLESv2/main.h"
daniel@transgaming.combbf56f72010-04-20 18:52:13 +000013#include "libGLESv2/utilities.h"
14#include "libGLESv2/Buffer.h"
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +000015#include "libGLESv2/Fence.h"
daniel@transgaming.combbf56f72010-04-20 18:52:13 +000016#include "libGLESv2/Framebuffer.h"
shannon.woods@transgaming.com486d9e92013-02-28 23:15:41 +000017#include "libGLESv2/Renderbuffer.h"
daniel@transgaming.combbf56f72010-04-20 18:52:13 +000018#include "libGLESv2/Program.h"
apatrick@chromium.orgea09f9b2012-06-08 00:45:32 +000019#include "libGLESv2/ProgramBinary.h"
daniel@transgaming.combbf56f72010-04-20 18:52:13 +000020#include "libGLESv2/Texture.h"
daniel@transgaming.com86bdb822012-01-20 18:24:39 +000021#include "libGLESv2/Query.h"
shannon.woods@transgaming.com486d9e92013-02-28 23:15:41 +000022#include "libGLESv2/Context.h"
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000023
daniel@transgaming.com4f9ef0d2011-05-30 23:51:19 +000024bool validImageSize(GLint level, GLsizei width, GLsizei height)
25{
26 if (level < 0 || width < 0 || height < 0)
27 {
28 return false;
29 }
30
31 if (gl::getContext() && gl::getContext()->supportsNonPower2Texture())
32 {
33 return true;
34 }
35
36 if (level == 0)
37 {
38 return true;
39 }
40
41 if (gl::isPow2(width) && gl::isPow2(height))
42 {
43 return true;
44 }
45
46 return false;
47}
48
daniel@transgaming.com8833dd22012-06-05 19:49:58 +000049// Verify that format/type are one of the combinations from table 3.4.
50bool checkTextureFormatType(GLenum format, GLenum type)
51{
52 // validate <format> by itself (used as secondary key below)
53 switch (format)
54 {
55 case GL_RGBA:
56 case GL_BGRA_EXT:
57 case GL_RGB:
58 case GL_ALPHA:
59 case GL_LUMINANCE:
60 case GL_LUMINANCE_ALPHA:
61 case GL_DEPTH_COMPONENT:
62 case GL_DEPTH_STENCIL_OES:
63 break;
64 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000065 return gl::error(GL_INVALID_ENUM, false);
daniel@transgaming.com8833dd22012-06-05 19:49:58 +000066 }
67
68 // invalid <type> -> sets INVALID_ENUM
69 // invalid <format>+<type> combination -> sets INVALID_OPERATION
70 switch (type)
71 {
72 case GL_UNSIGNED_BYTE:
73 switch (format)
74 {
75 case GL_RGBA:
76 case GL_BGRA_EXT:
77 case GL_RGB:
78 case GL_ALPHA:
79 case GL_LUMINANCE:
80 case GL_LUMINANCE_ALPHA:
81 return true;
82 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000083 return gl::error(GL_INVALID_OPERATION, false);
daniel@transgaming.com8833dd22012-06-05 19:49:58 +000084 }
85
86 case GL_FLOAT:
87 case GL_HALF_FLOAT_OES:
88 switch (format)
89 {
90 case GL_RGBA:
91 case GL_RGB:
92 case GL_ALPHA:
93 case GL_LUMINANCE:
94 case GL_LUMINANCE_ALPHA:
95 return true;
96 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000097 return gl::error(GL_INVALID_OPERATION, false);
daniel@transgaming.com8833dd22012-06-05 19:49:58 +000098 }
99
100 case GL_UNSIGNED_SHORT_4_4_4_4:
101 case GL_UNSIGNED_SHORT_5_5_5_1:
102 switch (format)
103 {
104 case GL_RGBA:
105 return true;
106 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000107 return gl::error(GL_INVALID_OPERATION, false);
daniel@transgaming.com8833dd22012-06-05 19:49:58 +0000108 }
109
110 case GL_UNSIGNED_SHORT_5_6_5:
111 switch (format)
112 {
113 case GL_RGB:
114 return true;
115 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000116 return gl::error(GL_INVALID_OPERATION, false);
daniel@transgaming.com8833dd22012-06-05 19:49:58 +0000117 }
118
119 case GL_UNSIGNED_SHORT:
120 case GL_UNSIGNED_INT:
121 switch (format)
122 {
123 case GL_DEPTH_COMPONENT:
124 return true;
125 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000126 return gl::error(GL_INVALID_OPERATION, false);
daniel@transgaming.com8833dd22012-06-05 19:49:58 +0000127 }
128
129 case GL_UNSIGNED_INT_24_8_OES:
130 switch (format)
131 {
132 case GL_DEPTH_STENCIL_OES:
133 return true;
134 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000135 return gl::error(GL_INVALID_OPERATION, false);
daniel@transgaming.com8833dd22012-06-05 19:49:58 +0000136 }
137
138 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000139 return gl::error(GL_INVALID_ENUM, false);
daniel@transgaming.com8833dd22012-06-05 19:49:58 +0000140 }
141}
daniel@transgaming.com6452adf2012-10-17 18:22:35 +0000142
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +0000143bool validateSubImageParams2D(bool compressed, GLsizei width, GLsizei height,
daniel@transgaming.com6452adf2012-10-17 18:22:35 +0000144 GLint xoffset, GLint yoffset, GLint level, GLenum format, GLenum type,
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +0000145 gl::Texture2D *texture)
daniel@transgaming.com343373a2011-11-29 19:42:32 +0000146{
147 if (!texture)
148 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000149 return gl::error(GL_INVALID_OPERATION, false);
daniel@transgaming.com343373a2011-11-29 19:42:32 +0000150 }
151
daniel@transgaming.com92f49922012-05-09 15:49:19 +0000152 if (compressed != texture->isCompressed(level))
daniel@transgaming.com343373a2011-11-29 19:42:32 +0000153 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000154 return gl::error(GL_INVALID_OPERATION, false);
daniel@transgaming.com343373a2011-11-29 19:42:32 +0000155 }
156
daniel@transgaming.com6452adf2012-10-17 18:22:35 +0000157 if (format != GL_NONE)
daniel@transgaming.com343373a2011-11-29 19:42:32 +0000158 {
daniel@transgaming.com6452adf2012-10-17 18:22:35 +0000159 GLenum internalformat = gl::ConvertSizedInternalFormat(format, type);
160 if (internalformat != texture->getInternalFormat(level))
161 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000162 return gl::error(GL_INVALID_OPERATION, false);
daniel@transgaming.com6452adf2012-10-17 18:22:35 +0000163 }
daniel@transgaming.com343373a2011-11-29 19:42:32 +0000164 }
165
166 if (compressed)
167 {
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +0000168 if ((width % 4 != 0 && width != texture->getWidth(0)) ||
169 (height % 4 != 0 && height != texture->getHeight(0)))
170 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000171 return gl::error(GL_INVALID_OPERATION, false);
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +0000172 }
173 }
174
175 if (xoffset + width > texture->getWidth(level) ||
176 yoffset + height > texture->getHeight(level))
177 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000178 return gl::error(GL_INVALID_VALUE, false);
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +0000179 }
180
181 return true;
182}
183
184bool validateSubImageParamsCube(bool compressed, GLsizei width, GLsizei height,
daniel@transgaming.com6452adf2012-10-17 18:22:35 +0000185 GLint xoffset, GLint yoffset, GLenum target, GLint level, GLenum format, GLenum type,
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +0000186 gl::TextureCubeMap *texture)
187{
188 if (!texture)
189 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000190 return gl::error(GL_INVALID_OPERATION, false);
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +0000191 }
192
daniel@transgaming.com4df88e82012-05-09 15:49:24 +0000193 if (compressed != texture->isCompressed(target, level))
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +0000194 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000195 return gl::error(GL_INVALID_OPERATION, false);
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +0000196 }
197
daniel@transgaming.com6452adf2012-10-17 18:22:35 +0000198 if (format != GL_NONE)
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +0000199 {
daniel@transgaming.com6452adf2012-10-17 18:22:35 +0000200 GLenum internalformat = gl::ConvertSizedInternalFormat(format, type);
201 if (internalformat != texture->getInternalFormat(target, level))
202 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000203 return gl::error(GL_INVALID_OPERATION, false);
daniel@transgaming.com6452adf2012-10-17 18:22:35 +0000204 }
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +0000205 }
206
207 if (compressed)
208 {
daniel@transgaming.com4df88e82012-05-09 15:49:24 +0000209 if ((width % 4 != 0 && width != texture->getWidth(target, 0)) ||
210 (height % 4 != 0 && height != texture->getHeight(target, 0)))
daniel@transgaming.com343373a2011-11-29 19:42:32 +0000211 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000212 return gl::error(GL_INVALID_OPERATION, false);
daniel@transgaming.com343373a2011-11-29 19:42:32 +0000213 }
214 }
215
daniel@transgaming.com4df88e82012-05-09 15:49:24 +0000216 if (xoffset + width > texture->getWidth(target, level) ||
217 yoffset + height > texture->getHeight(target, level))
daniel@transgaming.com343373a2011-11-29 19:42:32 +0000218 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000219 return gl::error(GL_INVALID_VALUE, false);
daniel@transgaming.com343373a2011-11-29 19:42:32 +0000220 }
221
222 return true;
223}
224
daniel@transgaming.comb7915a52011-11-12 03:14:20 +0000225// check for combinations of format and type that are valid for ReadPixels
226bool validReadFormatType(GLenum format, GLenum type)
227{
228 switch (format)
229 {
230 case GL_RGBA:
231 switch (type)
232 {
233 case GL_UNSIGNED_BYTE:
234 break;
235 default:
236 return false;
237 }
238 break;
239 case GL_BGRA_EXT:
240 switch (type)
241 {
242 case GL_UNSIGNED_BYTE:
243 case GL_UNSIGNED_SHORT_4_4_4_4_REV_EXT:
244 case GL_UNSIGNED_SHORT_1_5_5_5_REV_EXT:
245 break;
246 default:
247 return false;
248 }
249 break;
daniel@transgaming.comb7915a52011-11-12 03:14:20 +0000250 default:
251 return false;
252 }
253 return true;
254}
255
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000256extern "C"
257{
258
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +0000259// OpenGL ES 2.0 functions
260
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000261void __stdcall glActiveTexture(GLenum texture)
262{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000263 EVENT("(GLenum texture = 0x%X)", texture);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000264
265 try
266 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000267 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000268
269 if (context)
270 {
daniel@transgaming.com3f74c7a2011-05-11 15:36:51 +0000271 if (texture < GL_TEXTURE0 || texture > GL_TEXTURE0 + context->getMaximumCombinedTextureImageUnits() - 1)
272 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000273 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com3f74c7a2011-05-11 15:36:51 +0000274 }
275
daniel@transgaming.com428d1582010-05-04 03:35:25 +0000276 context->setActiveSampler(texture - GL_TEXTURE0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000277 }
278 }
279 catch(std::bad_alloc&)
280 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000281 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000282 }
283}
284
285void __stdcall glAttachShader(GLuint program, GLuint shader)
286{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000287 EVENT("(GLuint program = %d, GLuint shader = %d)", program, shader);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000288
289 try
290 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000291 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000292
293 if (context)
294 {
295 gl::Program *programObject = context->getProgram(program);
296 gl::Shader *shaderObject = context->getShader(shader);
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +0000297
daniel@transgaming.come9d6ed02010-04-13 03:26:23 +0000298 if (!programObject)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000299 {
daniel@transgaming.come9d6ed02010-04-13 03:26:23 +0000300 if (context->getShader(program))
301 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000302 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.come9d6ed02010-04-13 03:26:23 +0000303 }
304 else
305 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000306 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.come9d6ed02010-04-13 03:26:23 +0000307 }
308 }
309
310 if (!shaderObject)
311 {
312 if (context->getProgram(shader))
313 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000314 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.come9d6ed02010-04-13 03:26:23 +0000315 }
316 else
317 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000318 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.come9d6ed02010-04-13 03:26:23 +0000319 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000320 }
321
322 if (!programObject->attachShader(shaderObject))
323 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000324 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000325 }
326 }
327 }
328 catch(std::bad_alloc&)
329 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000330 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000331 }
332}
333
daniel@transgaming.com86bdb822012-01-20 18:24:39 +0000334void __stdcall glBeginQueryEXT(GLenum target, GLuint id)
335{
336 EVENT("(GLenum target = 0x%X, GLuint %d)", target, id);
337
338 try
339 {
340 switch (target)
341 {
342 case GL_ANY_SAMPLES_PASSED_EXT:
343 case GL_ANY_SAMPLES_PASSED_CONSERVATIVE_EXT:
344 break;
345 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000346 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +0000347 }
348
349 if (id == 0)
350 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000351 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +0000352 }
353
354 gl::Context *context = gl::getNonLostContext();
355
356 if (context)
357 {
358 context->beginQuery(target, id);
359 }
360 }
361 catch(std::bad_alloc&)
362 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000363 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +0000364 }
365}
366
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +0000367void __stdcall glBindAttribLocation(GLuint program, GLuint index, const GLchar* name)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000368{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000369 EVENT("(GLuint program = %d, GLuint index = %d, const GLchar* name = 0x%0.8p)", program, index, name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000370
371 try
372 {
373 if (index >= gl::MAX_VERTEX_ATTRIBS)
374 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000375 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000376 }
377
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000378 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000379
380 if (context)
381 {
382 gl::Program *programObject = context->getProgram(program);
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +0000383
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000384 if (!programObject)
385 {
daniel@transgaming.com98079832010-04-13 03:26:29 +0000386 if (context->getShader(program))
387 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000388 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com98079832010-04-13 03:26:29 +0000389 }
390 else
391 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000392 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com98079832010-04-13 03:26:29 +0000393 }
394 }
395
396 if (strncmp(name, "gl_", 3) == 0)
397 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000398 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000399 }
400
401 programObject->bindAttributeLocation(index, name);
402 }
403 }
404 catch(std::bad_alloc&)
405 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000406 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000407 }
408}
409
410void __stdcall glBindBuffer(GLenum target, GLuint buffer)
411{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000412 EVENT("(GLenum target = 0x%X, GLuint buffer = %d)", target, buffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000413
414 try
415 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000416 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000417
418 if (context)
419 {
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +0000420 // Check ES3 specific targets
421 switch (target)
422 {
shannon.woods%transgaming.com@gtempaccount.com51171882013-04-13 03:39:10 +0000423 case GL_COPY_READ_BUFFER:
424 case GL_COPY_WRITE_BUFFER:
shannon.woods%transgaming.com@gtempaccount.comc926e5f2013-04-13 03:39:18 +0000425 case GL_PIXEL_PACK_BUFFER:
426 case GL_PIXEL_UNPACK_BUFFER:
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +0000427 case GL_UNIFORM_BUFFER:
428 case GL_TRANSFORM_FEEDBACK_BUFFER:
429 if (context->getClientVersion() < 3)
430 {
431 return gl::error(GL_INVALID_ENUM);
432 }
433 }
434
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000435 switch (target)
436 {
437 case GL_ARRAY_BUFFER:
438 context->bindArrayBuffer(buffer);
439 return;
440 case GL_ELEMENT_ARRAY_BUFFER:
441 context->bindElementArrayBuffer(buffer);
442 return;
shannon.woods%transgaming.com@gtempaccount.com51171882013-04-13 03:39:10 +0000443 case GL_COPY_READ_BUFFER:
444 context->bindCopyReadBuffer(buffer);
445 return;
446 case GL_COPY_WRITE_BUFFER:
447 context->bindCopyWriteBuffer(buffer);
448 return;
shannon.woods%transgaming.com@gtempaccount.comc926e5f2013-04-13 03:39:18 +0000449 case GL_PIXEL_PACK_BUFFER:
450 context->bindPixelPackBuffer(buffer);
451 return;
452 case GL_PIXEL_UNPACK_BUFFER:
453 context->bindPixelUnpackBuffer(buffer);
454 return;
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +0000455 case GL_UNIFORM_BUFFER:
456 context->bindGenericUniformBuffer(buffer);
457 return;
458 case GL_TRANSFORM_FEEDBACK_BUFFER:
459 context->bindGenericUniformBuffer(buffer);
460 return;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000461 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000462 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000463 }
464 }
465 }
466 catch(std::bad_alloc&)
467 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000468 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000469 }
470}
471
472void __stdcall glBindFramebuffer(GLenum target, GLuint framebuffer)
473{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000474 EVENT("(GLenum target = 0x%X, GLuint framebuffer = %d)", target, framebuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000475
476 try
477 {
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +0000478 if (target != GL_FRAMEBUFFER && target != GL_DRAW_FRAMEBUFFER_ANGLE && target != GL_READ_FRAMEBUFFER_ANGLE)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000479 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000480 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000481 }
482
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000483 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000484
485 if (context)
486 {
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +0000487 if (target == GL_READ_FRAMEBUFFER_ANGLE || target == GL_FRAMEBUFFER)
488 {
489 context->bindReadFramebuffer(framebuffer);
490 }
491
492 if (target == GL_DRAW_FRAMEBUFFER_ANGLE || target == GL_FRAMEBUFFER)
493 {
494 context->bindDrawFramebuffer(framebuffer);
495 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000496 }
497 }
498 catch(std::bad_alloc&)
499 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000500 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000501 }
502}
503
504void __stdcall glBindRenderbuffer(GLenum target, GLuint renderbuffer)
505{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000506 EVENT("(GLenum target = 0x%X, GLuint renderbuffer = %d)", target, renderbuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000507
508 try
509 {
510 if (target != GL_RENDERBUFFER)
511 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000512 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000513 }
514
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000515 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000516
517 if (context)
518 {
519 context->bindRenderbuffer(renderbuffer);
520 }
521 }
522 catch(std::bad_alloc&)
523 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000524 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000525 }
526}
527
528void __stdcall glBindTexture(GLenum target, GLuint texture)
529{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000530 EVENT("(GLenum target = 0x%X, GLuint texture = %d)", target, texture);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000531
532 try
533 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000534 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000535
536 if (context)
537 {
538 gl::Texture *textureObject = context->getTexture(texture);
539
540 if (textureObject && textureObject->getTarget() != target && texture != 0)
541 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000542 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000543 }
544
545 switch (target)
546 {
547 case GL_TEXTURE_2D:
548 context->bindTexture2D(texture);
549 return;
550 case GL_TEXTURE_CUBE_MAP:
551 context->bindTextureCubeMap(texture);
552 return;
553 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000554 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000555 }
556 }
557 }
558 catch(std::bad_alloc&)
559 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000560 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000561 }
562}
563
564void __stdcall glBlendColor(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha)
565{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000566 EVENT("(GLclampf red = %f, GLclampf green = %f, GLclampf blue = %f, GLclampf alpha = %f)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +0000567 red, green, blue, alpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000568
569 try
570 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000571 gl::Context* context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000572
573 if (context)
574 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +0000575 context->setBlendColor(gl::clamp01(red), gl::clamp01(green), gl::clamp01(blue), gl::clamp01(alpha));
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000576 }
577 }
578 catch(std::bad_alloc&)
579 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000580 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000581 }
582}
583
584void __stdcall glBlendEquation(GLenum mode)
585{
586 glBlendEquationSeparate(mode, mode);
587}
588
589void __stdcall glBlendEquationSeparate(GLenum modeRGB, GLenum modeAlpha)
590{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000591 EVENT("(GLenum modeRGB = 0x%X, GLenum modeAlpha = 0x%X)", modeRGB, modeAlpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000592
593 try
594 {
shannon.woods%transgaming.com@gtempaccount.com00b6a0e2013-04-13 03:38:00 +0000595 gl::Context *context = gl::getNonLostContext();
596
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000597 switch (modeRGB)
598 {
599 case GL_FUNC_ADD:
600 case GL_FUNC_SUBTRACT:
601 case GL_FUNC_REVERSE_SUBTRACT:
602 break;
shannon.woods%transgaming.com@gtempaccount.com00b6a0e2013-04-13 03:38:00 +0000603
604 case GL_MIN:
605 case GL_MAX:
606 if (context && context->getClientVersion() < 3)
607 {
608 return gl::error(GL_INVALID_ENUM);
609 }
610 break;
611
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000612 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000613 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000614 }
615
616 switch (modeAlpha)
617 {
618 case GL_FUNC_ADD:
619 case GL_FUNC_SUBTRACT:
620 case GL_FUNC_REVERSE_SUBTRACT:
621 break;
shannon.woods%transgaming.com@gtempaccount.com00b6a0e2013-04-13 03:38:00 +0000622
623 case GL_MIN:
624 case GL_MAX:
625 if (context && context->getClientVersion() < 3)
626 {
627 return gl::error(GL_INVALID_ENUM);
628 }
629 break;
630
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000631 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000632 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000633 }
634
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000635 if (context)
636 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +0000637 context->setBlendEquation(modeRGB, modeAlpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000638 }
639 }
640 catch(std::bad_alloc&)
641 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000642 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000643 }
644}
645
646void __stdcall glBlendFunc(GLenum sfactor, GLenum dfactor)
647{
648 glBlendFuncSeparate(sfactor, dfactor, sfactor, dfactor);
649}
650
651void __stdcall glBlendFuncSeparate(GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha)
652{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000653 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 +0000654 srcRGB, dstRGB, srcAlpha, dstAlpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000655
656 try
657 {
658 switch (srcRGB)
659 {
660 case GL_ZERO:
661 case GL_ONE:
662 case GL_SRC_COLOR:
663 case GL_ONE_MINUS_SRC_COLOR:
664 case GL_DST_COLOR:
665 case GL_ONE_MINUS_DST_COLOR:
666 case GL_SRC_ALPHA:
667 case GL_ONE_MINUS_SRC_ALPHA:
668 case GL_DST_ALPHA:
669 case GL_ONE_MINUS_DST_ALPHA:
670 case GL_CONSTANT_COLOR:
671 case GL_ONE_MINUS_CONSTANT_COLOR:
672 case GL_CONSTANT_ALPHA:
673 case GL_ONE_MINUS_CONSTANT_ALPHA:
674 case GL_SRC_ALPHA_SATURATE:
675 break;
676 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000677 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000678 }
679
680 switch (dstRGB)
681 {
682 case GL_ZERO:
683 case GL_ONE:
684 case GL_SRC_COLOR:
685 case GL_ONE_MINUS_SRC_COLOR:
686 case GL_DST_COLOR:
687 case GL_ONE_MINUS_DST_COLOR:
688 case GL_SRC_ALPHA:
689 case GL_ONE_MINUS_SRC_ALPHA:
690 case GL_DST_ALPHA:
691 case GL_ONE_MINUS_DST_ALPHA:
692 case GL_CONSTANT_COLOR:
693 case GL_ONE_MINUS_CONSTANT_COLOR:
694 case GL_CONSTANT_ALPHA:
695 case GL_ONE_MINUS_CONSTANT_ALPHA:
696 break;
697 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000698 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000699 }
700
701 switch (srcAlpha)
702 {
703 case GL_ZERO:
704 case GL_ONE:
705 case GL_SRC_COLOR:
706 case GL_ONE_MINUS_SRC_COLOR:
707 case GL_DST_COLOR:
708 case GL_ONE_MINUS_DST_COLOR:
709 case GL_SRC_ALPHA:
710 case GL_ONE_MINUS_SRC_ALPHA:
711 case GL_DST_ALPHA:
712 case GL_ONE_MINUS_DST_ALPHA:
713 case GL_CONSTANT_COLOR:
714 case GL_ONE_MINUS_CONSTANT_COLOR:
715 case GL_CONSTANT_ALPHA:
716 case GL_ONE_MINUS_CONSTANT_ALPHA:
717 case GL_SRC_ALPHA_SATURATE:
718 break;
719 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000720 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000721 }
722
723 switch (dstAlpha)
724 {
725 case GL_ZERO:
726 case GL_ONE:
727 case GL_SRC_COLOR:
728 case GL_ONE_MINUS_SRC_COLOR:
729 case GL_DST_COLOR:
730 case GL_ONE_MINUS_DST_COLOR:
731 case GL_SRC_ALPHA:
732 case GL_ONE_MINUS_SRC_ALPHA:
733 case GL_DST_ALPHA:
734 case GL_ONE_MINUS_DST_ALPHA:
735 case GL_CONSTANT_COLOR:
736 case GL_ONE_MINUS_CONSTANT_COLOR:
737 case GL_CONSTANT_ALPHA:
738 case GL_ONE_MINUS_CONSTANT_ALPHA:
739 break;
740 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000741 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000742 }
743
daniel@transgaming.comfe453652010-03-16 06:23:28 +0000744 bool constantColorUsed = (srcRGB == GL_CONSTANT_COLOR || srcRGB == GL_ONE_MINUS_CONSTANT_COLOR ||
745 dstRGB == GL_CONSTANT_COLOR || dstRGB == GL_ONE_MINUS_CONSTANT_COLOR);
746
747 bool constantAlphaUsed = (srcRGB == GL_CONSTANT_ALPHA || srcRGB == GL_ONE_MINUS_CONSTANT_ALPHA ||
748 dstRGB == GL_CONSTANT_ALPHA || dstRGB == GL_ONE_MINUS_CONSTANT_ALPHA);
749
750 if (constantColorUsed && constantAlphaUsed)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000751 {
daniel@transgaming.comfe453652010-03-16 06:23:28 +0000752 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 +0000753 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000754 }
755
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000756 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000757
758 if (context)
759 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +0000760 context->setBlendFactors(srcRGB, dstRGB, srcAlpha, dstAlpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000761 }
762 }
763 catch(std::bad_alloc&)
764 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000765 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000766 }
767}
768
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +0000769void __stdcall glBufferData(GLenum target, GLsizeiptr size, const GLvoid* data, GLenum usage)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000770{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000771 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 +0000772 target, size, data, usage);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000773
774 try
775 {
776 if (size < 0)
777 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000778 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000779 }
780
shannon.woods%transgaming.com@gtempaccount.comf2db40b2013-04-13 03:37:09 +0000781 gl::Context *context = gl::getNonLostContext();
782
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000783 switch (usage)
784 {
785 case GL_STREAM_DRAW:
786 case GL_STATIC_DRAW:
787 case GL_DYNAMIC_DRAW:
788 break;
shannon.woods%transgaming.com@gtempaccount.comf2db40b2013-04-13 03:37:09 +0000789
790 case GL_STREAM_READ:
791 case GL_STREAM_COPY:
792 case GL_STATIC_READ:
793 case GL_STATIC_COPY:
794 case GL_DYNAMIC_READ:
795 case GL_DYNAMIC_COPY:
796 if (context && context->getClientVersion() < 3)
797 {
798 return gl::error(GL_INVALID_ENUM);
799 }
800 break;
801
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000802 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000803 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000804 }
805
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000806 if (context)
807 {
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +0000808 // Check ES3 specific targets
809 switch (target)
810 {
shannon.woods%transgaming.com@gtempaccount.com51171882013-04-13 03:39:10 +0000811 case GL_COPY_READ_BUFFER:
812 case GL_COPY_WRITE_BUFFER:
shannon.woods%transgaming.com@gtempaccount.comc926e5f2013-04-13 03:39:18 +0000813 case GL_PIXEL_PACK_BUFFER:
814 case GL_PIXEL_UNPACK_BUFFER:
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +0000815 case GL_UNIFORM_BUFFER:
816 case GL_TRANSFORM_FEEDBACK_BUFFER:
817 if (context->getClientVersion() < 3)
818 {
819 return gl::error(GL_INVALID_ENUM);
820 }
821 }
822
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000823 gl::Buffer *buffer;
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +0000824
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000825 switch (target)
826 {
827 case GL_ARRAY_BUFFER:
828 buffer = context->getArrayBuffer();
829 break;
830 case GL_ELEMENT_ARRAY_BUFFER:
831 buffer = context->getElementArrayBuffer();
832 break;
shannon.woods%transgaming.com@gtempaccount.com51171882013-04-13 03:39:10 +0000833 case GL_COPY_READ_BUFFER:
834 buffer = context->getCopyReadBuffer();
835 break;
836 case GL_COPY_WRITE_BUFFER:
837 buffer = context->getCopyWriteBuffer();
838 break;
shannon.woods%transgaming.com@gtempaccount.comc926e5f2013-04-13 03:39:18 +0000839 case GL_PIXEL_PACK_BUFFER:
840 buffer = context->getPixelPackBuffer();
841 break;
842 case GL_PIXEL_UNPACK_BUFFER:
843 buffer = context->getPixelUnpackBuffer();
844 break;
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +0000845 case GL_TRANSFORM_FEEDBACK_BUFFER:
846 buffer = context->getGenericTransformFeedbackBuffer();
847 break;
848 case GL_UNIFORM_BUFFER:
849 buffer = context->getGenericUniformBuffer();
850 break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000851 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000852 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000853 }
854
855 if (!buffer)
856 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000857 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000858 }
859
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +0000860 buffer->bufferData(data, size, usage);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000861 }
862 }
863 catch(std::bad_alloc&)
864 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000865 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000866 }
867}
868
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +0000869void __stdcall glBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid* data)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000870{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000871 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 +0000872 target, offset, size, data);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000873
874 try
875 {
daniel@transgaming.comdefa1c32010-05-18 18:51:45 +0000876 if (size < 0 || offset < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000877 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000878 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000879 }
880
daniel@transgaming.comd4620a32010-03-21 04:31:28 +0000881 if (data == NULL)
882 {
883 return;
884 }
885
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000886 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +0000887
888 if (context)
889 {
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +0000890 // Check ES3 specific targets
891 switch (target)
892 {
shannon.woods%transgaming.com@gtempaccount.com51171882013-04-13 03:39:10 +0000893 case GL_COPY_READ_BUFFER:
894 case GL_COPY_WRITE_BUFFER:
shannon.woods%transgaming.com@gtempaccount.comc926e5f2013-04-13 03:39:18 +0000895 case GL_PIXEL_PACK_BUFFER:
896 case GL_PIXEL_UNPACK_BUFFER:
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +0000897 case GL_UNIFORM_BUFFER:
898 case GL_TRANSFORM_FEEDBACK_BUFFER:
899 if (context->getClientVersion() < 3)
900 {
901 return gl::error(GL_INVALID_ENUM);
902 }
903 }
904
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +0000905 gl::Buffer *buffer;
906
907 switch (target)
908 {
909 case GL_ARRAY_BUFFER:
910 buffer = context->getArrayBuffer();
911 break;
912 case GL_ELEMENT_ARRAY_BUFFER:
913 buffer = context->getElementArrayBuffer();
914 break;
shannon.woods%transgaming.com@gtempaccount.com51171882013-04-13 03:39:10 +0000915 case GL_COPY_READ_BUFFER:
916 buffer = context->getCopyReadBuffer();
917 break;
918 case GL_COPY_WRITE_BUFFER:
919 buffer = context->getCopyWriteBuffer();
920 break;
shannon.woods%transgaming.com@gtempaccount.comc926e5f2013-04-13 03:39:18 +0000921 case GL_PIXEL_PACK_BUFFER:
922 buffer = context->getPixelPackBuffer();
923 break;
924 case GL_PIXEL_UNPACK_BUFFER:
925 buffer = context->getPixelUnpackBuffer();
926 break;
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +0000927 case GL_TRANSFORM_FEEDBACK_BUFFER:
928 buffer = context->getGenericTransformFeedbackBuffer();
929 break;
930 case GL_UNIFORM_BUFFER:
931 buffer = context->getGenericUniformBuffer();
932 break;
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +0000933 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000934 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +0000935 }
936
937 if (!buffer)
938 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000939 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +0000940 }
941
daniel@transgaming.comdefa1c32010-05-18 18:51:45 +0000942 if ((size_t)size + offset > buffer->size())
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +0000943 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000944 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +0000945 }
daniel@transgaming.comdefa1c32010-05-18 18:51:45 +0000946
947 buffer->bufferSubData(data, size, offset);
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +0000948 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000949 }
950 catch(std::bad_alloc&)
951 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000952 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000953 }
954}
955
956GLenum __stdcall glCheckFramebufferStatus(GLenum target)
957{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000958 EVENT("(GLenum target = 0x%X)", target);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000959
960 try
961 {
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +0000962 if (target != GL_FRAMEBUFFER && target != GL_DRAW_FRAMEBUFFER_ANGLE && target != GL_READ_FRAMEBUFFER_ANGLE)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000963 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000964 return gl::error(GL_INVALID_ENUM, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000965 }
966
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000967 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000968
969 if (context)
970 {
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +0000971 gl::Framebuffer *framebuffer = NULL;
972 if (target == GL_READ_FRAMEBUFFER_ANGLE)
973 {
974 framebuffer = context->getReadFramebuffer();
975 }
976 else
977 {
978 framebuffer = context->getDrawFramebuffer();
979 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000980
981 return framebuffer->completeness();
982 }
983 }
984 catch(std::bad_alloc&)
985 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000986 return gl::error(GL_OUT_OF_MEMORY, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000987 }
988
989 return 0;
990}
991
992void __stdcall glClear(GLbitfield mask)
993{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +0000994 EVENT("(GLbitfield mask = 0x%X)", mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000995
996 try
997 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000998 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000999
1000 if (context)
1001 {
1002 context->clear(mask);
1003 }
1004 }
1005 catch(std::bad_alloc&)
1006 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001007 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001008 }
1009}
1010
1011void __stdcall glClearColor(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha)
1012{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001013 EVENT("(GLclampf red = %f, GLclampf green = %f, GLclampf blue = %f, GLclampf alpha = %f)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001014 red, green, blue, alpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001015
1016 try
1017 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001018 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001019
1020 if (context)
1021 {
1022 context->setClearColor(red, green, blue, alpha);
1023 }
1024 }
1025 catch(std::bad_alloc&)
1026 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001027 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001028 }
1029}
1030
1031void __stdcall glClearDepthf(GLclampf depth)
1032{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001033 EVENT("(GLclampf depth = %f)", depth);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001034
1035 try
1036 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001037 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001038
1039 if (context)
1040 {
1041 context->setClearDepth(depth);
1042 }
1043 }
1044 catch(std::bad_alloc&)
1045 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001046 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001047 }
1048}
1049
1050void __stdcall glClearStencil(GLint s)
1051{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001052 EVENT("(GLint s = %d)", s);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001053
1054 try
1055 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001056 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001057
1058 if (context)
1059 {
1060 context->setClearStencil(s);
1061 }
1062 }
1063 catch(std::bad_alloc&)
1064 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001065 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001066 }
1067}
1068
1069void __stdcall glColorMask(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha)
1070{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00001071 EVENT("(GLboolean red = %d, GLboolean green = %u, GLboolean blue = %u, GLboolean alpha = %u)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001072 red, green, blue, alpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001073
1074 try
1075 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001076 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001077
1078 if (context)
1079 {
daniel@transgaming.coma36f98e2010-05-18 18:51:09 +00001080 context->setColorMask(red == GL_TRUE, green == GL_TRUE, blue == GL_TRUE, alpha == GL_TRUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001081 }
1082 }
1083 catch(std::bad_alloc&)
1084 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001085 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001086 }
1087}
1088
1089void __stdcall glCompileShader(GLuint shader)
1090{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001091 EVENT("(GLuint shader = %d)", shader);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001092
1093 try
1094 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001095 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001096
1097 if (context)
1098 {
1099 gl::Shader *shaderObject = context->getShader(shader);
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00001100
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001101 if (!shaderObject)
1102 {
daniel@transgaming.com0cefaf42010-04-13 03:26:36 +00001103 if (context->getProgram(shader))
1104 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001105 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com0cefaf42010-04-13 03:26:36 +00001106 }
1107 else
1108 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001109 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com0cefaf42010-04-13 03:26:36 +00001110 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001111 }
1112
1113 shaderObject->compile();
1114 }
1115 }
1116 catch(std::bad_alloc&)
1117 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001118 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001119 }
1120}
1121
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00001122void __stdcall glCompressedTexImage2D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height,
1123 GLint border, GLsizei imageSize, const GLvoid* data)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001124{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001125 EVENT("(GLenum target = 0x%X, GLint level = %d, GLenum internalformat = 0x%X, GLsizei width = %d, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00001126 "GLsizei height = %d, GLint border = %d, GLsizei imageSize = %d, const GLvoid* data = 0x%0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001127 target, level, internalformat, width, height, border, imageSize, data);
1128
1129 try
1130 {
daniel@transgaming.com4f9ef0d2011-05-30 23:51:19 +00001131 if (!validImageSize(level, width, height) || border != 0 || imageSize < 0)
daniel@transgaming.com41430492010-03-11 20:36:18 +00001132 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001133 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com41430492010-03-11 20:36:18 +00001134 }
1135
daniel@transgaming.com01868132010-08-24 19:21:17 +00001136 switch (internalformat)
1137 {
1138 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
1139 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
gman@chromium.org50c526d2011-08-10 05:19:44 +00001140 case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
1141 case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
daniel@transgaming.com01868132010-08-24 19:21:17 +00001142 break;
1143 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001144 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com01868132010-08-24 19:21:17 +00001145 }
1146
1147 if (border != 0)
1148 {
shannon.woods@transgaming.com0efef902013-02-28 23:21:09 +00001149 return gl::error(GL_INVALID_OPERATION);
1150 }
1151
1152 if (width != 1 && width != 2 && width % 4 != 0)
1153 {
1154 return gl::error(GL_INVALID_OPERATION);
1155 }
1156
1157 if (height != 1 && height != 2 && height % 4 != 0)
1158 {
1159 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com01868132010-08-24 19:21:17 +00001160 }
1161
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001162 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com01868132010-08-24 19:21:17 +00001163
1164 if (context)
1165 {
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001166 if (level > context->getMaximumTextureLevel())
1167 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001168 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001169 }
1170
1171 switch (target)
1172 {
1173 case GL_TEXTURE_2D:
shannon.woods%transgaming.com@gtempaccount.comc1fdf6b2013-04-13 03:44:41 +00001174 if (width > (context->getMaximum2DTextureDimension() >> level) ||
1175 height > (context->getMaximum2DTextureDimension() >> level))
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001176 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001177 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001178 }
1179 break;
1180 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
1181 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
1182 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
1183 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
1184 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
1185 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
1186 if (width != height)
1187 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001188 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001189 }
1190
1191 if (width > (context->getMaximumCubeTextureDimension() >> level) ||
1192 height > (context->getMaximumCubeTextureDimension() >> level))
1193 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001194 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001195 }
1196 break;
1197 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001198 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001199 }
1200
gman@chromium.org50c526d2011-08-10 05:19:44 +00001201 switch (internalformat) {
1202 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
1203 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
1204 if (!context->supportsDXT1Textures())
1205 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001206 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 +00001207 }
1208 break;
1209 case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
1210 if (!context->supportsDXT3Textures())
1211 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001212 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 +00001213 }
1214 break;
1215 case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
1216 if (!context->supportsDXT5Textures())
1217 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001218 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 +00001219 }
1220 break;
1221 default: UNREACHABLE();
daniel@transgaming.com01868132010-08-24 19:21:17 +00001222 }
1223
1224 if (imageSize != gl::ComputeCompressedSize(width, height, internalformat))
1225 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001226 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com01868132010-08-24 19:21:17 +00001227 }
1228
1229 if (target == GL_TEXTURE_2D)
1230 {
1231 gl::Texture2D *texture = context->getTexture2D();
1232
1233 if (!texture)
1234 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001235 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com01868132010-08-24 19:21:17 +00001236 }
1237
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00001238 if (texture->isImmutable())
1239 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001240 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00001241 }
1242
daniel@transgaming.com01868132010-08-24 19:21:17 +00001243 texture->setCompressedImage(level, internalformat, width, height, imageSize, data);
1244 }
1245 else
1246 {
1247 gl::TextureCubeMap *texture = context->getTextureCubeMap();
1248
1249 if (!texture)
1250 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001251 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com01868132010-08-24 19:21:17 +00001252 }
1253
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00001254 if (texture->isImmutable())
1255 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001256 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00001257 }
1258
daniel@transgaming.com01868132010-08-24 19:21:17 +00001259 switch (target)
1260 {
1261 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
1262 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
1263 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
1264 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
1265 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
1266 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
1267 texture->setCompressedImage(target, level, internalformat, width, height, imageSize, data);
1268 break;
1269 default: UNREACHABLE();
1270 }
1271 }
1272 }
1273
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001274 }
1275 catch(std::bad_alloc&)
1276 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001277 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001278 }
1279}
1280
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00001281void __stdcall glCompressedTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height,
1282 GLenum format, GLsizei imageSize, const GLvoid* data)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001283{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001284 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001285 "GLsizei width = %d, GLsizei height = %d, GLenum format = 0x%X, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00001286 "GLsizei imageSize = %d, const GLvoid* data = 0x%0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001287 target, level, xoffset, yoffset, width, height, format, imageSize, data);
1288
1289 try
1290 {
apatrick@chromium.org551022e2012-01-23 19:56:54 +00001291 if (!gl::IsInternalTextureTarget(target))
daniel@transgaming.com41430492010-03-11 20:36:18 +00001292 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001293 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com41430492010-03-11 20:36:18 +00001294 }
1295
daniel@transgaming.com4f9ef0d2011-05-30 23:51:19 +00001296 if (xoffset < 0 || yoffset < 0 || !validImageSize(level, width, height) || imageSize < 0)
daniel@transgaming.com41430492010-03-11 20:36:18 +00001297 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001298 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com41430492010-03-11 20:36:18 +00001299 }
1300
daniel@transgaming.com01868132010-08-24 19:21:17 +00001301 switch (format)
daniel@transgaming.com41430492010-03-11 20:36:18 +00001302 {
daniel@transgaming.com01868132010-08-24 19:21:17 +00001303 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
1304 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
gman@chromium.org50c526d2011-08-10 05:19:44 +00001305 case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
1306 case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
daniel@transgaming.com01868132010-08-24 19:21:17 +00001307 break;
1308 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001309 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com41430492010-03-11 20:36:18 +00001310 }
1311
daniel@transgaming.com01868132010-08-24 19:21:17 +00001312 if (width == 0 || height == 0 || data == NULL)
1313 {
1314 return;
1315 }
1316
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001317 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com01868132010-08-24 19:21:17 +00001318
1319 if (context)
1320 {
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001321 if (level > context->getMaximumTextureLevel())
1322 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001323 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001324 }
1325
gman@chromium.org50c526d2011-08-10 05:19:44 +00001326 switch (format) {
1327 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
1328 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
1329 if (!context->supportsDXT1Textures())
1330 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001331 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 +00001332 }
1333 break;
1334 case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
1335 if (!context->supportsDXT3Textures())
1336 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001337 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 +00001338 }
1339 break;
1340 case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
1341 if (!context->supportsDXT5Textures())
1342 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001343 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 +00001344 }
1345 break;
1346 default: UNREACHABLE();
daniel@transgaming.com01868132010-08-24 19:21:17 +00001347 }
1348
1349 if (imageSize != gl::ComputeCompressedSize(width, height, format))
1350 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001351 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com01868132010-08-24 19:21:17 +00001352 }
1353
1354 if (xoffset % 4 != 0 || yoffset % 4 != 0)
1355 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001356 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 +00001357 // does not exist unless DXT textures are supported.
daniel@transgaming.com01868132010-08-24 19:21:17 +00001358 }
1359
1360 if (target == GL_TEXTURE_2D)
1361 {
1362 gl::Texture2D *texture = context->getTexture2D();
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00001363 if (validateSubImageParams2D(true, width, height, xoffset, yoffset, level, format, GL_NONE, texture))
daniel@transgaming.com01868132010-08-24 19:21:17 +00001364 {
daniel@transgaming.com343373a2011-11-29 19:42:32 +00001365 texture->subImageCompressed(level, xoffset, yoffset, width, height, format, imageSize, data);
daniel@transgaming.com01868132010-08-24 19:21:17 +00001366 }
daniel@transgaming.com01868132010-08-24 19:21:17 +00001367 }
1368 else if (gl::IsCubemapTextureTarget(target))
1369 {
1370 gl::TextureCubeMap *texture = context->getTextureCubeMap();
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00001371 if (validateSubImageParamsCube(true, width, height, xoffset, yoffset, target, level, format, GL_NONE, texture))
daniel@transgaming.com01868132010-08-24 19:21:17 +00001372 {
daniel@transgaming.com343373a2011-11-29 19:42:32 +00001373 texture->subImageCompressed(target, level, xoffset, yoffset, width, height, format, imageSize, data);
daniel@transgaming.com01868132010-08-24 19:21:17 +00001374 }
daniel@transgaming.com01868132010-08-24 19:21:17 +00001375 }
1376 else
1377 {
1378 UNREACHABLE();
1379 }
1380 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001381 }
1382 catch(std::bad_alloc&)
1383 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001384 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001385 }
1386}
1387
1388void __stdcall glCopyTexImage2D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border)
1389{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001390 EVENT("(GLenum target = 0x%X, GLint level = %d, GLenum internalformat = 0x%X, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001391 "GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d, GLint border = %d)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001392 target, level, internalformat, x, y, width, height, border);
1393
1394 try
1395 {
daniel@transgaming.com4f9ef0d2011-05-30 23:51:19 +00001396 if (!validImageSize(level, width, height))
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001397 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001398 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001399 }
1400
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001401 if (border != 0)
1402 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001403 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001404 }
1405
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001406 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001407
1408 if (context)
1409 {
daniel@transgaming.com32b11442011-11-19 02:42:48 +00001410 if (level > context->getMaximumTextureLevel())
1411 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001412 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com32b11442011-11-19 02:42:48 +00001413 }
1414
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001415 switch (target)
1416 {
1417 case GL_TEXTURE_2D:
shannon.woods%transgaming.com@gtempaccount.comc1fdf6b2013-04-13 03:44:41 +00001418 if (width > (context->getMaximum2DTextureDimension() >> level) ||
1419 height > (context->getMaximum2DTextureDimension() >> level))
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001420 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001421 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001422 }
1423 break;
1424 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
1425 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
1426 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
1427 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
1428 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
1429 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
1430 if (width != height)
1431 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001432 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001433 }
1434
1435 if (width > (context->getMaximumCubeTextureDimension() >> level) ||
1436 height > (context->getMaximumCubeTextureDimension() >> level))
1437 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001438 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001439 }
1440 break;
1441 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001442 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001443 }
1444
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00001445 gl::Framebuffer *framebuffer = context->getReadFramebuffer();
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001446
daniel@transgaming.combbc57792010-07-28 19:21:05 +00001447 if (framebuffer->completeness() != GL_FRAMEBUFFER_COMPLETE)
1448 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001449 return gl::error(GL_INVALID_FRAMEBUFFER_OPERATION);
daniel@transgaming.combbc57792010-07-28 19:21:05 +00001450 }
1451
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00001452 if (context->getReadFramebufferHandle() != 0 && framebuffer->getSamples() != 0)
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00001453 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001454 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00001455 }
1456
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00001457 gl::Renderbuffer *source = framebuffer->getReadColorbuffer();
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +00001458 GLenum colorbufferFormat = source->getInternalFormat();
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001459
1460 // [OpenGL ES 2.0.24] table 3.9
1461 switch (internalformat)
1462 {
1463 case GL_ALPHA:
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00001464 if (colorbufferFormat != GL_ALPHA8_EXT &&
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001465 colorbufferFormat != GL_RGBA4 &&
1466 colorbufferFormat != GL_RGB5_A1 &&
shannon.woods@transgaming.com28e7ba02013-02-28 23:09:28 +00001467 colorbufferFormat != GL_BGRA8_EXT &&
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001468 colorbufferFormat != GL_RGBA8_OES)
1469 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001470 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001471 }
1472 break;
1473 case GL_LUMINANCE:
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00001474 case GL_RGB:
1475 if (colorbufferFormat != GL_RGB565 &&
1476 colorbufferFormat != GL_RGB8_OES &&
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001477 colorbufferFormat != GL_RGBA4 &&
1478 colorbufferFormat != GL_RGB5_A1 &&
shannon.woods@transgaming.com28e7ba02013-02-28 23:09:28 +00001479 colorbufferFormat != GL_BGRA8_EXT &&
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001480 colorbufferFormat != GL_RGBA8_OES)
1481 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001482 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001483 }
1484 break;
1485 case GL_LUMINANCE_ALPHA:
1486 case GL_RGBA:
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00001487 if (colorbufferFormat != GL_RGBA4 &&
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001488 colorbufferFormat != GL_RGB5_A1 &&
shannon.woods@transgaming.com28e7ba02013-02-28 23:09:28 +00001489 colorbufferFormat != GL_BGRA8_EXT &&
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001490 colorbufferFormat != GL_RGBA8_OES)
1491 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001492 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001493 }
1494 break;
1495 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
1496 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
gman@chromium.org50c526d2011-08-10 05:19:44 +00001497 if (context->supportsDXT1Textures())
1498 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001499 return gl::error(GL_INVALID_OPERATION);
gman@chromium.org50c526d2011-08-10 05:19:44 +00001500 }
1501 else
1502 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001503 return gl::error(GL_INVALID_ENUM);
gman@chromium.org50c526d2011-08-10 05:19:44 +00001504 }
1505 break;
1506 case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
1507 if (context->supportsDXT3Textures())
1508 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001509 return gl::error(GL_INVALID_OPERATION);
gman@chromium.org50c526d2011-08-10 05:19:44 +00001510 }
1511 else
1512 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001513 return gl::error(GL_INVALID_ENUM);
gman@chromium.org50c526d2011-08-10 05:19:44 +00001514 }
1515 break;
1516 case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
1517 if (context->supportsDXT5Textures())
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001518 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001519 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001520 }
1521 else
1522 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001523 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001524 }
1525 break;
daniel@transgaming.com0c854682012-05-31 01:14:11 +00001526 case GL_DEPTH_COMPONENT:
1527 case GL_DEPTH_COMPONENT16:
1528 case GL_DEPTH_COMPONENT32_OES:
1529 case GL_DEPTH_STENCIL_OES:
1530 case GL_DEPTH24_STENCIL8_OES:
1531 if (context->supportsDepthTextures())
1532 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001533 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com0c854682012-05-31 01:14:11 +00001534 }
1535 else
1536 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001537 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com0c854682012-05-31 01:14:11 +00001538 }
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001539 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001540 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001541 }
1542
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001543 if (target == GL_TEXTURE_2D)
1544 {
1545 gl::Texture2D *texture = context->getTexture2D();
1546
1547 if (!texture)
1548 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001549 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001550 }
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00001551
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00001552 if (texture->isImmutable())
1553 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001554 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00001555 }
1556
apatrick@chromium.orgb31f5322011-01-19 19:02:52 +00001557 texture->copyImage(level, internalformat, x, y, width, height, framebuffer);
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001558 }
daniel@transgaming.com19ffc242010-05-04 03:35:21 +00001559 else if (gl::IsCubemapTextureTarget(target))
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001560 {
1561 gl::TextureCubeMap *texture = context->getTextureCubeMap();
1562
1563 if (!texture)
1564 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001565 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001566 }
1567
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00001568 if (texture->isImmutable())
1569 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001570 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00001571 }
1572
apatrick@chromium.orgb31f5322011-01-19 19:02:52 +00001573 texture->copyImage(target, level, internalformat, x, y, width, height, framebuffer);
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001574 }
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001575 else UNREACHABLE();
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001576 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001577 }
1578 catch(std::bad_alloc&)
1579 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001580 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001581 }
1582}
1583
1584void __stdcall glCopyTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height)
1585{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001586 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001587 "GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001588 target, level, xoffset, yoffset, x, y, width, height);
1589
1590 try
1591 {
apatrick@chromium.org551022e2012-01-23 19:56:54 +00001592 if (!gl::IsInternalTextureTarget(target))
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001593 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001594 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001595 }
1596
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001597 if (level < 0 || xoffset < 0 || yoffset < 0 || width < 0 || height < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001598 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001599 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001600 }
1601
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001602 if (std::numeric_limits<GLsizei>::max() - xoffset < width || std::numeric_limits<GLsizei>::max() - yoffset < height)
1603 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001604 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001605 }
1606
1607 if (width == 0 || height == 0)
1608 {
1609 return;
1610 }
1611
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001612 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001613
1614 if (context)
1615 {
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001616 if (level > context->getMaximumTextureLevel())
1617 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001618 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001619 }
1620
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00001621 gl::Framebuffer *framebuffer = context->getReadFramebuffer();
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001622
daniel@transgaming.combbc57792010-07-28 19:21:05 +00001623 if (framebuffer->completeness() != GL_FRAMEBUFFER_COMPLETE)
1624 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001625 return gl::error(GL_INVALID_FRAMEBUFFER_OPERATION);
daniel@transgaming.combbc57792010-07-28 19:21:05 +00001626 }
1627
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00001628 if (context->getReadFramebufferHandle() != 0 && framebuffer->getSamples() != 0)
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00001629 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001630 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00001631 }
1632
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00001633 gl::Renderbuffer *source = framebuffer->getReadColorbuffer();
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +00001634 GLenum colorbufferFormat = source->getInternalFormat();
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001635 gl::Texture *texture = NULL;
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +00001636 GLenum textureFormat = GL_RGBA;
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001637
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001638 if (target == GL_TEXTURE_2D)
1639 {
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +00001640 gl::Texture2D *tex2d = context->getTexture2D();
1641
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00001642 if (!validateSubImageParams2D(false, width, height, xoffset, yoffset, level, GL_NONE, GL_NONE, tex2d))
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +00001643 {
1644 return; // error already registered by validateSubImageParams
1645 }
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00001646 textureFormat = gl::ExtractFormat(tex2d->getInternalFormat(level));
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +00001647 texture = tex2d;
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001648 }
daniel@transgaming.com19ffc242010-05-04 03:35:21 +00001649 else if (gl::IsCubemapTextureTarget(target))
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001650 {
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +00001651 gl::TextureCubeMap *texcube = context->getTextureCubeMap();
1652
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00001653 if (!validateSubImageParamsCube(false, width, height, xoffset, yoffset, target, level, GL_NONE, GL_NONE, texcube))
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +00001654 {
1655 return; // error already registered by validateSubImageParams
1656 }
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00001657 textureFormat = gl::ExtractFormat(texcube->getInternalFormat(target, level));
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +00001658 texture = texcube;
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001659 }
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001660 else UNREACHABLE();
1661
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001662 // [OpenGL ES 2.0.24] table 3.9
1663 switch (textureFormat)
1664 {
1665 case GL_ALPHA:
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00001666 if (colorbufferFormat != GL_ALPHA8_EXT &&
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001667 colorbufferFormat != GL_RGBA4 &&
1668 colorbufferFormat != GL_RGB5_A1 &&
1669 colorbufferFormat != GL_RGBA8_OES)
1670 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001671 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001672 }
1673 break;
1674 case GL_LUMINANCE:
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00001675 case GL_RGB:
1676 if (colorbufferFormat != GL_RGB565 &&
1677 colorbufferFormat != GL_RGB8_OES &&
1678 colorbufferFormat != GL_RGBA4 &&
1679 colorbufferFormat != GL_RGB5_A1 &&
1680 colorbufferFormat != GL_RGBA8_OES)
1681 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001682 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00001683 }
1684 break;
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001685 case GL_LUMINANCE_ALPHA:
1686 case GL_RGBA:
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00001687 if (colorbufferFormat != GL_RGBA4 &&
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001688 colorbufferFormat != GL_RGB5_A1 &&
1689 colorbufferFormat != GL_RGBA8_OES)
1690 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001691 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001692 }
1693 break;
1694 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
1695 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
gman@chromium.org50c526d2011-08-10 05:19:44 +00001696 case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
1697 case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001698 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com0c854682012-05-31 01:14:11 +00001699 case GL_DEPTH_COMPONENT:
1700 case GL_DEPTH_STENCIL_OES:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001701 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001702 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001703 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001704 }
1705
apatrick@chromium.orgb31f5322011-01-19 19:02:52 +00001706 texture->copySubImage(target, level, xoffset, yoffset, x, y, width, height, framebuffer);
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001707 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001708 }
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001709
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001710 catch(std::bad_alloc&)
1711 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001712 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001713 }
1714}
1715
1716GLuint __stdcall glCreateProgram(void)
1717{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001718 EVENT("()");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001719
1720 try
1721 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001722 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001723
1724 if (context)
1725 {
1726 return context->createProgram();
1727 }
1728 }
1729 catch(std::bad_alloc&)
1730 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001731 return gl::error(GL_OUT_OF_MEMORY, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001732 }
1733
1734 return 0;
1735}
1736
1737GLuint __stdcall glCreateShader(GLenum type)
1738{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001739 EVENT("(GLenum type = 0x%X)", type);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001740
1741 try
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 switch (type)
1748 {
1749 case GL_FRAGMENT_SHADER:
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00001750 case GL_VERTEX_SHADER:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001751 return context->createShader(type);
1752 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001753 return gl::error(GL_INVALID_ENUM, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001754 }
1755 }
1756 }
1757 catch(std::bad_alloc&)
1758 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001759 return gl::error(GL_OUT_OF_MEMORY, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001760 }
1761
1762 return 0;
1763}
1764
1765void __stdcall glCullFace(GLenum mode)
1766{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001767 EVENT("(GLenum mode = 0x%X)", mode);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001768
1769 try
1770 {
1771 switch (mode)
1772 {
1773 case GL_FRONT:
1774 case GL_BACK:
1775 case GL_FRONT_AND_BACK:
1776 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001777 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001778
1779 if (context)
1780 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00001781 context->setCullMode(mode);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001782 }
1783 }
1784 break;
1785 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001786 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001787 }
1788 }
1789 catch(std::bad_alloc&)
1790 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001791 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001792 }
1793}
1794
1795void __stdcall glDeleteBuffers(GLsizei n, const GLuint* buffers)
1796{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001797 EVENT("(GLsizei n = %d, const GLuint* buffers = 0x%0.8p)", n, buffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001798
1799 try
1800 {
1801 if (n < 0)
1802 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001803 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001804 }
1805
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001806 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001807
1808 if (context)
1809 {
1810 for (int i = 0; i < n; i++)
1811 {
1812 context->deleteBuffer(buffers[i]);
1813 }
1814 }
1815 }
1816 catch(std::bad_alloc&)
1817 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001818 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001819 }
1820}
1821
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001822void __stdcall glDeleteFencesNV(GLsizei n, const GLuint* fences)
1823{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001824 EVENT("(GLsizei n = %d, const GLuint* fences = 0x%0.8p)", n, fences);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001825
1826 try
1827 {
1828 if (n < 0)
1829 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001830 return gl::error(GL_INVALID_VALUE);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001831 }
1832
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001833 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001834
1835 if (context)
1836 {
1837 for (int i = 0; i < n; i++)
1838 {
1839 context->deleteFence(fences[i]);
1840 }
1841 }
1842 }
1843 catch(std::bad_alloc&)
1844 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001845 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001846 }
1847}
1848
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001849void __stdcall glDeleteFramebuffers(GLsizei n, const GLuint* framebuffers)
1850{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001851 EVENT("(GLsizei n = %d, const GLuint* framebuffers = 0x%0.8p)", n, framebuffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001852
1853 try
1854 {
1855 if (n < 0)
1856 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001857 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001858 }
1859
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001860 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001861
1862 if (context)
1863 {
1864 for (int i = 0; i < n; i++)
1865 {
1866 if (framebuffers[i] != 0)
1867 {
1868 context->deleteFramebuffer(framebuffers[i]);
1869 }
1870 }
1871 }
1872 }
1873 catch(std::bad_alloc&)
1874 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001875 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001876 }
1877}
1878
1879void __stdcall glDeleteProgram(GLuint program)
1880{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001881 EVENT("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001882
1883 try
1884 {
daniel@transgaming.com75401e62010-04-13 03:26:39 +00001885 if (program == 0)
1886 {
1887 return;
1888 }
1889
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001890 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001891
1892 if (context)
1893 {
daniel@transgaming.com75401e62010-04-13 03:26:39 +00001894 if (!context->getProgram(program))
1895 {
1896 if(context->getShader(program))
1897 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001898 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com75401e62010-04-13 03:26:39 +00001899 }
1900 else
1901 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001902 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com75401e62010-04-13 03:26:39 +00001903 }
1904 }
1905
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001906 context->deleteProgram(program);
1907 }
1908 }
1909 catch(std::bad_alloc&)
1910 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001911 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001912 }
1913}
1914
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00001915void __stdcall glDeleteQueriesEXT(GLsizei n, const GLuint *ids)
1916{
1917 EVENT("(GLsizei n = %d, const GLuint *ids = 0x%0.8p)", n, ids);
1918
1919 try
1920 {
1921 if (n < 0)
1922 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001923 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00001924 }
1925
1926 gl::Context *context = gl::getNonLostContext();
1927
1928 if (context)
1929 {
1930 for (int i = 0; i < n; i++)
1931 {
1932 context->deleteQuery(ids[i]);
1933 }
1934 }
1935 }
1936 catch(std::bad_alloc&)
1937 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001938 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00001939 }
1940}
1941
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001942void __stdcall glDeleteRenderbuffers(GLsizei n, const GLuint* renderbuffers)
1943{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001944 EVENT("(GLsizei n = %d, const GLuint* renderbuffers = 0x%0.8p)", n, renderbuffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001945
1946 try
1947 {
1948 if (n < 0)
1949 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001950 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001951 }
1952
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001953 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001954
1955 if (context)
1956 {
daniel@transgaming.come2b22122010-03-11 19:22:14 +00001957 for (int i = 0; i < n; i++)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001958 {
1959 context->deleteRenderbuffer(renderbuffers[i]);
1960 }
1961 }
1962 }
1963 catch(std::bad_alloc&)
1964 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001965 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001966 }
1967}
1968
1969void __stdcall glDeleteShader(GLuint shader)
1970{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001971 EVENT("(GLuint shader = %d)", shader);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001972
1973 try
1974 {
daniel@transgaming.com75401e62010-04-13 03:26:39 +00001975 if (shader == 0)
1976 {
1977 return;
1978 }
1979
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001980 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001981
1982 if (context)
1983 {
daniel@transgaming.com75401e62010-04-13 03:26:39 +00001984 if (!context->getShader(shader))
1985 {
1986 if(context->getProgram(shader))
1987 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001988 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com75401e62010-04-13 03:26:39 +00001989 }
1990 else
1991 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001992 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com75401e62010-04-13 03:26:39 +00001993 }
1994 }
1995
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001996 context->deleteShader(shader);
1997 }
1998 }
1999 catch(std::bad_alloc&)
2000 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002001 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002002 }
2003}
2004
2005void __stdcall glDeleteTextures(GLsizei n, const GLuint* textures)
2006{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002007 EVENT("(GLsizei n = %d, const GLuint* textures = 0x%0.8p)", n, textures);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002008
2009 try
2010 {
2011 if (n < 0)
2012 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002013 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002014 }
2015
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002016 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002017
2018 if (context)
2019 {
2020 for (int i = 0; i < n; i++)
2021 {
2022 if (textures[i] != 0)
2023 {
2024 context->deleteTexture(textures[i]);
2025 }
2026 }
2027 }
2028 }
2029 catch(std::bad_alloc&)
2030 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002031 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002032 }
2033}
2034
2035void __stdcall glDepthFunc(GLenum func)
2036{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002037 EVENT("(GLenum func = 0x%X)", func);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002038
2039 try
2040 {
2041 switch (func)
2042 {
2043 case GL_NEVER:
2044 case GL_ALWAYS:
2045 case GL_LESS:
2046 case GL_LEQUAL:
2047 case GL_EQUAL:
2048 case GL_GREATER:
2049 case GL_GEQUAL:
2050 case GL_NOTEQUAL:
2051 break;
2052 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002053 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002054 }
2055
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002056 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002057
2058 if (context)
2059 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00002060 context->setDepthFunc(func);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002061 }
2062 }
2063 catch(std::bad_alloc&)
2064 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002065 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002066 }
2067}
2068
2069void __stdcall glDepthMask(GLboolean flag)
2070{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00002071 EVENT("(GLboolean flag = %u)", flag);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002072
2073 try
2074 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002075 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002076
2077 if (context)
2078 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00002079 context->setDepthMask(flag != GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002080 }
2081 }
2082 catch(std::bad_alloc&)
2083 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002084 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002085 }
2086}
2087
2088void __stdcall glDepthRangef(GLclampf zNear, GLclampf zFar)
2089{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002090 EVENT("(GLclampf zNear = %f, GLclampf zFar = %f)", zNear, zFar);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002091
2092 try
2093 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002094 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002095
2096 if (context)
2097 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00002098 context->setDepthRange(zNear, zFar);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002099 }
2100 }
2101 catch(std::bad_alloc&)
2102 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002103 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002104 }
2105}
2106
2107void __stdcall glDetachShader(GLuint program, GLuint shader)
2108{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002109 EVENT("(GLuint program = %d, GLuint shader = %d)", program, shader);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002110
2111 try
2112 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002113 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002114
2115 if (context)
2116 {
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00002117
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002118 gl::Program *programObject = context->getProgram(program);
2119 gl::Shader *shaderObject = context->getShader(shader);
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00002120
2121 if (!programObject)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002122 {
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00002123 gl::Shader *shaderByProgramHandle;
2124 shaderByProgramHandle = context->getShader(program);
2125 if (!shaderByProgramHandle)
2126 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002127 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00002128 }
2129 else
2130 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002131 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00002132 }
2133 }
2134
2135 if (!shaderObject)
2136 {
2137 gl::Program *programByShaderHandle = context->getProgram(shader);
2138 if (!programByShaderHandle)
2139 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002140 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00002141 }
2142 else
2143 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002144 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00002145 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002146 }
2147
2148 if (!programObject->detachShader(shaderObject))
2149 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002150 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002151 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002152 }
2153 }
2154 catch(std::bad_alloc&)
2155 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002156 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002157 }
2158}
2159
2160void __stdcall glDisable(GLenum cap)
2161{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002162 EVENT("(GLenum cap = 0x%X)", cap);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002163
2164 try
2165 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002166 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002167
2168 if (context)
2169 {
2170 switch (cap)
2171 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00002172 case GL_CULL_FACE: context->setCullFace(false); break;
2173 case GL_POLYGON_OFFSET_FILL: context->setPolygonOffsetFill(false); break;
2174 case GL_SAMPLE_ALPHA_TO_COVERAGE: context->setSampleAlphaToCoverage(false); break;
2175 case GL_SAMPLE_COVERAGE: context->setSampleCoverage(false); break;
2176 case GL_SCISSOR_TEST: context->setScissorTest(false); break;
2177 case GL_STENCIL_TEST: context->setStencilTest(false); break;
2178 case GL_DEPTH_TEST: context->setDepthTest(false); break;
2179 case GL_BLEND: context->setBlend(false); break;
2180 case GL_DITHER: context->setDither(false); break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002181 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002182 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002183 }
2184 }
2185 }
2186 catch(std::bad_alloc&)
2187 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002188 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002189 }
2190}
2191
2192void __stdcall glDisableVertexAttribArray(GLuint index)
2193{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002194 EVENT("(GLuint index = %d)", index);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002195
2196 try
2197 {
2198 if (index >= gl::MAX_VERTEX_ATTRIBS)
2199 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002200 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002201 }
2202
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002203 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002204
2205 if (context)
2206 {
daniel@transgaming.com83921382011-01-08 05:46:00 +00002207 context->setEnableVertexAttribArray(index, false);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002208 }
2209 }
2210 catch(std::bad_alloc&)
2211 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002212 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002213 }
2214}
2215
2216void __stdcall glDrawArrays(GLenum mode, GLint first, GLsizei count)
2217{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002218 EVENT("(GLenum mode = 0x%X, GLint first = %d, GLsizei count = %d)", mode, first, count);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002219
2220 try
2221 {
2222 if (count < 0 || first < 0)
2223 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002224 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002225 }
2226
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002227 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002228
2229 if (context)
2230 {
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00002231 context->drawArrays(mode, first, count, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002232 }
2233 }
2234 catch(std::bad_alloc&)
2235 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002236 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002237 }
2238}
2239
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002240void __stdcall glDrawArraysInstancedANGLE(GLenum mode, GLint first, GLsizei count, GLsizei primcount)
2241{
2242 EVENT("(GLenum mode = 0x%X, GLint first = %d, GLsizei count = %d, GLsizei primcount = %d)", mode, first, count, primcount);
2243
2244 try
2245 {
2246 if (count < 0 || first < 0 || primcount < 0)
2247 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002248 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002249 }
2250
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00002251 if (primcount > 0)
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002252 {
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00002253 gl::Context *context = gl::getNonLostContext();
2254
2255 if (context)
2256 {
2257 context->drawArrays(mode, first, count, primcount);
2258 }
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002259 }
2260 }
2261 catch(std::bad_alloc&)
2262 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002263 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002264 }
2265}
2266
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00002267void __stdcall glDrawElements(GLenum mode, GLsizei count, GLenum type, const GLvoid* indices)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002268{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002269 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 +00002270 mode, count, type, indices);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002271
2272 try
2273 {
2274 if (count < 0)
2275 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002276 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002277 }
2278
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002279 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002280
2281 if (context)
2282 {
daniel@transgaming.com83921382011-01-08 05:46:00 +00002283 switch (type)
2284 {
2285 case GL_UNSIGNED_BYTE:
2286 case GL_UNSIGNED_SHORT:
2287 break;
2288 case GL_UNSIGNED_INT:
2289 if (!context->supports32bitIndices())
2290 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002291 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com83921382011-01-08 05:46:00 +00002292 }
2293 break;
2294 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002295 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com83921382011-01-08 05:46:00 +00002296 }
2297
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00002298 context->drawElements(mode, count, type, indices, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002299 }
2300 }
2301 catch(std::bad_alloc&)
2302 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002303 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002304 }
2305}
2306
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002307void __stdcall glDrawElementsInstancedANGLE(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLsizei primcount)
2308{
2309 EVENT("(GLenum mode = 0x%X, GLsizei count = %d, GLenum type = 0x%X, const GLvoid* indices = 0x%0.8p, GLsizei primcount = %d)",
2310 mode, count, type, indices, primcount);
2311
2312 try
2313 {
2314 if (count < 0 || primcount < 0)
2315 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002316 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002317 }
2318
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00002319 if (primcount > 0)
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002320 {
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00002321 gl::Context *context = gl::getNonLostContext();
2322
2323 if (context)
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002324 {
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00002325 switch (type)
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002326 {
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00002327 case GL_UNSIGNED_BYTE:
2328 case GL_UNSIGNED_SHORT:
2329 break;
2330 case GL_UNSIGNED_INT:
2331 if (!context->supports32bitIndices())
2332 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002333 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00002334 }
2335 break;
2336 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002337 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002338 }
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00002339
2340 context->drawElements(mode, count, type, indices, primcount);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002341 }
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002342 }
2343 }
2344 catch(std::bad_alloc&)
2345 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002346 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002347 }
2348}
2349
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002350void __stdcall glEnable(GLenum cap)
2351{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002352 EVENT("(GLenum cap = 0x%X)", cap);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002353
2354 try
2355 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002356 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002357
2358 if (context)
2359 {
2360 switch (cap)
2361 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00002362 case GL_CULL_FACE: context->setCullFace(true); break;
2363 case GL_POLYGON_OFFSET_FILL: context->setPolygonOffsetFill(true); break;
2364 case GL_SAMPLE_ALPHA_TO_COVERAGE: context->setSampleAlphaToCoverage(true); break;
2365 case GL_SAMPLE_COVERAGE: context->setSampleCoverage(true); break;
2366 case GL_SCISSOR_TEST: context->setScissorTest(true); break;
2367 case GL_STENCIL_TEST: context->setStencilTest(true); break;
2368 case GL_DEPTH_TEST: context->setDepthTest(true); break;
2369 case GL_BLEND: context->setBlend(true); break;
2370 case GL_DITHER: context->setDither(true); break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002371 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002372 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002373 }
2374 }
2375 }
2376 catch(std::bad_alloc&)
2377 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002378 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002379 }
2380}
2381
2382void __stdcall glEnableVertexAttribArray(GLuint index)
2383{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002384 EVENT("(GLuint index = %d)", index);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002385
2386 try
2387 {
2388 if (index >= gl::MAX_VERTEX_ATTRIBS)
2389 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002390 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002391 }
2392
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002393 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002394
2395 if (context)
2396 {
daniel@transgaming.com83921382011-01-08 05:46:00 +00002397 context->setEnableVertexAttribArray(index, true);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002398 }
2399 }
2400 catch(std::bad_alloc&)
2401 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002402 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002403 }
2404}
2405
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00002406void __stdcall glEndQueryEXT(GLenum target)
2407{
2408 EVENT("GLenum target = 0x%X)", target);
2409
2410 try
2411 {
2412 switch (target)
2413 {
2414 case GL_ANY_SAMPLES_PASSED_EXT:
2415 case GL_ANY_SAMPLES_PASSED_CONSERVATIVE_EXT:
2416 break;
2417 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002418 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00002419 }
2420
2421 gl::Context *context = gl::getNonLostContext();
2422
2423 if (context)
2424 {
2425 context->endQuery(target);
2426 }
2427 }
2428 catch(std::bad_alloc&)
2429 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002430 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00002431 }
2432}
2433
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002434void __stdcall glFinishFenceNV(GLuint fence)
2435{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002436 EVENT("(GLuint fence = %d)", fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002437
2438 try
2439 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002440 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002441
2442 if (context)
2443 {
2444 gl::Fence* fenceObject = context->getFence(fence);
2445
2446 if (fenceObject == NULL)
2447 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002448 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002449 }
2450
2451 fenceObject->finishFence();
2452 }
2453 }
2454 catch(std::bad_alloc&)
2455 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002456 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002457 }
2458}
2459
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002460void __stdcall glFinish(void)
2461{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002462 EVENT("()");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002463
2464 try
2465 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002466 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002467
2468 if (context)
2469 {
daniel@transgaming.com0d86aa72011-10-26 02:35:10 +00002470 context->sync(true);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002471 }
2472 }
2473 catch(std::bad_alloc&)
2474 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002475 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002476 }
2477}
2478
2479void __stdcall glFlush(void)
2480{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002481 EVENT("()");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002482
2483 try
2484 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002485 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002486
2487 if (context)
2488 {
daniel@transgaming.com0d86aa72011-10-26 02:35:10 +00002489 context->sync(false);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002490 }
2491 }
2492 catch(std::bad_alloc&)
2493 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002494 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002495 }
2496}
2497
2498void __stdcall glFramebufferRenderbuffer(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer)
2499{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002500 EVENT("(GLenum target = 0x%X, GLenum attachment = 0x%X, GLenum renderbuffertarget = 0x%X, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00002501 "GLuint renderbuffer = %d)", target, attachment, renderbuffertarget, renderbuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002502
2503 try
2504 {
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002505 if ((target != GL_FRAMEBUFFER && target != GL_DRAW_FRAMEBUFFER_ANGLE && target != GL_READ_FRAMEBUFFER_ANGLE)
daniel@transgaming.com2fa45512011-10-04 18:43:18 +00002506 || (renderbuffertarget != GL_RENDERBUFFER && renderbuffer != 0))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002507 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002508 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002509 }
2510
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002511 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002512
2513 if (context)
2514 {
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002515 gl::Framebuffer *framebuffer = NULL;
2516 GLuint framebufferHandle = 0;
2517 if (target == GL_READ_FRAMEBUFFER_ANGLE)
2518 {
2519 framebuffer = context->getReadFramebuffer();
2520 framebufferHandle = context->getReadFramebufferHandle();
2521 }
daniel@transgaming.com2fa45512011-10-04 18:43:18 +00002522 else
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002523 {
2524 framebuffer = context->getDrawFramebuffer();
2525 framebufferHandle = context->getDrawFramebufferHandle();
2526 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002527
daniel@transgaming.com2fa45512011-10-04 18:43:18 +00002528 if (!framebuffer || (framebufferHandle == 0 && renderbuffer != 0))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002529 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002530 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002531 }
2532
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002533 if (attachment >= GL_COLOR_ATTACHMENT0_EXT && attachment <= GL_COLOR_ATTACHMENT15_EXT)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002534 {
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002535 const unsigned int colorAttachment = (attachment - GL_COLOR_ATTACHMENT0_EXT);
2536
2537 if (colorAttachment >= context->getMaximumRenderTargets())
2538 {
2539 return gl::error(GL_INVALID_VALUE);
2540 }
2541
2542 framebuffer->setColorbuffer(colorAttachment, GL_RENDERBUFFER, renderbuffer);
2543 }
2544 else
2545 {
2546 switch (attachment)
2547 {
2548 case GL_DEPTH_ATTACHMENT:
2549 framebuffer->setDepthbuffer(GL_RENDERBUFFER, renderbuffer);
2550 break;
2551 case GL_STENCIL_ATTACHMENT:
2552 framebuffer->setStencilbuffer(GL_RENDERBUFFER, renderbuffer);
2553 break;
2554 default:
2555 return gl::error(GL_INVALID_ENUM);
2556 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002557 }
2558 }
2559 }
2560 catch(std::bad_alloc&)
2561 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002562 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002563 }
2564}
2565
2566void __stdcall glFramebufferTexture2D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level)
2567{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002568 EVENT("(GLenum target = 0x%X, GLenum attachment = 0x%X, GLenum textarget = 0x%X, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00002569 "GLuint texture = %d, GLint level = %d)", target, attachment, textarget, texture, level);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002570
2571 try
2572 {
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002573 if (target != GL_FRAMEBUFFER && target != GL_DRAW_FRAMEBUFFER_ANGLE && target != GL_READ_FRAMEBUFFER_ANGLE)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002574 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002575 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002576 }
2577
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002578 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002579
2580 if (context)
2581 {
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002582 if (attachment >= GL_COLOR_ATTACHMENT0_EXT && attachment <= GL_COLOR_ATTACHMENT15_EXT)
2583 {
2584 const unsigned int colorAttachment = (attachment - GL_COLOR_ATTACHMENT0_EXT);
2585
2586 if (colorAttachment >= context->getMaximumRenderTargets())
2587 {
2588 return gl::error(GL_INVALID_VALUE);
2589 }
2590 }
2591 else
2592 {
2593 switch (attachment)
2594 {
2595 case GL_DEPTH_ATTACHMENT:
2596 case GL_STENCIL_ATTACHMENT:
2597 break;
2598 default:
2599 return gl::error(GL_INVALID_ENUM);
2600 }
2601 }
2602
daniel@transgaming.com93a81472010-04-20 18:52:58 +00002603 if (texture == 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002604 {
daniel@transgaming.com93a81472010-04-20 18:52:58 +00002605 textarget = GL_NONE;
2606 }
2607 else
2608 {
2609 gl::Texture *tex = context->getTexture(texture);
2610
2611 if (tex == NULL)
2612 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002613 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com93a81472010-04-20 18:52:58 +00002614 }
2615
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002616 switch (textarget)
2617 {
2618 case GL_TEXTURE_2D:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002619 {
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00002620 if (tex->getTarget() != GL_TEXTURE_2D)
2621 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002622 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00002623 }
2624 gl::Texture2D *tex2d = static_cast<gl::Texture2D *>(tex);
daniel@transgaming.com92f49922012-05-09 15:49:19 +00002625 if (tex2d->isCompressed(0))
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00002626 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002627 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00002628 }
2629 break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002630 }
daniel@transgaming.com93a81472010-04-20 18:52:58 +00002631
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002632 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002633 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002634 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002635 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002636 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002637 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
daniel@transgaming.com93a81472010-04-20 18:52:58 +00002638 {
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00002639 if (tex->getTarget() != GL_TEXTURE_CUBE_MAP)
2640 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002641 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00002642 }
2643 gl::TextureCubeMap *texcube = static_cast<gl::TextureCubeMap *>(tex);
daniel@transgaming.com4df88e82012-05-09 15:49:24 +00002644 if (texcube->isCompressed(textarget, level))
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00002645 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002646 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00002647 }
2648 break;
daniel@transgaming.com93a81472010-04-20 18:52:58 +00002649 }
daniel@transgaming.com93a81472010-04-20 18:52:58 +00002650
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002651 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002652 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002653 }
2654
2655 if (level != 0)
2656 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002657 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002658 }
2659 }
2660
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002661 gl::Framebuffer *framebuffer = NULL;
2662 GLuint framebufferHandle = 0;
2663 if (target == GL_READ_FRAMEBUFFER_ANGLE)
2664 {
2665 framebuffer = context->getReadFramebuffer();
2666 framebufferHandle = context->getReadFramebufferHandle();
2667 }
2668 else
2669 {
2670 framebuffer = context->getDrawFramebuffer();
2671 framebufferHandle = context->getDrawFramebufferHandle();
2672 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002673
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002674 if (framebufferHandle == 0 || !framebuffer)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002675 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002676 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002677 }
2678
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002679 if (attachment >= GL_COLOR_ATTACHMENT0_EXT && attachment <= GL_COLOR_ATTACHMENT15_EXT)
daniel@transgaming.comfbc09532010-04-26 15:33:41 +00002680 {
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002681 const unsigned int colorAttachment = (attachment - GL_COLOR_ATTACHMENT0_EXT);
2682
2683 if (colorAttachment >= context->getMaximumRenderTargets())
2684 {
2685 return gl::error(GL_INVALID_VALUE);
2686 }
2687
2688 framebuffer->setColorbuffer(colorAttachment, textarget, texture);
2689 }
2690 else
2691 {
2692 switch (attachment)
2693 {
2694 case GL_DEPTH_ATTACHMENT: framebuffer->setDepthbuffer(textarget, texture); break;
2695 case GL_STENCIL_ATTACHMENT: framebuffer->setStencilbuffer(textarget, texture); break;
2696 }
daniel@transgaming.comfbc09532010-04-26 15:33:41 +00002697 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002698 }
2699 }
2700 catch(std::bad_alloc&)
2701 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002702 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002703 }
2704}
2705
2706void __stdcall glFrontFace(GLenum mode)
2707{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002708 EVENT("(GLenum mode = 0x%X)", mode);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002709
2710 try
2711 {
2712 switch (mode)
2713 {
2714 case GL_CW:
2715 case GL_CCW:
2716 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002717 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002718
2719 if (context)
2720 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00002721 context->setFrontFace(mode);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002722 }
2723 }
2724 break;
2725 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002726 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002727 }
2728 }
2729 catch(std::bad_alloc&)
2730 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002731 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002732 }
2733}
2734
2735void __stdcall glGenBuffers(GLsizei n, GLuint* buffers)
2736{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002737 EVENT("(GLsizei n = %d, GLuint* buffers = 0x%0.8p)", n, buffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002738
2739 try
2740 {
2741 if (n < 0)
2742 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002743 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002744 }
2745
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002746 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002747
2748 if (context)
2749 {
2750 for (int i = 0; i < n; i++)
2751 {
2752 buffers[i] = context->createBuffer();
2753 }
2754 }
2755 }
2756 catch(std::bad_alloc&)
2757 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002758 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002759 }
2760}
2761
2762void __stdcall glGenerateMipmap(GLenum target)
2763{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002764 EVENT("(GLenum target = 0x%X)", target);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002765
2766 try
2767 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002768 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com8fd99e22010-04-20 18:52:00 +00002769
2770 if (context)
2771 {
daniel@transgaming.com8fd99e22010-04-20 18:52:00 +00002772 switch (target)
2773 {
2774 case GL_TEXTURE_2D:
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00002775 {
2776 gl::Texture2D *tex2d = context->getTexture2D();
2777
daniel@transgaming.com92f49922012-05-09 15:49:19 +00002778 if (tex2d->isCompressed(0))
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00002779 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002780 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00002781 }
daniel@transgaming.com0c854682012-05-31 01:14:11 +00002782 if (tex2d->isDepth(0))
2783 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002784 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com0c854682012-05-31 01:14:11 +00002785 }
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00002786
2787 tex2d->generateMipmaps();
2788 break;
2789 }
daniel@transgaming.com8fd99e22010-04-20 18:52:00 +00002790
2791 case GL_TEXTURE_CUBE_MAP:
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00002792 {
2793 gl::TextureCubeMap *texcube = context->getTextureCubeMap();
2794
daniel@transgaming.com4df88e82012-05-09 15:49:24 +00002795 if (texcube->isCompressed(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0))
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00002796 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002797 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00002798 }
2799
2800 texcube->generateMipmaps();
2801 break;
2802 }
daniel@transgaming.com8fd99e22010-04-20 18:52:00 +00002803
2804 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002805 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com8fd99e22010-04-20 18:52:00 +00002806 }
daniel@transgaming.com8fd99e22010-04-20 18:52:00 +00002807 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002808 }
2809 catch(std::bad_alloc&)
2810 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002811 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002812 }
2813}
2814
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002815void __stdcall glGenFencesNV(GLsizei n, GLuint* fences)
2816{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002817 EVENT("(GLsizei n = %d, GLuint* fences = 0x%0.8p)", n, fences);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002818
2819 try
2820 {
2821 if (n < 0)
2822 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002823 return gl::error(GL_INVALID_VALUE);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002824 }
2825
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002826 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002827
2828 if (context)
2829 {
2830 for (int i = 0; i < n; i++)
2831 {
2832 fences[i] = context->createFence();
2833 }
2834 }
2835 }
2836 catch(std::bad_alloc&)
2837 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002838 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002839 }
2840}
2841
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002842void __stdcall glGenFramebuffers(GLsizei n, GLuint* framebuffers)
2843{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002844 EVENT("(GLsizei n = %d, GLuint* framebuffers = 0x%0.8p)", n, framebuffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002845
2846 try
2847 {
2848 if (n < 0)
2849 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002850 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002851 }
2852
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002853 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002854
2855 if (context)
2856 {
2857 for (int i = 0; i < n; i++)
2858 {
2859 framebuffers[i] = context->createFramebuffer();
2860 }
2861 }
2862 }
2863 catch(std::bad_alloc&)
2864 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002865 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002866 }
2867}
2868
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00002869void __stdcall glGenQueriesEXT(GLsizei n, GLuint* ids)
2870{
2871 EVENT("(GLsizei n = %d, GLuint* ids = 0x%0.8p)", n, ids);
2872
2873 try
2874 {
2875 if (n < 0)
2876 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002877 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00002878 }
2879
2880 gl::Context *context = gl::getNonLostContext();
2881
2882 if (context)
2883 {
2884 for (int i = 0; i < n; i++)
2885 {
2886 ids[i] = context->createQuery();
2887 }
2888 }
2889 }
2890 catch(std::bad_alloc&)
2891 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002892 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00002893 }
2894}
2895
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002896void __stdcall glGenRenderbuffers(GLsizei n, GLuint* renderbuffers)
2897{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002898 EVENT("(GLsizei n = %d, GLuint* renderbuffers = 0x%0.8p)", n, renderbuffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002899
2900 try
2901 {
2902 if (n < 0)
2903 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002904 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002905 }
2906
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002907 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002908
2909 if (context)
2910 {
2911 for (int i = 0; i < n; i++)
2912 {
2913 renderbuffers[i] = context->createRenderbuffer();
2914 }
2915 }
2916 }
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 glGenTextures(GLsizei n, GLuint* textures)
2924{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002925 EVENT("(GLsizei n = %d, GLuint* textures = 0x%0.8p)", n, textures);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002926
2927 try
2928 {
2929 if (n < 0)
2930 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002931 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002932 }
2933
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002934 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002935
2936 if (context)
2937 {
2938 for (int i = 0; i < n; i++)
2939 {
2940 textures[i] = context->createTexture();
2941 }
2942 }
2943 }
2944 catch(std::bad_alloc&)
2945 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002946 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002947 }
2948}
2949
daniel@transgaming.com85423182010-04-22 13:35:27 +00002950void __stdcall glGetActiveAttrib(GLuint program, GLuint index, GLsizei bufsize, GLsizei *length, GLint *size, GLenum *type, GLchar *name)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002951{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002952 EVENT("(GLuint program = %d, GLuint index = %d, GLsizei bufsize = %d, GLsizei *length = 0x%0.8p, "
daniel@transgaming.com85423182010-04-22 13:35:27 +00002953 "GLint *size = 0x%0.8p, GLenum *type = %0.8p, GLchar *name = %0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002954 program, index, bufsize, length, size, type, name);
2955
2956 try
2957 {
2958 if (bufsize < 0)
2959 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002960 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002961 }
2962
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002963 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com85423182010-04-22 13:35:27 +00002964
2965 if (context)
2966 {
2967 gl::Program *programObject = context->getProgram(program);
2968
2969 if (!programObject)
2970 {
2971 if (context->getShader(program))
2972 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002973 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com85423182010-04-22 13:35:27 +00002974 }
2975 else
2976 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002977 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com85423182010-04-22 13:35:27 +00002978 }
2979 }
2980
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00002981 if (index >= (GLuint)programObject->getActiveAttributeCount())
daniel@transgaming.com85423182010-04-22 13:35:27 +00002982 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002983 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com85423182010-04-22 13:35:27 +00002984 }
2985
2986 programObject->getActiveAttribute(index, bufsize, length, size, type, name);
2987 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002988 }
2989 catch(std::bad_alloc&)
2990 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002991 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002992 }
2993}
2994
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00002995void __stdcall glGetActiveUniform(GLuint program, GLuint index, GLsizei bufsize, GLsizei* length, GLint* size, GLenum* type, GLchar* name)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002996{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002997 EVENT("(GLuint program = %d, GLuint index = %d, GLsizei bufsize = %d, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00002998 "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 +00002999 program, index, bufsize, length, size, type, name);
3000
3001 try
3002 {
3003 if (bufsize < 0)
3004 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003005 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003006 }
3007
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003008 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00003009
3010 if (context)
3011 {
3012 gl::Program *programObject = context->getProgram(program);
3013
3014 if (!programObject)
3015 {
3016 if (context->getShader(program))
3017 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003018 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00003019 }
3020 else
3021 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003022 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00003023 }
3024 }
3025
3026 if (index >= (GLuint)programObject->getActiveUniformCount())
3027 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003028 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00003029 }
3030
3031 programObject->getActiveUniform(index, bufsize, length, size, type, name);
3032 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003033 }
3034 catch(std::bad_alloc&)
3035 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003036 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003037 }
3038}
3039
3040void __stdcall glGetAttachedShaders(GLuint program, GLsizei maxcount, GLsizei* count, GLuint* shaders)
3041{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003042 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 +00003043 program, maxcount, count, shaders);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003044
3045 try
3046 {
3047 if (maxcount < 0)
3048 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003049 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003050 }
3051
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003052 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com6c785212010-03-30 03:36:17 +00003053
3054 if (context)
3055 {
3056 gl::Program *programObject = context->getProgram(program);
3057
3058 if (!programObject)
3059 {
daniel@transgaming.com23953e32010-04-13 19:53:31 +00003060 if (context->getShader(program))
3061 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003062 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com23953e32010-04-13 19:53:31 +00003063 }
3064 else
3065 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003066 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com23953e32010-04-13 19:53:31 +00003067 }
daniel@transgaming.com6c785212010-03-30 03:36:17 +00003068 }
3069
3070 return programObject->getAttachedShaders(maxcount, count, shaders);
3071 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003072 }
3073 catch(std::bad_alloc&)
3074 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003075 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003076 }
3077}
3078
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00003079int __stdcall glGetAttribLocation(GLuint program, const GLchar* name)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003080{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003081 EVENT("(GLuint program = %d, const GLchar* name = %s)", program, name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003082
3083 try
3084 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003085 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003086
3087 if (context)
3088 {
daniel@transgaming.combb274c32010-04-13 03:26:21 +00003089
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003090 gl::Program *programObject = context->getProgram(program);
3091
3092 if (!programObject)
3093 {
daniel@transgaming.combb274c32010-04-13 03:26:21 +00003094 if (context->getShader(program))
3095 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003096 return gl::error(GL_INVALID_OPERATION, -1);
daniel@transgaming.combb274c32010-04-13 03:26:21 +00003097 }
3098 else
3099 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003100 return gl::error(GL_INVALID_VALUE, -1);
daniel@transgaming.combb274c32010-04-13 03:26:21 +00003101 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003102 }
3103
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003104 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
daniel@transgaming.com716056c2012-07-24 18:38:59 +00003105 if (!programObject->isLinked() || !programBinary)
daniel@transgaming.comcf4aa872010-04-13 03:26:27 +00003106 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003107 return gl::error(GL_INVALID_OPERATION, -1);
daniel@transgaming.comcf4aa872010-04-13 03:26:27 +00003108 }
3109
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003110 return programBinary->getAttributeLocation(name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003111 }
3112 }
3113 catch(std::bad_alloc&)
3114 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003115 return gl::error(GL_OUT_OF_MEMORY, -1);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003116 }
3117
3118 return -1;
3119}
3120
3121void __stdcall glGetBooleanv(GLenum pname, GLboolean* params)
3122{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003123 EVENT("(GLenum pname = 0x%X, GLboolean* params = 0x%0.8p)", pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003124
3125 try
3126 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003127 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003128
3129 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003130 {
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003131 if (!(context->getBooleanv(pname, params)))
3132 {
3133 GLenum nativeType;
3134 unsigned int numParams = 0;
3135 if (!context->getQueryParameterInfo(pname, &nativeType, &numParams))
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003136 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003137
3138 if (numParams == 0)
3139 return; // it is known that the pname is valid, but there are no parameters to return
3140
3141 if (nativeType == GL_FLOAT)
3142 {
3143 GLfloat *floatParams = NULL;
3144 floatParams = new GLfloat[numParams];
3145
3146 context->getFloatv(pname, floatParams);
3147
3148 for (unsigned int i = 0; i < numParams; ++i)
3149 {
3150 if (floatParams[i] == 0.0f)
3151 params[i] = GL_FALSE;
3152 else
3153 params[i] = GL_TRUE;
3154 }
3155
3156 delete [] floatParams;
3157 }
3158 else if (nativeType == GL_INT)
3159 {
3160 GLint *intParams = NULL;
3161 intParams = new GLint[numParams];
3162
3163 context->getIntegerv(pname, intParams);
3164
3165 for (unsigned int i = 0; i < numParams; ++i)
3166 {
3167 if (intParams[i] == 0)
3168 params[i] = GL_FALSE;
3169 else
3170 params[i] = GL_TRUE;
3171 }
3172
3173 delete [] intParams;
3174 }
3175 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003176 }
3177 }
3178 catch(std::bad_alloc&)
3179 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003180 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003181 }
3182}
3183
3184void __stdcall glGetBufferParameteriv(GLenum target, GLenum pname, GLint* params)
3185{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003186 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 +00003187
3188 try
3189 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003190 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comaa0ccbd2010-04-15 20:45:05 +00003191
3192 if (context)
3193 {
3194 gl::Buffer *buffer;
3195
3196 switch (target)
3197 {
3198 case GL_ARRAY_BUFFER:
3199 buffer = context->getArrayBuffer();
3200 break;
3201 case GL_ELEMENT_ARRAY_BUFFER:
3202 buffer = context->getElementArrayBuffer();
3203 break;
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003204 default: return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comaa0ccbd2010-04-15 20:45:05 +00003205 }
3206
3207 if (!buffer)
3208 {
3209 // A null buffer means that "0" is bound to the requested buffer target
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003210 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comaa0ccbd2010-04-15 20:45:05 +00003211 }
3212
3213 switch (pname)
3214 {
3215 case GL_BUFFER_USAGE:
3216 *params = buffer->usage();
3217 break;
3218 case GL_BUFFER_SIZE:
3219 *params = buffer->size();
3220 break;
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003221 default: return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comaa0ccbd2010-04-15 20:45:05 +00003222 }
3223 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003224 }
3225 catch(std::bad_alloc&)
3226 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003227 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003228 }
3229}
3230
3231GLenum __stdcall glGetError(void)
3232{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003233 EVENT("()");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003234
3235 gl::Context *context = gl::getContext();
3236
3237 if (context)
3238 {
daniel@transgaming.com82b28912011-12-12 21:01:35 +00003239 return context->getError();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003240 }
3241
3242 return GL_NO_ERROR;
3243}
3244
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00003245void __stdcall glGetFenceivNV(GLuint fence, GLenum pname, GLint *params)
3246{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003247 EVENT("(GLuint fence = %d, GLenum pname = 0x%X, GLint *params = 0x%0.8p)", fence, pname, params);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00003248
3249 try
3250 {
3251
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003252 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00003253
3254 if (context)
3255 {
3256 gl::Fence *fenceObject = context->getFence(fence);
3257
3258 if (fenceObject == NULL)
3259 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003260 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00003261 }
3262
3263 fenceObject->getFenceiv(pname, params);
3264 }
3265 }
3266 catch(std::bad_alloc&)
3267 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003268 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00003269 }
3270}
3271
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003272void __stdcall glGetFloatv(GLenum pname, GLfloat* params)
3273{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003274 EVENT("(GLenum pname = 0x%X, GLfloat* params = 0x%0.8p)", pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003275
3276 try
3277 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003278 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com32e58cd2010-03-24 09:44:10 +00003279
3280 if (context)
3281 {
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003282 if (!(context->getFloatv(pname, params)))
daniel@transgaming.com32e58cd2010-03-24 09:44:10 +00003283 {
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003284 GLenum nativeType;
3285 unsigned int numParams = 0;
3286 if (!context->getQueryParameterInfo(pname, &nativeType, &numParams))
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003287 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003288
3289 if (numParams == 0)
3290 return; // it is known that the pname is valid, but that there are no parameters to return.
3291
3292 if (nativeType == GL_BOOL)
3293 {
3294 GLboolean *boolParams = NULL;
3295 boolParams = new GLboolean[numParams];
3296
3297 context->getBooleanv(pname, boolParams);
3298
3299 for (unsigned int i = 0; i < numParams; ++i)
3300 {
3301 if (boolParams[i] == GL_FALSE)
3302 params[i] = 0.0f;
3303 else
3304 params[i] = 1.0f;
3305 }
3306
3307 delete [] boolParams;
3308 }
3309 else if (nativeType == GL_INT)
3310 {
3311 GLint *intParams = NULL;
3312 intParams = new GLint[numParams];
3313
3314 context->getIntegerv(pname, intParams);
3315
3316 for (unsigned int i = 0; i < numParams; ++i)
3317 {
3318 params[i] = (GLfloat)intParams[i];
3319 }
3320
3321 delete [] intParams;
3322 }
daniel@transgaming.com32e58cd2010-03-24 09:44:10 +00003323 }
3324 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003325 }
3326 catch(std::bad_alloc&)
3327 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003328 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003329 }
3330}
3331
3332void __stdcall glGetFramebufferAttachmentParameteriv(GLenum target, GLenum attachment, GLenum pname, GLint* params)
3333{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003334 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 +00003335 target, attachment, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003336
3337 try
3338 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003339 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003340
3341 if (context)
3342 {
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00003343 if (target != GL_FRAMEBUFFER && target != GL_DRAW_FRAMEBUFFER_ANGLE && target != GL_READ_FRAMEBUFFER_ANGLE)
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003344 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003345 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003346 }
3347
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00003348 gl::Framebuffer *framebuffer = NULL;
3349 if (target == GL_READ_FRAMEBUFFER_ANGLE)
3350 {
3351 if(context->getReadFramebufferHandle() == 0)
3352 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003353 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00003354 }
3355
3356 framebuffer = context->getReadFramebuffer();
3357 }
3358 else
3359 {
3360 if (context->getDrawFramebufferHandle() == 0)
3361 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003362 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00003363 }
3364
3365 framebuffer = context->getDrawFramebuffer();
3366 }
3367
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003368 GLenum attachmentType;
3369 GLuint attachmentHandle;
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00003370
3371 if (attachment >= GL_COLOR_ATTACHMENT0_EXT && attachment <= GL_COLOR_ATTACHMENT15_EXT)
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003372 {
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00003373 const unsigned int colorAttachment = (attachment - GL_COLOR_ATTACHMENT0_EXT);
3374
3375 if (colorAttachment >= context->getMaximumRenderTargets())
3376 {
3377 return gl::error(GL_INVALID_ENUM);
3378 }
3379
3380 attachmentType = framebuffer->getColorbufferType(colorAttachment);
3381 attachmentHandle = framebuffer->getColorbufferHandle(colorAttachment);
3382 }
3383 else
3384 {
3385 switch (attachment)
3386 {
3387 case GL_DEPTH_ATTACHMENT:
3388 attachmentType = framebuffer->getDepthbufferType();
3389 attachmentHandle = framebuffer->getDepthbufferHandle();
3390 break;
3391 case GL_STENCIL_ATTACHMENT:
3392 attachmentType = framebuffer->getStencilbufferType();
3393 attachmentHandle = framebuffer->getStencilbufferHandle();
3394 break;
3395 default: return gl::error(GL_INVALID_ENUM);
3396 }
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003397 }
3398
3399 GLenum attachmentObjectType; // Type category
daniel@transgaming.comfbc09532010-04-26 15:33:41 +00003400 if (attachmentType == GL_NONE || attachmentType == GL_RENDERBUFFER)
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003401 {
3402 attachmentObjectType = attachmentType;
3403 }
apatrick@chromium.org551022e2012-01-23 19:56:54 +00003404 else if (gl::IsInternalTextureTarget(attachmentType))
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003405 {
3406 attachmentObjectType = GL_TEXTURE;
3407 }
apatrick@chromium.orga1d80592012-01-25 21:52:10 +00003408 else
3409 {
3410 UNREACHABLE();
3411 return;
3412 }
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003413
3414 switch (pname)
3415 {
3416 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE:
3417 *params = attachmentObjectType;
3418 break;
3419 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME:
3420 if (attachmentObjectType == GL_RENDERBUFFER || attachmentObjectType == GL_TEXTURE)
3421 {
3422 *params = attachmentHandle;
3423 }
3424 else
3425 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003426 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003427 }
3428 break;
3429 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL:
3430 if (attachmentObjectType == GL_TEXTURE)
3431 {
3432 *params = 0; // FramebufferTexture2D will not allow level to be set to anything else in GL ES 2.0
3433 }
3434 else
3435 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003436 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003437 }
3438 break;
3439 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE:
3440 if (attachmentObjectType == GL_TEXTURE)
3441 {
daniel@transgaming.com19ffc242010-05-04 03:35:21 +00003442 if (gl::IsCubemapTextureTarget(attachmentType))
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003443 {
3444 *params = attachmentType;
3445 }
3446 else
3447 {
3448 *params = 0;
3449 }
3450 }
3451 else
3452 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003453 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003454 }
3455 break;
3456 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003457 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003458 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003459 }
3460 }
3461 catch(std::bad_alloc&)
3462 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003463 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003464 }
3465}
3466
daniel@transgaming.com17f548c2011-11-09 17:47:02 +00003467GLenum __stdcall glGetGraphicsResetStatusEXT(void)
3468{
3469 EVENT("()");
3470
3471 try
3472 {
3473 gl::Context *context = gl::getContext();
3474
3475 if (context)
3476 {
3477 return context->getResetStatus();
3478 }
3479
3480 return GL_NO_ERROR;
3481 }
3482 catch(std::bad_alloc&)
3483 {
3484 return GL_OUT_OF_MEMORY;
3485 }
3486}
3487
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003488void __stdcall glGetIntegerv(GLenum pname, GLint* params)
3489{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003490 EVENT("(GLenum pname = 0x%X, GLint* params = 0x%0.8p)", pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003491
3492 try
3493 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003494 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003495
3496 if (context)
3497 {
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003498 if (!(context->getIntegerv(pname, params)))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003499 {
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003500 GLenum nativeType;
3501 unsigned int numParams = 0;
3502 if (!context->getQueryParameterInfo(pname, &nativeType, &numParams))
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003503 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003504
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003505 if (numParams == 0)
3506 return; // it is known that pname is valid, but there are no parameters to return
3507
3508 if (nativeType == GL_BOOL)
3509 {
3510 GLboolean *boolParams = NULL;
3511 boolParams = new GLboolean[numParams];
3512
3513 context->getBooleanv(pname, boolParams);
3514
3515 for (unsigned int i = 0; i < numParams; ++i)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003516 {
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003517 if (boolParams[i] == GL_FALSE)
3518 params[i] = 0;
3519 else
3520 params[i] = 1;
3521 }
3522
3523 delete [] boolParams;
3524 }
3525 else if (nativeType == GL_FLOAT)
3526 {
3527 GLfloat *floatParams = NULL;
3528 floatParams = new GLfloat[numParams];
3529
3530 context->getFloatv(pname, floatParams);
3531
3532 for (unsigned int i = 0; i < numParams; ++i)
3533 {
daniel@transgaming.comc1641352010-04-26 15:33:36 +00003534 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 +00003535 {
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003536 params[i] = (GLint)(((GLfloat)(0xFFFFFFFF) * floatParams[i] - 1.0f) / 2.0f);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003537 }
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003538 else
3539 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 +00003540 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003541
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003542 delete [] floatParams;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003543 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003544 }
3545 }
3546 }
3547 catch(std::bad_alloc&)
3548 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003549 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003550 }
3551}
3552
3553void __stdcall glGetProgramiv(GLuint program, GLenum pname, GLint* params)
3554{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003555 EVENT("(GLuint program = %d, GLenum pname = %d, GLint* params = 0x%0.8p)", program, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003556
3557 try
3558 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003559 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003560
3561 if (context)
3562 {
3563 gl::Program *programObject = context->getProgram(program);
3564
3565 if (!programObject)
3566 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003567 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003568 }
3569
3570 switch (pname)
3571 {
3572 case GL_DELETE_STATUS:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003573 *params = programObject->isFlaggedForDeletion();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003574 return;
3575 case GL_LINK_STATUS:
daniel@transgaming.com716056c2012-07-24 18:38:59 +00003576 *params = programObject->isLinked();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003577 return;
3578 case GL_VALIDATE_STATUS:
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00003579 *params = programObject->isValidated();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003580 return;
3581 case GL_INFO_LOG_LENGTH:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003582 *params = programObject->getInfoLogLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003583 return;
3584 case GL_ATTACHED_SHADERS:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003585 *params = programObject->getAttachedShadersCount();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003586 return;
3587 case GL_ACTIVE_ATTRIBUTES:
daniel@transgaming.com85423182010-04-22 13:35:27 +00003588 *params = programObject->getActiveAttributeCount();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003589 return;
3590 case GL_ACTIVE_ATTRIBUTE_MAX_LENGTH:
daniel@transgaming.com85423182010-04-22 13:35:27 +00003591 *params = programObject->getActiveAttributeMaxLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003592 return;
3593 case GL_ACTIVE_UNIFORMS:
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00003594 *params = programObject->getActiveUniformCount();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003595 return;
3596 case GL_ACTIVE_UNIFORM_MAX_LENGTH:
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00003597 *params = programObject->getActiveUniformMaxLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003598 return;
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00003599 case GL_PROGRAM_BINARY_LENGTH_OES:
apatrick@chromium.org90080e32012-07-09 22:15:33 +00003600 *params = programObject->getProgramBinaryLength();
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00003601 return;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003602 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003603 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003604 }
3605 }
3606 }
3607 catch(std::bad_alloc&)
3608 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003609 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003610 }
3611}
3612
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00003613void __stdcall glGetProgramInfoLog(GLuint program, GLsizei bufsize, GLsizei* length, GLchar* infolog)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003614{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003615 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 +00003616 program, bufsize, length, infolog);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003617
3618 try
3619 {
3620 if (bufsize < 0)
3621 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003622 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003623 }
3624
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003625 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003626
3627 if (context)
3628 {
3629 gl::Program *programObject = context->getProgram(program);
3630
3631 if (!programObject)
3632 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003633 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003634 }
3635
3636 programObject->getInfoLog(bufsize, length, infolog);
3637 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003638 }
3639 catch(std::bad_alloc&)
3640 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003641 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003642 }
3643}
3644
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003645void __stdcall glGetQueryivEXT(GLenum target, GLenum pname, GLint *params)
3646{
3647 EVENT("GLenum target = 0x%X, GLenum pname = 0x%X, GLint *params = 0x%0.8p)", target, pname, params);
3648
3649 try
3650 {
3651 switch (pname)
3652 {
3653 case GL_CURRENT_QUERY_EXT:
3654 break;
3655 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003656 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003657 }
3658
3659 gl::Context *context = gl::getNonLostContext();
3660
3661 if (context)
3662 {
3663 params[0] = context->getActiveQuery(target);
3664 }
3665 }
3666 catch(std::bad_alloc&)
3667 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003668 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003669 }
3670}
3671
3672void __stdcall glGetQueryObjectuivEXT(GLuint id, GLenum pname, GLuint *params)
3673{
3674 EVENT("(GLuint id = %d, GLenum pname = 0x%X, GLuint *params = 0x%0.8p)", id, pname, params);
3675
3676 try
3677 {
3678 switch (pname)
3679 {
3680 case GL_QUERY_RESULT_EXT:
3681 case GL_QUERY_RESULT_AVAILABLE_EXT:
3682 break;
3683 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003684 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003685 }
3686 gl::Context *context = gl::getNonLostContext();
3687
3688 if (context)
3689 {
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003690 gl::Query *queryObject = context->getQuery(id, false, GL_NONE);
3691
3692 if (!queryObject)
3693 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003694 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003695 }
3696
3697 if (context->getActiveQuery(queryObject->getType()) == id)
3698 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003699 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003700 }
3701
3702 switch(pname)
3703 {
3704 case GL_QUERY_RESULT_EXT:
3705 params[0] = queryObject->getResult();
3706 break;
3707 case GL_QUERY_RESULT_AVAILABLE_EXT:
3708 params[0] = queryObject->isResultAvailable();
3709 break;
3710 default:
3711 ASSERT(false);
3712 }
3713 }
3714 }
3715 catch(std::bad_alloc&)
3716 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003717 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003718 }
3719}
3720
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003721void __stdcall glGetRenderbufferParameteriv(GLenum target, GLenum pname, GLint* params)
3722{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003723 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 +00003724
3725 try
3726 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003727 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003728
3729 if (context)
3730 {
3731 if (target != GL_RENDERBUFFER)
3732 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003733 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003734 }
3735
daniel@transgaming.com428d1582010-05-04 03:35:25 +00003736 if (context->getRenderbufferHandle() == 0)
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003737 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003738 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003739 }
3740
daniel@transgaming.com428d1582010-05-04 03:35:25 +00003741 gl::Renderbuffer *renderbuffer = context->getRenderbuffer(context->getRenderbufferHandle());
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003742
3743 switch (pname)
3744 {
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +00003745 case GL_RENDERBUFFER_WIDTH: *params = renderbuffer->getWidth(); break;
3746 case GL_RENDERBUFFER_HEIGHT: *params = renderbuffer->getHeight(); break;
3747 case GL_RENDERBUFFER_INTERNAL_FORMAT: *params = renderbuffer->getInternalFormat(); break;
3748 case GL_RENDERBUFFER_RED_SIZE: *params = renderbuffer->getRedSize(); break;
3749 case GL_RENDERBUFFER_GREEN_SIZE: *params = renderbuffer->getGreenSize(); break;
3750 case GL_RENDERBUFFER_BLUE_SIZE: *params = renderbuffer->getBlueSize(); break;
3751 case GL_RENDERBUFFER_ALPHA_SIZE: *params = renderbuffer->getAlphaSize(); break;
3752 case GL_RENDERBUFFER_DEPTH_SIZE: *params = renderbuffer->getDepthSize(); break;
3753 case GL_RENDERBUFFER_STENCIL_SIZE: *params = renderbuffer->getStencilSize(); break;
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00003754 case GL_RENDERBUFFER_SAMPLES_ANGLE:
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +00003755 if (context->getMaxSupportedSamples() != 0)
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00003756 {
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +00003757 *params = renderbuffer->getSamples();
3758 }
3759 else
3760 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003761 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00003762 }
3763 break;
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003764 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003765 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003766 }
3767 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003768 }
3769 catch(std::bad_alloc&)
3770 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003771 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003772 }
3773}
3774
3775void __stdcall glGetShaderiv(GLuint shader, GLenum pname, GLint* params)
3776{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003777 EVENT("(GLuint shader = %d, GLenum pname = %d, GLint* params = 0x%0.8p)", shader, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003778
3779 try
3780 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003781 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003782
3783 if (context)
3784 {
3785 gl::Shader *shaderObject = context->getShader(shader);
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00003786
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003787 if (!shaderObject)
3788 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003789 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003790 }
3791
3792 switch (pname)
3793 {
3794 case GL_SHADER_TYPE:
3795 *params = shaderObject->getType();
3796 return;
3797 case GL_DELETE_STATUS:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003798 *params = shaderObject->isFlaggedForDeletion();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003799 return;
3800 case GL_COMPILE_STATUS:
3801 *params = shaderObject->isCompiled() ? GL_TRUE : GL_FALSE;
3802 return;
3803 case GL_INFO_LOG_LENGTH:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003804 *params = shaderObject->getInfoLogLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003805 return;
3806 case GL_SHADER_SOURCE_LENGTH:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003807 *params = shaderObject->getSourceLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003808 return;
zmo@google.coma574f782011-10-03 21:45:23 +00003809 case GL_TRANSLATED_SHADER_SOURCE_LENGTH_ANGLE:
3810 *params = shaderObject->getTranslatedSourceLength();
3811 return;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003812 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003813 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003814 }
3815 }
3816 }
3817 catch(std::bad_alloc&)
3818 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003819 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003820 }
3821}
3822
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00003823void __stdcall glGetShaderInfoLog(GLuint shader, GLsizei bufsize, GLsizei* length, GLchar* infolog)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003824{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003825 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 +00003826 shader, bufsize, length, infolog);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003827
3828 try
3829 {
3830 if (bufsize < 0)
3831 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003832 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003833 }
3834
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003835 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003836
3837 if (context)
3838 {
3839 gl::Shader *shaderObject = context->getShader(shader);
3840
3841 if (!shaderObject)
3842 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003843 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003844 }
3845
3846 shaderObject->getInfoLog(bufsize, length, infolog);
3847 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003848 }
3849 catch(std::bad_alloc&)
3850 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003851 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003852 }
3853}
3854
3855void __stdcall glGetShaderPrecisionFormat(GLenum shadertype, GLenum precisiontype, GLint* range, GLint* precision)
3856{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003857 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 +00003858 shadertype, precisiontype, range, precision);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003859
3860 try
3861 {
daniel@transgaming.com6c785212010-03-30 03:36:17 +00003862 switch (shadertype)
3863 {
3864 case GL_VERTEX_SHADER:
3865 case GL_FRAGMENT_SHADER:
3866 break;
3867 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003868 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com6c785212010-03-30 03:36:17 +00003869 }
3870
3871 switch (precisiontype)
3872 {
3873 case GL_LOW_FLOAT:
3874 case GL_MEDIUM_FLOAT:
3875 case GL_HIGH_FLOAT:
3876 // Assume IEEE 754 precision
3877 range[0] = 127;
3878 range[1] = 127;
daniel@transgaming.comc5c15382010-04-23 18:34:49 +00003879 *precision = 23;
daniel@transgaming.com6c785212010-03-30 03:36:17 +00003880 break;
3881 case GL_LOW_INT:
3882 case GL_MEDIUM_INT:
3883 case GL_HIGH_INT:
3884 // Some (most) hardware only supports single-precision floating-point numbers,
3885 // which can accurately represent integers up to +/-16777216
3886 range[0] = 24;
3887 range[1] = 24;
daniel@transgaming.comc5c15382010-04-23 18:34:49 +00003888 *precision = 0;
daniel@transgaming.com6c785212010-03-30 03:36:17 +00003889 break;
3890 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003891 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com6c785212010-03-30 03:36:17 +00003892 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003893 }
3894 catch(std::bad_alloc&)
3895 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003896 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003897 }
3898}
3899
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00003900void __stdcall glGetShaderSource(GLuint shader, GLsizei bufsize, GLsizei* length, GLchar* source)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003901{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003902 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 +00003903 shader, bufsize, length, source);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003904
3905 try
3906 {
3907 if (bufsize < 0)
3908 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003909 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003910 }
3911
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003912 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003913
3914 if (context)
3915 {
3916 gl::Shader *shaderObject = context->getShader(shader);
3917
3918 if (!shaderObject)
3919 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003920 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003921 }
3922
3923 shaderObject->getSource(bufsize, length, source);
3924 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003925 }
3926 catch(std::bad_alloc&)
3927 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003928 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003929 }
3930}
3931
zmo@google.coma574f782011-10-03 21:45:23 +00003932void __stdcall glGetTranslatedShaderSourceANGLE(GLuint shader, GLsizei bufsize, GLsizei* length, GLchar* source)
3933{
3934 EVENT("(GLuint shader = %d, GLsizei bufsize = %d, GLsizei* length = 0x%0.8p, GLchar* source = 0x%0.8p)",
3935 shader, bufsize, length, source);
3936
3937 try
3938 {
3939 if (bufsize < 0)
3940 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003941 return gl::error(GL_INVALID_VALUE);
zmo@google.coma574f782011-10-03 21:45:23 +00003942 }
3943
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003944 gl::Context *context = gl::getNonLostContext();
zmo@google.coma574f782011-10-03 21:45:23 +00003945
3946 if (context)
3947 {
3948 gl::Shader *shaderObject = context->getShader(shader);
3949
3950 if (!shaderObject)
3951 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003952 return gl::error(GL_INVALID_OPERATION);
zmo@google.coma574f782011-10-03 21:45:23 +00003953 }
3954
3955 shaderObject->getTranslatedSource(bufsize, length, source);
3956 }
3957 }
3958 catch(std::bad_alloc&)
3959 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003960 return gl::error(GL_OUT_OF_MEMORY);
zmo@google.coma574f782011-10-03 21:45:23 +00003961 }
3962}
3963
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003964const GLubyte* __stdcall glGetString(GLenum name)
3965{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003966 EVENT("(GLenum name = 0x%X)", name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003967
3968 try
3969 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003970 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com3e4c6002010-05-05 18:50:13 +00003971
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003972 switch (name)
3973 {
3974 case GL_VENDOR:
daniel@transgaming.coma0ce7e62011-01-25 14:47:16 +00003975 return (GLubyte*)"Google Inc.";
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003976 case GL_RENDERER:
daniel@transgaming.comc23ff642011-08-16 20:28:45 +00003977 return (GLubyte*)((context != NULL) ? context->getRendererString() : "ANGLE");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003978 case GL_VERSION:
daniel@transgaming.com1825d8e2012-08-27 16:25:29 +00003979 return (GLubyte*)"OpenGL ES 2.0 (ANGLE " VERSION_STRING ")";
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003980 case GL_SHADING_LANGUAGE_VERSION:
daniel@transgaming.com1825d8e2012-08-27 16:25:29 +00003981 return (GLubyte*)"OpenGL ES GLSL ES 1.00 (ANGLE " VERSION_STRING ")";
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003982 case GL_EXTENSIONS:
daniel@transgaming.com3e4c6002010-05-05 18:50:13 +00003983 return (GLubyte*)((context != NULL) ? context->getExtensionString() : "");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003984 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003985 return gl::error(GL_INVALID_ENUM, (GLubyte*)NULL);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003986 }
3987 }
3988 catch(std::bad_alloc&)
3989 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003990 return gl::error(GL_OUT_OF_MEMORY, (GLubyte*)NULL);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003991 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003992}
3993
3994void __stdcall glGetTexParameterfv(GLenum target, GLenum pname, GLfloat* params)
3995{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003996 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 +00003997
3998 try
3999 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004000 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00004001
4002 if (context)
4003 {
4004 gl::Texture *texture;
4005
4006 switch (target)
4007 {
4008 case GL_TEXTURE_2D:
4009 texture = context->getTexture2D();
4010 break;
4011 case GL_TEXTURE_CUBE_MAP:
4012 texture = context->getTextureCubeMap();
4013 break;
4014 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004015 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00004016 }
4017
4018 switch (pname)
4019 {
4020 case GL_TEXTURE_MAG_FILTER:
4021 *params = (GLfloat)texture->getMagFilter();
4022 break;
4023 case GL_TEXTURE_MIN_FILTER:
4024 *params = (GLfloat)texture->getMinFilter();
4025 break;
4026 case GL_TEXTURE_WRAP_S:
4027 *params = (GLfloat)texture->getWrapS();
4028 break;
4029 case GL_TEXTURE_WRAP_T:
4030 *params = (GLfloat)texture->getWrapT();
4031 break;
shannon.woods%transgaming.com@gtempaccount.com0b3a8df2013-04-13 03:44:51 +00004032 case GL_TEXTURE_WRAP_R:
4033 if (context->getClientVersion() < 3)
4034 {
4035 return gl::error(GL_INVALID_ENUM);
4036 }
4037 *params = (GLfloat)texture->getWrapR();
4038 break;
daniel@transgaming.comd30bd0a2011-11-11 04:10:34 +00004039 case GL_TEXTURE_IMMUTABLE_FORMAT_EXT:
4040 *params = (GLfloat)(texture->isImmutable() ? GL_TRUE : GL_FALSE);
4041 break;
daniel@transgaming.com7d18c172011-11-11 04:18:21 +00004042 case GL_TEXTURE_USAGE_ANGLE:
4043 *params = (GLfloat)texture->getUsage();
4044 break;
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00004045 case GL_TEXTURE_MAX_ANISOTROPY_EXT:
4046 if (!context->supportsTextureFilterAnisotropy())
4047 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004048 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00004049 }
4050 *params = (GLfloat)texture->getMaxAnisotropy();
4051 break;
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00004052 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004053 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00004054 }
4055 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004056 }
4057 catch(std::bad_alloc&)
4058 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004059 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004060 }
4061}
4062
4063void __stdcall glGetTexParameteriv(GLenum target, GLenum pname, GLint* params)
4064{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004065 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 +00004066
4067 try
4068 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004069 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00004070
4071 if (context)
4072 {
4073 gl::Texture *texture;
4074
4075 switch (target)
4076 {
4077 case GL_TEXTURE_2D:
4078 texture = context->getTexture2D();
4079 break;
4080 case GL_TEXTURE_CUBE_MAP:
4081 texture = context->getTextureCubeMap();
4082 break;
4083 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004084 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00004085 }
4086
4087 switch (pname)
4088 {
4089 case GL_TEXTURE_MAG_FILTER:
4090 *params = texture->getMagFilter();
4091 break;
4092 case GL_TEXTURE_MIN_FILTER:
4093 *params = texture->getMinFilter();
4094 break;
4095 case GL_TEXTURE_WRAP_S:
4096 *params = texture->getWrapS();
4097 break;
4098 case GL_TEXTURE_WRAP_T:
4099 *params = texture->getWrapT();
4100 break;
shannon.woods%transgaming.com@gtempaccount.com0b3a8df2013-04-13 03:44:51 +00004101 case GL_TEXTURE_WRAP_R:
4102 if (context->getClientVersion() < 3)
4103 {
4104 return gl::error(GL_INVALID_ENUM);
4105 }
4106 *params = texture->getWrapR();
4107 break;
daniel@transgaming.comd30bd0a2011-11-11 04:10:34 +00004108 case GL_TEXTURE_IMMUTABLE_FORMAT_EXT:
4109 *params = texture->isImmutable() ? GL_TRUE : GL_FALSE;
4110 break;
daniel@transgaming.com7d18c172011-11-11 04:18:21 +00004111 case GL_TEXTURE_USAGE_ANGLE:
4112 *params = texture->getUsage();
4113 break;
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00004114 case GL_TEXTURE_MAX_ANISOTROPY_EXT:
4115 if (!context->supportsTextureFilterAnisotropy())
4116 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004117 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00004118 }
4119 *params = (GLint)texture->getMaxAnisotropy();
4120 break;
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00004121 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004122 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00004123 }
4124 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004125 }
4126 catch(std::bad_alloc&)
4127 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004128 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004129 }
4130}
4131
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004132void __stdcall glGetnUniformfvEXT(GLuint program, GLint location, GLsizei bufSize, GLfloat* params)
4133{
4134 EVENT("(GLuint program = %d, GLint location = %d, GLsizei bufSize = %d, GLfloat* params = 0x%0.8p)",
4135 program, location, bufSize, params);
4136
4137 try
4138 {
4139 if (bufSize < 0)
4140 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004141 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004142 }
4143
4144 gl::Context *context = gl::getNonLostContext();
4145
4146 if (context)
4147 {
4148 if (program == 0)
4149 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004150 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004151 }
4152
4153 gl::Program *programObject = context->getProgram(program);
4154
daniel@transgaming.com716056c2012-07-24 18:38:59 +00004155 if (!programObject || !programObject->isLinked())
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004156 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004157 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004158 }
4159
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00004160 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
4161 if (!programBinary)
4162 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004163 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00004164 }
4165
4166 if (!programBinary->getUniformfv(location, &bufSize, params))
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004167 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004168 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004169 }
4170 }
4171 }
4172 catch(std::bad_alloc&)
4173 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004174 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004175 }
4176}
4177
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004178void __stdcall glGetUniformfv(GLuint program, GLint location, GLfloat* params)
4179{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004180 EVENT("(GLuint program = %d, GLint location = %d, GLfloat* params = 0x%0.8p)", program, location, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004181
4182 try
4183 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004184 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004185
4186 if (context)
4187 {
4188 if (program == 0)
4189 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004190 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004191 }
4192
4193 gl::Program *programObject = context->getProgram(program);
4194
daniel@transgaming.com716056c2012-07-24 18:38:59 +00004195 if (!programObject || !programObject->isLinked())
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004196 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004197 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004198 }
4199
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00004200 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
4201 if (!programBinary)
4202 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004203 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00004204 }
4205
4206 if (!programBinary->getUniformfv(location, NULL, params))
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004207 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004208 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004209 }
4210 }
4211 }
4212 catch(std::bad_alloc&)
4213 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004214 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004215 }
4216}
4217
4218void __stdcall glGetnUniformivEXT(GLuint program, GLint location, GLsizei bufSize, GLint* params)
4219{
4220 EVENT("(GLuint program = %d, GLint location = %d, GLsizei bufSize = %d, GLint* params = 0x%0.8p)",
4221 program, location, bufSize, params);
4222
4223 try
4224 {
4225 if (bufSize < 0)
4226 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004227 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004228 }
4229
4230 gl::Context *context = gl::getNonLostContext();
4231
4232 if (context)
4233 {
4234 if (program == 0)
4235 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004236 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004237 }
4238
4239 gl::Program *programObject = context->getProgram(program);
4240
daniel@transgaming.com716056c2012-07-24 18:38:59 +00004241 if (!programObject || !programObject->isLinked())
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004242 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004243 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004244 }
4245
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00004246 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
4247 if (!programBinary)
4248 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004249 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00004250 }
4251
4252 if (!programBinary->getUniformiv(location, &bufSize, params))
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004253 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004254 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004255 }
4256 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004257 }
4258 catch(std::bad_alloc&)
4259 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004260 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004261 }
4262}
4263
4264void __stdcall glGetUniformiv(GLuint program, GLint location, GLint* params)
4265{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004266 EVENT("(GLuint program = %d, GLint location = %d, GLint* params = 0x%0.8p)", program, location, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004267
4268 try
4269 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004270 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004271
4272 if (context)
4273 {
4274 if (program == 0)
4275 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004276 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004277 }
4278
4279 gl::Program *programObject = context->getProgram(program);
4280
daniel@transgaming.com716056c2012-07-24 18:38:59 +00004281 if (!programObject || !programObject->isLinked())
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004282 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004283 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004284 }
4285
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00004286 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
4287 if (!programBinary)
4288 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004289 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00004290 }
4291
4292 if (!programBinary->getUniformiv(location, NULL, params))
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004293 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004294 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004295 }
4296 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004297 }
4298 catch(std::bad_alloc&)
4299 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004300 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004301 }
4302}
4303
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00004304int __stdcall glGetUniformLocation(GLuint program, const GLchar* name)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004305{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004306 EVENT("(GLuint program = %d, const GLchar* name = 0x%0.8p)", program, name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004307
4308 try
4309 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004310 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004311
4312 if (strstr(name, "gl_") == name)
4313 {
4314 return -1;
4315 }
4316
4317 if (context)
4318 {
4319 gl::Program *programObject = context->getProgram(program);
4320
4321 if (!programObject)
4322 {
daniel@transgaming.comd1abe5b2010-04-13 19:53:33 +00004323 if (context->getShader(program))
4324 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004325 return gl::error(GL_INVALID_OPERATION, -1);
daniel@transgaming.comd1abe5b2010-04-13 19:53:33 +00004326 }
4327 else
4328 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004329 return gl::error(GL_INVALID_VALUE, -1);
daniel@transgaming.comd1abe5b2010-04-13 19:53:33 +00004330 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004331 }
4332
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00004333 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
daniel@transgaming.com716056c2012-07-24 18:38:59 +00004334 if (!programObject->isLinked() || !programBinary)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004335 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004336 return gl::error(GL_INVALID_OPERATION, -1);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004337 }
4338
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00004339 return programBinary->getUniformLocation(name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004340 }
4341 }
4342 catch(std::bad_alloc&)
4343 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004344 return gl::error(GL_OUT_OF_MEMORY, -1);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004345 }
4346
4347 return -1;
4348}
4349
4350void __stdcall glGetVertexAttribfv(GLuint index, GLenum pname, GLfloat* params)
4351{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004352 EVENT("(GLuint index = %d, GLenum pname = 0x%X, GLfloat* params = 0x%0.8p)", index, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004353
4354 try
4355 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004356 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004357
daniel@transgaming.come0078962010-04-15 20:45:08 +00004358 if (context)
4359 {
4360 if (index >= gl::MAX_VERTEX_ATTRIBS)
4361 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004362 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004363 }
4364
daniel@transgaming.com83921382011-01-08 05:46:00 +00004365 const gl::VertexAttribute &attribState = context->getVertexAttribState(index);
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004366
daniel@transgaming.come0078962010-04-15 20:45:08 +00004367 switch (pname)
4368 {
4369 case GL_VERTEX_ATTRIB_ARRAY_ENABLED:
daniel@transgaming.com83921382011-01-08 05:46:00 +00004370 *params = (GLfloat)(attribState.mArrayEnabled ? GL_TRUE : GL_FALSE);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004371 break;
4372 case GL_VERTEX_ATTRIB_ARRAY_SIZE:
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004373 *params = (GLfloat)attribState.mSize;
daniel@transgaming.come0078962010-04-15 20:45:08 +00004374 break;
4375 case GL_VERTEX_ATTRIB_ARRAY_STRIDE:
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004376 *params = (GLfloat)attribState.mStride;
daniel@transgaming.come0078962010-04-15 20:45:08 +00004377 break;
4378 case GL_VERTEX_ATTRIB_ARRAY_TYPE:
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004379 *params = (GLfloat)attribState.mType;
daniel@transgaming.come0078962010-04-15 20:45:08 +00004380 break;
4381 case GL_VERTEX_ATTRIB_ARRAY_NORMALIZED:
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004382 *params = (GLfloat)(attribState.mNormalized ? GL_TRUE : GL_FALSE);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004383 break;
4384 case GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING:
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +00004385 *params = (GLfloat)attribState.mBoundBuffer.id();
daniel@transgaming.come0078962010-04-15 20:45:08 +00004386 break;
4387 case GL_CURRENT_VERTEX_ATTRIB:
4388 for (int i = 0; i < 4; ++i)
4389 {
shannon.woods%transgaming.com@gtempaccount.com3026dc72013-04-13 03:37:27 +00004390 params[i] = attribState.mCurrentValue.FloatValues[i];
daniel@transgaming.come0078962010-04-15 20:45:08 +00004391 }
4392 break;
shannon.woods%transgaming.com@gtempaccount.com14eb55e2013-04-13 03:35:06 +00004393 case GL_VERTEX_ATTRIB_ARRAY_DIVISOR:
4394 // Don't verify ES3 context because GL_VERTEX_ATTRIB_ARRAY_DIVISOR_ANGLE uses
4395 // the same constant.
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00004396 *params = (GLfloat)attribState.mDivisor;
4397 break;
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004398 default: return gl::error(GL_INVALID_ENUM);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004399 }
4400 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004401 }
4402 catch(std::bad_alloc&)
4403 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004404 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004405 }
4406}
4407
4408void __stdcall glGetVertexAttribiv(GLuint index, GLenum pname, GLint* params)
4409{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004410 EVENT("(GLuint index = %d, GLenum pname = 0x%X, GLint* params = 0x%0.8p)", index, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004411
4412 try
4413 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004414 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004415
daniel@transgaming.come0078962010-04-15 20:45:08 +00004416 if (context)
4417 {
4418 if (index >= gl::MAX_VERTEX_ATTRIBS)
4419 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004420 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004421 }
4422
daniel@transgaming.com83921382011-01-08 05:46:00 +00004423 const gl::VertexAttribute &attribState = context->getVertexAttribState(index);
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004424
daniel@transgaming.come0078962010-04-15 20:45:08 +00004425 switch (pname)
4426 {
4427 case GL_VERTEX_ATTRIB_ARRAY_ENABLED:
daniel@transgaming.com83921382011-01-08 05:46:00 +00004428 *params = (attribState.mArrayEnabled ? GL_TRUE : GL_FALSE);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004429 break;
4430 case GL_VERTEX_ATTRIB_ARRAY_SIZE:
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004431 *params = attribState.mSize;
daniel@transgaming.come0078962010-04-15 20:45:08 +00004432 break;
4433 case GL_VERTEX_ATTRIB_ARRAY_STRIDE:
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004434 *params = attribState.mStride;
daniel@transgaming.come0078962010-04-15 20:45:08 +00004435 break;
4436 case GL_VERTEX_ATTRIB_ARRAY_TYPE:
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004437 *params = attribState.mType;
daniel@transgaming.come0078962010-04-15 20:45:08 +00004438 break;
4439 case GL_VERTEX_ATTRIB_ARRAY_NORMALIZED:
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004440 *params = (attribState.mNormalized ? GL_TRUE : GL_FALSE);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004441 break;
4442 case GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING:
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +00004443 *params = attribState.mBoundBuffer.id();
daniel@transgaming.come0078962010-04-15 20:45:08 +00004444 break;
4445 case GL_CURRENT_VERTEX_ATTRIB:
4446 for (int i = 0; i < 4; ++i)
4447 {
shannon.woods%transgaming.com@gtempaccount.com3026dc72013-04-13 03:37:27 +00004448 float currentValue = attribState.mCurrentValue.FloatValues[i];
daniel@transgaming.come0078962010-04-15 20:45:08 +00004449 params[i] = (GLint)(currentValue > 0.0f ? floor(currentValue + 0.5f) : ceil(currentValue - 0.5f));
4450 }
4451 break;
shannon.woods%transgaming.com@gtempaccount.com14eb55e2013-04-13 03:35:06 +00004452 case GL_VERTEX_ATTRIB_ARRAY_DIVISOR:
4453 // Don't verify ES3 context because GL_VERTEX_ATTRIB_ARRAY_DIVISOR_ANGLE uses
4454 // the same constant.
4455 META_ASSERT(GL_VERTEX_ATTRIB_ARRAY_DIVISOR == GL_VERTEX_ATTRIB_ARRAY_DIVISOR_ANGLE);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00004456 *params = (GLint)attribState.mDivisor;
4457 break;
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004458 default: return gl::error(GL_INVALID_ENUM);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004459 }
4460 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004461 }
4462 catch(std::bad_alloc&)
4463 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004464 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004465 }
4466}
4467
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00004468void __stdcall glGetVertexAttribPointerv(GLuint index, GLenum pname, GLvoid** pointer)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004469{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004470 EVENT("(GLuint index = %d, GLenum pname = 0x%X, GLvoid** pointer = 0x%0.8p)", index, pname, pointer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004471
4472 try
4473 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004474 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004475
daniel@transgaming.come0078962010-04-15 20:45:08 +00004476 if (context)
4477 {
4478 if (index >= gl::MAX_VERTEX_ATTRIBS)
4479 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004480 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004481 }
4482
4483 if (pname != GL_VERTEX_ATTRIB_ARRAY_POINTER)
4484 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004485 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004486 }
4487
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004488 *pointer = const_cast<GLvoid*>(context->getVertexAttribPointer(index));
daniel@transgaming.come0078962010-04-15 20:45:08 +00004489 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004490 }
4491 catch(std::bad_alloc&)
4492 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004493 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004494 }
4495}
4496
4497void __stdcall glHint(GLenum target, GLenum mode)
4498{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004499 EVENT("(GLenum target = 0x%X, GLenum mode = 0x%X)", target, mode);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004500
4501 try
4502 {
alokp@chromium.orgd303ef92010-09-09 17:30:15 +00004503 switch (mode)
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00004504 {
alokp@chromium.orgd303ef92010-09-09 17:30:15 +00004505 case GL_FASTEST:
4506 case GL_NICEST:
4507 case GL_DONT_CARE:
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00004508 break;
4509 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004510 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00004511 }
4512
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004513 gl::Context *context = gl::getNonLostContext();
alokp@chromium.orgd303ef92010-09-09 17:30:15 +00004514 switch (target)
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00004515 {
alokp@chromium.orgd303ef92010-09-09 17:30:15 +00004516 case GL_GENERATE_MIPMAP_HINT:
4517 if (context) context->setGenerateMipmapHint(mode);
4518 break;
4519 case GL_FRAGMENT_SHADER_DERIVATIVE_HINT_OES:
4520 if (context) context->setFragmentShaderDerivativeHint(mode);
4521 break;
4522 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004523 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00004524 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004525 }
4526 catch(std::bad_alloc&)
4527 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004528 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004529 }
4530}
4531
4532GLboolean __stdcall glIsBuffer(GLuint buffer)
4533{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004534 EVENT("(GLuint buffer = %d)", buffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004535
4536 try
4537 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004538 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004539
4540 if (context && buffer)
4541 {
4542 gl::Buffer *bufferObject = context->getBuffer(buffer);
4543
4544 if (bufferObject)
4545 {
4546 return GL_TRUE;
4547 }
4548 }
4549 }
4550 catch(std::bad_alloc&)
4551 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004552 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004553 }
4554
4555 return GL_FALSE;
4556}
4557
4558GLboolean __stdcall glIsEnabled(GLenum cap)
4559{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004560 EVENT("(GLenum cap = 0x%X)", cap);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004561
4562 try
4563 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004564 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004565
4566 if (context)
4567 {
4568 switch (cap)
4569 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004570 case GL_CULL_FACE: return context->isCullFaceEnabled();
4571 case GL_POLYGON_OFFSET_FILL: return context->isPolygonOffsetFillEnabled();
4572 case GL_SAMPLE_ALPHA_TO_COVERAGE: return context->isSampleAlphaToCoverageEnabled();
4573 case GL_SAMPLE_COVERAGE: return context->isSampleCoverageEnabled();
4574 case GL_SCISSOR_TEST: return context->isScissorTestEnabled();
4575 case GL_STENCIL_TEST: return context->isStencilTestEnabled();
4576 case GL_DEPTH_TEST: return context->isDepthTestEnabled();
4577 case GL_BLEND: return context->isBlendEnabled();
4578 case GL_DITHER: return context->isDitherEnabled();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004579 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004580 return gl::error(GL_INVALID_ENUM, false);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004581 }
4582 }
4583 }
4584 catch(std::bad_alloc&)
4585 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004586 return gl::error(GL_OUT_OF_MEMORY, false);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004587 }
4588
4589 return false;
4590}
4591
daniel@transgaming.comfe208882010-09-01 15:47:57 +00004592GLboolean __stdcall glIsFenceNV(GLuint fence)
4593{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004594 EVENT("(GLuint fence = %d)", fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004595
4596 try
4597 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004598 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004599
4600 if (context)
4601 {
4602 gl::Fence *fenceObject = context->getFence(fence);
4603
4604 if (fenceObject == NULL)
4605 {
4606 return GL_FALSE;
4607 }
4608
4609 return fenceObject->isFence();
4610 }
4611 }
4612 catch(std::bad_alloc&)
4613 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004614 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004615 }
4616
4617 return GL_FALSE;
daniel@transgaming.comfe208882010-09-01 15:47:57 +00004618}
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004619
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004620GLboolean __stdcall glIsFramebuffer(GLuint framebuffer)
4621{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004622 EVENT("(GLuint framebuffer = %d)", framebuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004623
4624 try
4625 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004626 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004627
4628 if (context && framebuffer)
4629 {
4630 gl::Framebuffer *framebufferObject = context->getFramebuffer(framebuffer);
4631
4632 if (framebufferObject)
4633 {
4634 return GL_TRUE;
4635 }
4636 }
4637 }
4638 catch(std::bad_alloc&)
4639 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004640 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004641 }
4642
4643 return GL_FALSE;
4644}
4645
4646GLboolean __stdcall glIsProgram(GLuint program)
4647{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004648 EVENT("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004649
4650 try
4651 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004652 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004653
4654 if (context && program)
4655 {
4656 gl::Program *programObject = context->getProgram(program);
4657
4658 if (programObject)
4659 {
4660 return GL_TRUE;
4661 }
4662 }
4663 }
4664 catch(std::bad_alloc&)
4665 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004666 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004667 }
4668
4669 return GL_FALSE;
4670}
4671
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00004672GLboolean __stdcall glIsQueryEXT(GLuint id)
4673{
4674 EVENT("(GLuint id = %d)", id);
4675
4676 try
4677 {
4678 if (id == 0)
4679 {
4680 return GL_FALSE;
4681 }
4682
4683 gl::Context *context = gl::getNonLostContext();
4684
4685 if (context)
4686 {
4687 gl::Query *queryObject = context->getQuery(id, false, GL_NONE);
4688
4689 if (queryObject)
4690 {
4691 return GL_TRUE;
4692 }
4693 }
4694 }
4695 catch(std::bad_alloc&)
4696 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004697 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00004698 }
4699
4700 return GL_FALSE;
4701}
4702
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004703GLboolean __stdcall glIsRenderbuffer(GLuint renderbuffer)
4704{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004705 EVENT("(GLuint renderbuffer = %d)", renderbuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004706
4707 try
4708 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004709 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004710
4711 if (context && renderbuffer)
4712 {
4713 gl::Renderbuffer *renderbufferObject = context->getRenderbuffer(renderbuffer);
4714
4715 if (renderbufferObject)
4716 {
4717 return GL_TRUE;
4718 }
4719 }
4720 }
4721 catch(std::bad_alloc&)
4722 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004723 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004724 }
4725
4726 return GL_FALSE;
4727}
4728
4729GLboolean __stdcall glIsShader(GLuint shader)
4730{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004731 EVENT("(GLuint shader = %d)", shader);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004732
4733 try
4734 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004735 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004736
4737 if (context && shader)
4738 {
4739 gl::Shader *shaderObject = context->getShader(shader);
4740
4741 if (shaderObject)
4742 {
4743 return GL_TRUE;
4744 }
4745 }
4746 }
4747 catch(std::bad_alloc&)
4748 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004749 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004750 }
4751
4752 return GL_FALSE;
4753}
4754
4755GLboolean __stdcall glIsTexture(GLuint texture)
4756{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004757 EVENT("(GLuint texture = %d)", texture);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004758
4759 try
4760 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004761 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004762
4763 if (context && texture)
4764 {
4765 gl::Texture *textureObject = context->getTexture(texture);
4766
4767 if (textureObject)
4768 {
4769 return GL_TRUE;
4770 }
4771 }
4772 }
4773 catch(std::bad_alloc&)
4774 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004775 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004776 }
4777
4778 return GL_FALSE;
4779}
4780
4781void __stdcall glLineWidth(GLfloat width)
4782{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004783 EVENT("(GLfloat width = %f)", width);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004784
4785 try
4786 {
4787 if (width <= 0.0f)
4788 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004789 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004790 }
4791
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004792 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com32e58cd2010-03-24 09:44:10 +00004793
4794 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004795 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004796 context->setLineWidth(width);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004797 }
4798 }
4799 catch(std::bad_alloc&)
4800 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004801 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004802 }
4803}
4804
4805void __stdcall glLinkProgram(GLuint program)
4806{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004807 EVENT("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004808
4809 try
4810 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004811 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004812
4813 if (context)
4814 {
4815 gl::Program *programObject = context->getProgram(program);
4816
4817 if (!programObject)
4818 {
daniel@transgaming.com277b7142010-04-13 03:26:44 +00004819 if (context->getShader(program))
4820 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004821 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com277b7142010-04-13 03:26:44 +00004822 }
4823 else
4824 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004825 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com277b7142010-04-13 03:26:44 +00004826 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004827 }
4828
daniel@transgaming.com95d29422012-07-24 18:36:10 +00004829 context->linkProgram(program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004830 }
4831 }
4832 catch(std::bad_alloc&)
4833 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004834 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004835 }
4836}
4837
4838void __stdcall glPixelStorei(GLenum pname, GLint param)
4839{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004840 EVENT("(GLenum pname = 0x%X, GLint param = %d)", pname, param);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004841
4842 try
4843 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004844 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004845
4846 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004847 {
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004848 switch (pname)
4849 {
4850 case GL_UNPACK_ALIGNMENT:
4851 if (param != 1 && param != 2 && param != 4 && param != 8)
4852 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004853 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004854 }
4855
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004856 context->setUnpackAlignment(param);
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004857 break;
4858
4859 case GL_PACK_ALIGNMENT:
4860 if (param != 1 && param != 2 && param != 4 && param != 8)
4861 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004862 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004863 }
4864
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004865 context->setPackAlignment(param);
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004866 break;
4867
bsalomon@google.com56d46ab2011-11-23 14:53:10 +00004868 case GL_PACK_REVERSE_ROW_ORDER_ANGLE:
4869 context->setPackReverseRowOrder(param != 0);
4870 break;
4871
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004872 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004873 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004874 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004875 }
4876 }
4877 catch(std::bad_alloc&)
4878 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004879 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004880 }
4881}
4882
4883void __stdcall glPolygonOffset(GLfloat factor, GLfloat units)
4884{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004885 EVENT("(GLfloat factor = %f, GLfloat units = %f)", factor, units);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004886
4887 try
4888 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004889 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comaede6302010-04-29 03:35:48 +00004890
4891 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004892 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004893 context->setPolygonOffsetParams(factor, units);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004894 }
4895 }
4896 catch(std::bad_alloc&)
4897 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004898 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004899 }
4900}
4901
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00004902void __stdcall glReadnPixelsEXT(GLint x, GLint y, GLsizei width, GLsizei height,
4903 GLenum format, GLenum type, GLsizei bufSize,
4904 GLvoid *data)
4905{
4906 EVENT("(GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d, "
4907 "GLenum format = 0x%X, GLenum type = 0x%X, GLsizei bufSize = 0x%d, GLvoid *data = 0x%0.8p)",
4908 x, y, width, height, format, type, bufSize, data);
4909
4910 try
4911 {
4912 if (width < 0 || height < 0 || bufSize < 0)
4913 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004914 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00004915 }
4916
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00004917 gl::Context *context = gl::getNonLostContext();
4918
4919 if (context)
4920 {
daniel@transgaming.com42944b02012-09-27 17:45:57 +00004921 GLenum currentFormat, currentType;
4922
4923 // Failure in getCurrentReadFormatType indicates that no color attachment is currently bound,
4924 // and attempting to read back if that's the case is an error. The error will be registered
4925 // by getCurrentReadFormat.
4926 if (!context->getCurrentReadFormatType(&currentFormat, &currentType))
4927 return;
4928
4929 if (!(currentFormat == format && currentType == type) && !validReadFormatType(format, type))
4930 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004931 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com42944b02012-09-27 17:45:57 +00004932 }
4933
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00004934 context->readPixels(x, y, width, height, format, type, &bufSize, data);
4935 }
4936 }
4937 catch(std::bad_alloc&)
4938 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004939 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00004940 }
4941}
4942
4943void __stdcall glReadPixels(GLint x, GLint y, GLsizei width, GLsizei height,
4944 GLenum format, GLenum type, GLvoid* pixels)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004945{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004946 EVENT("(GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00004947 "GLenum format = 0x%X, GLenum type = 0x%X, GLvoid* pixels = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00004948 x, y, width, height, format, type, pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004949
4950 try
4951 {
4952 if (width < 0 || height < 0)
4953 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004954 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004955 }
4956
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004957 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004958
4959 if (context)
4960 {
daniel@transgaming.com42944b02012-09-27 17:45:57 +00004961 GLenum currentFormat, currentType;
4962
4963 // Failure in getCurrentReadFormatType indicates that no color attachment is currently bound,
4964 // and attempting to read back if that's the case is an error. The error will be registered
4965 // by getCurrentReadFormat.
4966 if (!context->getCurrentReadFormatType(&currentFormat, &currentType))
4967 return;
4968
4969 if (!(currentFormat == format && currentType == type) && !validReadFormatType(format, type))
4970 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004971 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com42944b02012-09-27 17:45:57 +00004972 }
4973
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00004974 context->readPixels(x, y, width, height, format, type, NULL, pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004975 }
4976 }
4977 catch(std::bad_alloc&)
4978 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004979 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004980 }
4981}
4982
4983void __stdcall glReleaseShaderCompiler(void)
4984{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004985 EVENT("()");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004986
4987 try
4988 {
4989 gl::Shader::releaseCompiler();
4990 }
4991 catch(std::bad_alloc&)
4992 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004993 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004994 }
4995}
4996
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00004997void __stdcall glRenderbufferStorageMultisampleANGLE(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004998{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004999 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 +00005000 target, samples, internalformat, width, height);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005001
5002 try
5003 {
5004 switch (target)
5005 {
5006 case GL_RENDERBUFFER:
5007 break;
5008 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005009 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005010 }
5011
daniel@transgaming.comedc19182010-10-15 17:57:55 +00005012 if (!gl::IsColorRenderable(internalformat) && !gl::IsDepthRenderable(internalformat) && !gl::IsStencilRenderable(internalformat))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005013 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005014 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005015 }
5016
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00005017 if (width < 0 || height < 0 || samples < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005018 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005019 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005020 }
5021
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005022 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005023
5024 if (context)
5025 {
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00005026 if (width > context->getMaximumRenderbufferDimension() ||
5027 height > context->getMaximumRenderbufferDimension() ||
5028 samples > context->getMaxSupportedSamples())
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00005029 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005030 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00005031 }
5032
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +00005033 GLuint handle = context->getRenderbufferHandle();
5034 if (handle == 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_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005037 }
5038
5039 switch (internalformat)
5040 {
5041 case GL_DEPTH_COMPONENT16:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005042 case GL_RGBA4:
5043 case GL_RGB5_A1:
5044 case GL_RGB565:
daniel@transgaming.com63977542010-08-24 19:21:02 +00005045 case GL_RGB8_OES:
5046 case GL_RGBA8_OES:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005047 case GL_STENCIL_INDEX8:
daniel@transgaming.comcdacc8e2010-07-28 19:20:50 +00005048 case GL_DEPTH24_STENCIL8_OES:
shannon.woods%transgaming.com@gtempaccount.com8dce6512013-04-13 03:42:19 +00005049 break;
5050 case GL_SRGB8_ALPHA8:
5051 case GL_RGB10_A2:
5052 case GL_RG8:
5053 case GL_R8:
5054 if (context->getClientVersion() < 3)
5055 {
5056 return gl::error(GL_INVALID_ENUM);
5057 }
daniel@transgaming.comcdacc8e2010-07-28 19:20:50 +00005058 break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005059 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005060 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005061 }
shannon.woods%transgaming.com@gtempaccount.com8dce6512013-04-13 03:42:19 +00005062
5063 context->setRenderbufferStorage(width, height, internalformat, samples);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005064 }
5065 }
5066 catch(std::bad_alloc&)
5067 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005068 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005069 }
5070}
5071
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00005072void __stdcall glRenderbufferStorage(GLenum target, GLenum internalformat, GLsizei width, GLsizei height)
5073{
5074 glRenderbufferStorageMultisampleANGLE(target, 0, internalformat, width, height);
5075}
5076
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005077void __stdcall glSampleCoverage(GLclampf value, GLboolean invert)
5078{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005079 EVENT("(GLclampf value = %f, GLboolean invert = %u)", value, invert);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005080
5081 try
5082 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005083 gl::Context* context = gl::getNonLostContext();
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00005084
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005085 if (context)
5086 {
daniel@transgaming.coma36f98e2010-05-18 18:51:09 +00005087 context->setSampleCoverageParams(gl::clamp01(value), invert == GL_TRUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005088 }
5089 }
5090 catch(std::bad_alloc&)
5091 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005092 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005093 }
5094}
5095
daniel@transgaming.comfe208882010-09-01 15:47:57 +00005096void __stdcall glSetFenceNV(GLuint fence, GLenum condition)
5097{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005098 EVENT("(GLuint fence = %d, GLenum condition = 0x%X)", fence, condition);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005099
5100 try
5101 {
5102 if (condition != GL_ALL_COMPLETED_NV)
5103 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005104 return gl::error(GL_INVALID_ENUM);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005105 }
5106
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005107 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005108
5109 if (context)
5110 {
5111 gl::Fence *fenceObject = context->getFence(fence);
5112
5113 if (fenceObject == NULL)
5114 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005115 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005116 }
5117
5118 fenceObject->setFence(condition);
5119 }
5120 }
5121 catch(std::bad_alloc&)
5122 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005123 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005124 }
daniel@transgaming.comfe208882010-09-01 15:47:57 +00005125}
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005126
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005127void __stdcall glScissor(GLint x, GLint y, GLsizei width, GLsizei height)
5128{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005129 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 +00005130
5131 try
5132 {
5133 if (width < 0 || height < 0)
5134 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005135 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005136 }
5137
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005138 gl::Context* context = gl::getNonLostContext();
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00005139
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005140 if (context)
5141 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00005142 context->setScissorParams(x, y, width, height);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005143 }
5144 }
5145 catch(std::bad_alloc&)
5146 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005147 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005148 }
5149}
5150
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00005151void __stdcall glShaderBinary(GLsizei n, const GLuint* shaders, GLenum binaryformat, const GLvoid* binary, GLsizei length)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005152{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005153 EVENT("(GLsizei n = %d, const GLuint* shaders = 0x%0.8p, GLenum binaryformat = 0x%X, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00005154 "const GLvoid* binary = 0x%0.8p, GLsizei length = %d)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00005155 n, shaders, binaryformat, binary, length);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005156
5157 try
5158 {
daniel@transgaming.comd1f667f2010-04-29 03:38:52 +00005159 // No binary shader formats are supported.
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005160 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005161 }
5162 catch(std::bad_alloc&)
5163 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005164 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005165 }
5166}
5167
shannon.woods%transgaming.com@gtempaccount.com5f339332013-04-13 03:29:02 +00005168void __stdcall glShaderSource(GLuint shader, GLsizei count, const GLchar* const* string, const GLint* length)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005169{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005170 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 +00005171 shader, count, string, length);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005172
5173 try
5174 {
daniel@transgaming.com8e6a6be2010-04-13 03:26:41 +00005175 if (count < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005176 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005177 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005178 }
5179
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005180 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005181
5182 if (context)
5183 {
5184 gl::Shader *shaderObject = context->getShader(shader);
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00005185
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005186 if (!shaderObject)
5187 {
daniel@transgaming.com8e6a6be2010-04-13 03:26:41 +00005188 if (context->getProgram(shader))
5189 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005190 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com8e6a6be2010-04-13 03:26:41 +00005191 }
5192 else
5193 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005194 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com8e6a6be2010-04-13 03:26:41 +00005195 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005196 }
5197
5198 shaderObject->setSource(count, string, length);
5199 }
5200 }
5201 catch(std::bad_alloc&)
5202 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005203 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005204 }
5205}
5206
5207void __stdcall glStencilFunc(GLenum func, GLint ref, GLuint mask)
5208{
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00005209 glStencilFuncSeparate(GL_FRONT_AND_BACK, func, ref, mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005210}
5211
5212void __stdcall glStencilFuncSeparate(GLenum face, GLenum func, GLint ref, GLuint mask)
5213{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005214 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 +00005215
5216 try
5217 {
5218 switch (face)
5219 {
5220 case GL_FRONT:
5221 case GL_BACK:
5222 case GL_FRONT_AND_BACK:
5223 break;
5224 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005225 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005226 }
5227
5228 switch (func)
5229 {
5230 case GL_NEVER:
5231 case GL_ALWAYS:
5232 case GL_LESS:
5233 case GL_LEQUAL:
5234 case GL_EQUAL:
5235 case GL_GEQUAL:
5236 case GL_GREATER:
5237 case GL_NOTEQUAL:
5238 break;
5239 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005240 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005241 }
5242
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005243 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005244
5245 if (context)
5246 {
5247 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
5248 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00005249 context->setStencilParams(func, ref, mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005250 }
5251
5252 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
5253 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00005254 context->setStencilBackParams(func, ref, mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005255 }
5256 }
5257 }
5258 catch(std::bad_alloc&)
5259 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005260 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005261 }
5262}
5263
5264void __stdcall glStencilMask(GLuint mask)
5265{
5266 glStencilMaskSeparate(GL_FRONT_AND_BACK, mask);
5267}
5268
5269void __stdcall glStencilMaskSeparate(GLenum face, GLuint mask)
5270{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005271 EVENT("(GLenum face = 0x%X, GLuint mask = %d)", face, mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005272
5273 try
5274 {
5275 switch (face)
5276 {
5277 case GL_FRONT:
5278 case GL_BACK:
5279 case GL_FRONT_AND_BACK:
5280 break;
5281 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005282 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005283 }
5284
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005285 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005286
5287 if (context)
5288 {
5289 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
5290 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00005291 context->setStencilWritemask(mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005292 }
5293
5294 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
5295 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00005296 context->setStencilBackWritemask(mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005297 }
5298 }
5299 }
5300 catch(std::bad_alloc&)
5301 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005302 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005303 }
5304}
5305
5306void __stdcall glStencilOp(GLenum fail, GLenum zfail, GLenum zpass)
5307{
5308 glStencilOpSeparate(GL_FRONT_AND_BACK, fail, zfail, zpass);
5309}
5310
5311void __stdcall glStencilOpSeparate(GLenum face, GLenum fail, GLenum zfail, GLenum zpass)
5312{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005313 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 +00005314 face, fail, zfail, zpass);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005315
5316 try
5317 {
5318 switch (face)
5319 {
5320 case GL_FRONT:
5321 case GL_BACK:
5322 case GL_FRONT_AND_BACK:
5323 break;
5324 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005325 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005326 }
5327
5328 switch (fail)
5329 {
5330 case GL_ZERO:
5331 case GL_KEEP:
5332 case GL_REPLACE:
5333 case GL_INCR:
5334 case GL_DECR:
5335 case GL_INVERT:
5336 case GL_INCR_WRAP:
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00005337 case GL_DECR_WRAP:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005338 break;
5339 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005340 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005341 }
5342
5343 switch (zfail)
5344 {
5345 case GL_ZERO:
5346 case GL_KEEP:
5347 case GL_REPLACE:
5348 case GL_INCR:
5349 case GL_DECR:
5350 case GL_INVERT:
5351 case GL_INCR_WRAP:
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00005352 case GL_DECR_WRAP:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005353 break;
5354 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005355 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005356 }
5357
5358 switch (zpass)
5359 {
5360 case GL_ZERO:
5361 case GL_KEEP:
5362 case GL_REPLACE:
5363 case GL_INCR:
5364 case GL_DECR:
5365 case GL_INVERT:
5366 case GL_INCR_WRAP:
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00005367 case GL_DECR_WRAP:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005368 break;
5369 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005370 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005371 }
5372
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005373 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005374
5375 if (context)
5376 {
5377 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
5378 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00005379 context->setStencilOperations(fail, zfail, zpass);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005380 }
5381
5382 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
5383 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00005384 context->setStencilBackOperations(fail, zfail, zpass);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005385 }
5386 }
5387 }
5388 catch(std::bad_alloc&)
5389 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005390 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005391 }
5392}
5393
daniel@transgaming.comfe208882010-09-01 15:47:57 +00005394GLboolean __stdcall glTestFenceNV(GLuint fence)
5395{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005396 EVENT("(GLuint fence = %d)", fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005397
5398 try
5399 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005400 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005401
5402 if (context)
5403 {
5404 gl::Fence *fenceObject = context->getFence(fence);
5405
5406 if (fenceObject == NULL)
5407 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005408 return gl::error(GL_INVALID_OPERATION, GL_TRUE);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005409 }
5410
5411 return fenceObject->testFence();
5412 }
5413 }
5414 catch(std::bad_alloc&)
5415 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005416 gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005417 }
5418
5419 return GL_TRUE;
daniel@transgaming.comfe208882010-09-01 15:47:57 +00005420}
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005421
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00005422void __stdcall glTexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height,
5423 GLint border, GLenum format, GLenum type, const GLvoid* pixels)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005424{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005425 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 +00005426 "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 +00005427 target, level, internalformat, width, height, border, format, type, pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005428
5429 try
5430 {
daniel@transgaming.com4f9ef0d2011-05-30 23:51:19 +00005431 if (!validImageSize(level, width, height))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005432 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005433 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005434 }
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00005435
apatrick@chromium.orge057c5d2012-01-26 19:18:24 +00005436 if (internalformat != GLint(format))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005437 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005438 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005439 }
5440
daniel@transgaming.com6377e362012-06-05 19:49:55 +00005441 // validate <type> by itself (used as secondary key below)
5442 switch (type)
5443 {
5444 case GL_UNSIGNED_BYTE:
5445 case GL_UNSIGNED_SHORT_5_6_5:
5446 case GL_UNSIGNED_SHORT_4_4_4_4:
5447 case GL_UNSIGNED_SHORT_5_5_5_1:
5448 case GL_UNSIGNED_SHORT:
5449 case GL_UNSIGNED_INT:
5450 case GL_UNSIGNED_INT_24_8_OES:
5451 case GL_HALF_FLOAT_OES:
5452 case GL_FLOAT:
5453 break;
5454 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005455 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com6377e362012-06-05 19:49:55 +00005456 }
5457
5458 // validate <format> + <type> combinations
5459 // - invalid <format> -> sets INVALID_ENUM
5460 // - invalid <format>+<type> combination -> sets INVALID_OPERATION
daniel@transgaming.com8a0a2db2011-03-21 16:38:20 +00005461 switch (format)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005462 {
5463 case GL_ALPHA:
5464 case GL_LUMINANCE:
5465 case GL_LUMINANCE_ALPHA:
5466 switch (type)
5467 {
5468 case GL_UNSIGNED_BYTE:
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00005469 case GL_FLOAT:
5470 case GL_HALF_FLOAT_OES:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005471 break;
5472 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005473 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005474 }
5475 break;
5476 case GL_RGB:
5477 switch (type)
5478 {
5479 case GL_UNSIGNED_BYTE:
5480 case GL_UNSIGNED_SHORT_5_6_5:
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00005481 case GL_FLOAT:
5482 case GL_HALF_FLOAT_OES:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005483 break;
5484 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005485 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005486 }
5487 break;
5488 case GL_RGBA:
5489 switch (type)
5490 {
5491 case GL_UNSIGNED_BYTE:
5492 case GL_UNSIGNED_SHORT_4_4_4_4:
5493 case GL_UNSIGNED_SHORT_5_5_5_1:
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00005494 case GL_FLOAT:
5495 case GL_HALF_FLOAT_OES:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005496 break;
5497 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005498 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005499 }
5500 break;
daniel@transgaming.coma9198d92010-08-08 04:49:56 +00005501 case GL_BGRA_EXT:
5502 switch (type)
5503 {
5504 case GL_UNSIGNED_BYTE:
5505 break;
5506 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005507 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.coma9198d92010-08-08 04:49:56 +00005508 }
5509 break;
daniel@transgaming.com01868132010-08-24 19:21:17 +00005510 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT: // error cases for compressed textures are handled below
5511 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
gman@chromium.org50c526d2011-08-10 05:19:44 +00005512 case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
5513 case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
daniel@transgaming.com01868132010-08-24 19:21:17 +00005514 break;
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00005515 case GL_DEPTH_COMPONENT:
5516 switch (type)
5517 {
5518 case GL_UNSIGNED_SHORT:
5519 case GL_UNSIGNED_INT:
5520 break;
5521 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005522 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00005523 }
5524 break;
5525 case GL_DEPTH_STENCIL_OES:
5526 switch (type)
5527 {
5528 case GL_UNSIGNED_INT_24_8_OES:
5529 break;
5530 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005531 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00005532 }
5533 break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005534 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005535 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005536 }
5537
5538 if (border != 0)
5539 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005540 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005541 }
5542
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005543 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005544
5545 if (context)
5546 {
daniel@transgaming.com32b11442011-11-19 02:42:48 +00005547 if (level > context->getMaximumTextureLevel())
5548 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005549 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com32b11442011-11-19 02:42:48 +00005550 }
5551
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00005552 switch (target)
5553 {
5554 case GL_TEXTURE_2D:
shannon.woods%transgaming.com@gtempaccount.comc1fdf6b2013-04-13 03:44:41 +00005555 if (width > (context->getMaximum2DTextureDimension() >> level) ||
5556 height > (context->getMaximum2DTextureDimension() >> level))
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00005557 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005558 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00005559 }
5560 break;
5561 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
5562 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
5563 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
5564 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
5565 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
5566 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
5567 if (width != height)
5568 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005569 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00005570 }
5571
5572 if (width > (context->getMaximumCubeTextureDimension() >> level) ||
5573 height > (context->getMaximumCubeTextureDimension() >> level))
5574 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005575 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00005576 }
5577 break;
5578 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005579 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00005580 }
5581
gman@chromium.org50c526d2011-08-10 05:19:44 +00005582 switch (format) {
5583 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
5584 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
5585 if (context->supportsDXT1Textures())
daniel@transgaming.com01868132010-08-24 19:21:17 +00005586 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005587 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com01868132010-08-24 19:21:17 +00005588 }
5589 else
5590 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005591 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com01868132010-08-24 19:21:17 +00005592 }
gman@chromium.org50c526d2011-08-10 05:19:44 +00005593 break;
5594 case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
5595 if (context->supportsDXT3Textures())
5596 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005597 return gl::error(GL_INVALID_OPERATION);
gman@chromium.org50c526d2011-08-10 05:19:44 +00005598 }
5599 else
5600 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005601 return gl::error(GL_INVALID_ENUM);
gman@chromium.org50c526d2011-08-10 05:19:44 +00005602 }
5603 break;
5604 case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
5605 if (context->supportsDXT5Textures())
5606 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005607 return gl::error(GL_INVALID_OPERATION);
gman@chromium.org50c526d2011-08-10 05:19:44 +00005608 }
5609 else
5610 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005611 return gl::error(GL_INVALID_ENUM);
gman@chromium.org50c526d2011-08-10 05:19:44 +00005612 }
5613 break;
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00005614 case GL_DEPTH_COMPONENT:
5615 case GL_DEPTH_STENCIL_OES:
5616 if (!context->supportsDepthTextures())
5617 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005618 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00005619 }
daniel@transgaming.com0c854682012-05-31 01:14:11 +00005620 if (target != GL_TEXTURE_2D)
5621 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005622 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com0c854682012-05-31 01:14:11 +00005623 }
daniel@transgaming.com797924b2012-06-05 19:50:01 +00005624 // OES_depth_texture supports loading depth data and multiple levels,
5625 // but ANGLE_depth_texture does not
5626 if (pixels != NULL || level != 0)
daniel@transgaming.com0c854682012-05-31 01:14:11 +00005627 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005628 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com0c854682012-05-31 01:14:11 +00005629 }
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00005630 break;
gman@chromium.org50c526d2011-08-10 05:19:44 +00005631 default:
5632 break;
daniel@transgaming.com01868132010-08-24 19:21:17 +00005633 }
5634
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00005635 if (type == GL_FLOAT)
5636 {
daniel@transgaming.combbeffbb2011-11-09 17:46:11 +00005637 if (!context->supportsFloat32Textures())
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00005638 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005639 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00005640 }
5641 }
5642 else if (type == GL_HALF_FLOAT_OES)
5643 {
daniel@transgaming.combbeffbb2011-11-09 17:46:11 +00005644 if (!context->supportsFloat16Textures())
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00005645 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005646 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00005647 }
5648 }
5649
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005650 if (target == GL_TEXTURE_2D)
5651 {
5652 gl::Texture2D *texture = context->getTexture2D();
5653
5654 if (!texture)
5655 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005656 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005657 }
5658
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005659 if (texture->isImmutable())
5660 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005661 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005662 }
5663
daniel@transgaming.com8a0a2db2011-03-21 16:38:20 +00005664 texture->setImage(level, width, height, format, type, context->getUnpackAlignment(), pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005665 }
5666 else
5667 {
5668 gl::TextureCubeMap *texture = context->getTextureCubeMap();
5669
5670 if (!texture)
5671 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005672 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005673 }
5674
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005675 if (texture->isImmutable())
5676 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005677 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005678 }
5679
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005680 switch (target)
5681 {
5682 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
daniel@transgaming.com8a0a2db2011-03-21 16:38:20 +00005683 texture->setImagePosX(level, width, height, format, type, context->getUnpackAlignment(), pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005684 break;
5685 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
daniel@transgaming.com8a0a2db2011-03-21 16:38:20 +00005686 texture->setImageNegX(level, width, height, format, type, context->getUnpackAlignment(), pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005687 break;
5688 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
daniel@transgaming.com8a0a2db2011-03-21 16:38:20 +00005689 texture->setImagePosY(level, width, height, format, type, context->getUnpackAlignment(), pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005690 break;
5691 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
daniel@transgaming.com8a0a2db2011-03-21 16:38:20 +00005692 texture->setImageNegY(level, width, height, format, type, context->getUnpackAlignment(), pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005693 break;
5694 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
daniel@transgaming.com8a0a2db2011-03-21 16:38:20 +00005695 texture->setImagePosZ(level, width, height, format, type, context->getUnpackAlignment(), pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005696 break;
5697 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
daniel@transgaming.com8a0a2db2011-03-21 16:38:20 +00005698 texture->setImageNegZ(level, width, height, format, type, context->getUnpackAlignment(), pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005699 break;
5700 default: UNREACHABLE();
5701 }
5702 }
5703 }
5704 }
5705 catch(std::bad_alloc&)
5706 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005707 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005708 }
5709}
5710
5711void __stdcall glTexParameterf(GLenum target, GLenum pname, GLfloat param)
5712{
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005713 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLint param = %f)", target, pname, param);
5714
5715 try
5716 {
5717 gl::Context *context = gl::getNonLostContext();
5718
5719 if (context)
5720 {
5721 gl::Texture *texture;
5722
5723 switch (target)
5724 {
5725 case GL_TEXTURE_2D:
5726 texture = context->getTexture2D();
5727 break;
5728 case GL_TEXTURE_CUBE_MAP:
5729 texture = context->getTextureCubeMap();
5730 break;
5731 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005732 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005733 }
5734
5735 switch (pname)
5736 {
5737 case GL_TEXTURE_WRAP_S:
5738 if (!texture->setWrapS((GLenum)param))
5739 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005740 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005741 }
5742 break;
5743 case GL_TEXTURE_WRAP_T:
5744 if (!texture->setWrapT((GLenum)param))
5745 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005746 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005747 }
5748 break;
shannon.woods%transgaming.com@gtempaccount.com0b3a8df2013-04-13 03:44:51 +00005749 case GL_TEXTURE_WRAP_R:
5750 if (context->getClientVersion() < 3 || !texture->setWrapR((GLenum)param))
5751 {
5752 return gl::error(GL_INVALID_ENUM);
5753 }
5754 break;
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005755 case GL_TEXTURE_MIN_FILTER:
5756 if (!texture->setMinFilter((GLenum)param))
5757 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005758 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005759 }
5760 break;
5761 case GL_TEXTURE_MAG_FILTER:
5762 if (!texture->setMagFilter((GLenum)param))
5763 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005764 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005765 }
5766 break;
5767 case GL_TEXTURE_USAGE_ANGLE:
5768 if (!texture->setUsage((GLenum)param))
5769 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005770 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005771 }
5772 break;
5773 case GL_TEXTURE_MAX_ANISOTROPY_EXT:
5774 if (!context->supportsTextureFilterAnisotropy())
5775 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005776 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005777 }
5778 if (!texture->setMaxAnisotropy((float)param, context->getTextureMaxAnisotropy()))
5779 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005780 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005781 }
5782 break;
5783 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005784 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005785 }
5786 }
5787 }
5788 catch(std::bad_alloc&)
5789 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005790 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005791 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005792}
5793
5794void __stdcall glTexParameterfv(GLenum target, GLenum pname, const GLfloat* params)
5795{
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005796 glTexParameterf(target, pname, (GLfloat)*params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005797}
5798
5799void __stdcall glTexParameteri(GLenum target, GLenum pname, GLint param)
5800{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005801 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLint param = %d)", target, pname, param);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005802
5803 try
5804 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005805 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005806
5807 if (context)
5808 {
5809 gl::Texture *texture;
5810
5811 switch (target)
5812 {
5813 case GL_TEXTURE_2D:
5814 texture = context->getTexture2D();
5815 break;
5816 case GL_TEXTURE_CUBE_MAP:
5817 texture = context->getTextureCubeMap();
5818 break;
5819 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005820 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005821 }
5822
5823 switch (pname)
5824 {
5825 case GL_TEXTURE_WRAP_S:
5826 if (!texture->setWrapS((GLenum)param))
5827 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005828 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005829 }
5830 break;
5831 case GL_TEXTURE_WRAP_T:
5832 if (!texture->setWrapT((GLenum)param))
5833 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005834 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005835 }
5836 break;
shannon.woods%transgaming.com@gtempaccount.com0b3a8df2013-04-13 03:44:51 +00005837 case GL_TEXTURE_WRAP_R:
5838 if (context->getClientVersion() < 3 || !texture->setWrapR((GLenum)param))
5839 {
5840 return gl::error(GL_INVALID_ENUM);
5841 }
5842 break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005843 case GL_TEXTURE_MIN_FILTER:
5844 if (!texture->setMinFilter((GLenum)param))
5845 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005846 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005847 }
5848 break;
5849 case GL_TEXTURE_MAG_FILTER:
5850 if (!texture->setMagFilter((GLenum)param))
5851 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005852 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005853 }
5854 break;
daniel@transgaming.com7d18c172011-11-11 04:18:21 +00005855 case GL_TEXTURE_USAGE_ANGLE:
5856 if (!texture->setUsage((GLenum)param))
5857 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005858 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com7d18c172011-11-11 04:18:21 +00005859 }
5860 break;
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005861 case GL_TEXTURE_MAX_ANISOTROPY_EXT:
5862 if (!context->supportsTextureFilterAnisotropy())
5863 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005864 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005865 }
5866 if (!texture->setMaxAnisotropy((float)param, context->getTextureMaxAnisotropy()))
5867 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005868 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005869 }
5870 break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005871 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005872 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005873 }
5874 }
5875 }
5876 catch(std::bad_alloc&)
5877 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005878 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005879 }
5880}
5881
5882void __stdcall glTexParameteriv(GLenum target, GLenum pname, const GLint* params)
5883{
5884 glTexParameteri(target, pname, *params);
5885}
5886
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005887void __stdcall glTexStorage2DEXT(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height)
5888{
5889 EVENT("(GLenum target = 0x%X, GLsizei levels = %d, GLenum internalformat = 0x%X, GLsizei width = %d, GLsizei height = %d)",
5890 target, levels, internalformat, width, height);
5891
5892 try
5893 {
5894 if (target != GL_TEXTURE_2D && target != GL_TEXTURE_CUBE_MAP)
5895 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005896 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005897 }
5898
5899 if (width < 1 || height < 1 || levels < 1)
5900 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005901 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005902 }
5903
5904 if (target == GL_TEXTURE_CUBE_MAP && width != height)
5905 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005906 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005907 }
5908
daniel@transgaming.com45b888a2011-11-16 03:56:39 +00005909 if (levels != 1 && levels != gl::log2(std::max(width, height)) + 1)
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005910 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005911 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005912 }
5913
5914 GLenum format = gl::ExtractFormat(internalformat);
5915 GLenum type = gl::ExtractType(internalformat);
5916
5917 if (format == GL_NONE || type == GL_NONE)
5918 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005919 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005920 }
5921
5922 gl::Context *context = gl::getNonLostContext();
5923
5924 if (context)
5925 {
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00005926 switch (target)
5927 {
5928 case GL_TEXTURE_2D:
shannon.woods%transgaming.com@gtempaccount.comc1fdf6b2013-04-13 03:44:41 +00005929 if (width > context->getMaximum2DTextureDimension() ||
5930 height > context->getMaximum2DTextureDimension())
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00005931 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005932 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00005933 }
5934 break;
5935 case GL_TEXTURE_CUBE_MAP:
5936 if (width > context->getMaximumCubeTextureDimension() ||
5937 height > context->getMaximumCubeTextureDimension())
5938 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005939 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00005940 }
5941 break;
5942 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005943 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00005944 }
5945
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005946 if (levels != 1 && !context->supportsNonPower2Texture())
5947 {
5948 if (!gl::isPow2(width) || !gl::isPow2(height))
5949 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005950 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005951 }
5952 }
5953
daniel@transgaming.come1077362011-11-11 04:16:50 +00005954 switch (internalformat)
5955 {
5956 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
5957 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
5958 if (!context->supportsDXT1Textures())
5959 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005960 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.come1077362011-11-11 04:16:50 +00005961 }
5962 break;
5963 case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
5964 if (!context->supportsDXT3Textures())
5965 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005966 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.come1077362011-11-11 04:16:50 +00005967 }
5968 break;
5969 case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
5970 if (!context->supportsDXT5Textures())
5971 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005972 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.come1077362011-11-11 04:16:50 +00005973 }
5974 break;
daniel@transgaming.comff941aa2011-11-11 04:17:09 +00005975 case GL_RGBA32F_EXT:
5976 case GL_RGB32F_EXT:
5977 case GL_ALPHA32F_EXT:
5978 case GL_LUMINANCE32F_EXT:
5979 case GL_LUMINANCE_ALPHA32F_EXT:
5980 if (!context->supportsFloat32Textures())
5981 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005982 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comff941aa2011-11-11 04:17:09 +00005983 }
5984 break;
5985 case GL_RGBA16F_EXT:
5986 case GL_RGB16F_EXT:
5987 case GL_ALPHA16F_EXT:
5988 case GL_LUMINANCE16F_EXT:
5989 case GL_LUMINANCE_ALPHA16F_EXT:
5990 if (!context->supportsFloat16Textures())
5991 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005992 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comff941aa2011-11-11 04:17:09 +00005993 }
5994 break;
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00005995 case GL_DEPTH_COMPONENT16:
5996 case GL_DEPTH_COMPONENT32_OES:
5997 case GL_DEPTH24_STENCIL8_OES:
5998 if (!context->supportsDepthTextures())
5999 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006000 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00006001 }
daniel@transgaming.com0c854682012-05-31 01:14:11 +00006002 if (target != GL_TEXTURE_2D)
6003 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006004 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com0c854682012-05-31 01:14:11 +00006005 }
daniel@transgaming.com797924b2012-06-05 19:50:01 +00006006 // ANGLE_depth_texture only supports 1-level textures
6007 if (levels != 1)
6008 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006009 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com797924b2012-06-05 19:50:01 +00006010 }
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00006011 break;
6012 default:
6013 break;
daniel@transgaming.come1077362011-11-11 04:16:50 +00006014 }
6015
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00006016 if (target == GL_TEXTURE_2D)
6017 {
6018 gl::Texture2D *texture = context->getTexture2D();
6019
6020 if (!texture || texture->id() == 0)
6021 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006022 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00006023 }
6024
6025 if (texture->isImmutable())
6026 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006027 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00006028 }
6029
6030 texture->storage(levels, internalformat, width, height);
6031 }
6032 else if (target == GL_TEXTURE_CUBE_MAP)
6033 {
6034 gl::TextureCubeMap *texture = context->getTextureCubeMap();
6035
6036 if (!texture || texture->id() == 0)
6037 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006038 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00006039 }
6040
6041 if (texture->isImmutable())
6042 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006043 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00006044 }
6045
6046 texture->storage(levels, internalformat, width);
6047 }
6048 else UNREACHABLE();
6049 }
6050 }
6051 catch(std::bad_alloc&)
6052 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006053 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00006054 }
6055}
6056
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00006057void __stdcall glTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height,
6058 GLenum format, GLenum type, const GLvoid* pixels)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006059{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006060 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00006061 "GLsizei width = %d, GLsizei height = %d, GLenum format = 0x%X, GLenum type = 0x%X, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00006062 "const GLvoid* pixels = 0x%0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006063 target, level, xoffset, yoffset, width, height, format, type, pixels);
6064
6065 try
6066 {
apatrick@chromium.org551022e2012-01-23 19:56:54 +00006067 if (!gl::IsInternalTextureTarget(target))
daniel@transgaming.com00c75962010-03-11 20:36:15 +00006068 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006069 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com00c75962010-03-11 20:36:15 +00006070 }
6071
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00006072 if (level < 0 || xoffset < 0 || yoffset < 0 || width < 0 || height < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006073 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006074 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006075 }
6076
daniel@transgaming.com00c75962010-03-11 20:36:15 +00006077 if (std::numeric_limits<GLsizei>::max() - xoffset < width || std::numeric_limits<GLsizei>::max() - yoffset < height)
6078 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006079 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com00c75962010-03-11 20:36:15 +00006080 }
6081
daniel@transgaming.com8833dd22012-06-05 19:49:58 +00006082 if (!checkTextureFormatType(format, type))
daniel@transgaming.com00c75962010-03-11 20:36:15 +00006083 {
daniel@transgaming.com8833dd22012-06-05 19:49:58 +00006084 return; // error is set by helper function
daniel@transgaming.com00c75962010-03-11 20:36:15 +00006085 }
6086
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006087 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com00c75962010-03-11 20:36:15 +00006088
6089 if (context)
6090 {
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00006091 if (level > context->getMaximumTextureLevel())
6092 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006093 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00006094 }
6095
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00006096 if (format == GL_FLOAT)
6097 {
daniel@transgaming.combbeffbb2011-11-09 17:46:11 +00006098 if (!context->supportsFloat32Textures())
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00006099 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006100 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00006101 }
6102 }
6103 else if (format == GL_HALF_FLOAT_OES)
6104 {
daniel@transgaming.combbeffbb2011-11-09 17:46:11 +00006105 if (!context->supportsFloat16Textures())
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00006106 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006107 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00006108 }
6109 }
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00006110 else if (gl::IsDepthTexture(format))
6111 {
6112 if (!context->supportsDepthTextures())
6113 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006114 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00006115 }
daniel@transgaming.com0c854682012-05-31 01:14:11 +00006116 if (target != GL_TEXTURE_2D)
6117 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006118 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com0c854682012-05-31 01:14:11 +00006119 }
6120 // OES_depth_texture supports loading depth data, but ANGLE_depth_texture does not
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006121 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00006122 }
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00006123
daniel@transgaming.com1d2d3c42012-05-31 01:14:15 +00006124 if (width == 0 || height == 0 || pixels == NULL)
6125 {
6126 return;
6127 }
6128
daniel@transgaming.com00c75962010-03-11 20:36:15 +00006129 if (target == GL_TEXTURE_2D)
6130 {
6131 gl::Texture2D *texture = context->getTexture2D();
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00006132 if (validateSubImageParams2D(false, width, height, xoffset, yoffset, level, format, type, texture))
daniel@transgaming.com00c75962010-03-11 20:36:15 +00006133 {
daniel@transgaming.com343373a2011-11-29 19:42:32 +00006134 texture->subImage(level, xoffset, yoffset, width, height, format, type, context->getUnpackAlignment(), pixels);
daniel@transgaming.com00c75962010-03-11 20:36:15 +00006135 }
daniel@transgaming.com00c75962010-03-11 20:36:15 +00006136 }
daniel@transgaming.com19ffc242010-05-04 03:35:21 +00006137 else if (gl::IsCubemapTextureTarget(target))
daniel@transgaming.com00c75962010-03-11 20:36:15 +00006138 {
6139 gl::TextureCubeMap *texture = context->getTextureCubeMap();
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00006140 if (validateSubImageParamsCube(false, width, height, xoffset, yoffset, target, level, format, type, texture))
daniel@transgaming.com00c75962010-03-11 20:36:15 +00006141 {
daniel@transgaming.com343373a2011-11-29 19:42:32 +00006142 texture->subImage(target, level, xoffset, yoffset, width, height, format, type, context->getUnpackAlignment(), pixels);
daniel@transgaming.com00c75962010-03-11 20:36:15 +00006143 }
daniel@transgaming.com00c75962010-03-11 20:36:15 +00006144 }
6145 else
6146 {
6147 UNREACHABLE();
6148 }
6149 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006150 }
6151 catch(std::bad_alloc&)
6152 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006153 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006154 }
6155}
6156
6157void __stdcall glUniform1f(GLint location, GLfloat x)
6158{
6159 glUniform1fv(location, 1, &x);
6160}
6161
6162void __stdcall glUniform1fv(GLint location, GLsizei count, const GLfloat* v)
6163{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006164 EVENT("(GLint location = %d, GLsizei count = %d, const GLfloat* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006165
6166 try
6167 {
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006168 if (count < 0)
6169 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006170 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006171 }
6172
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006173 if (location == -1)
6174 {
6175 return;
6176 }
6177
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006178 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006179
6180 if (context)
6181 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00006182 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006183 if (!programBinary)
6184 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006185 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006186 }
6187
6188 if (!programBinary->setUniform1fv(location, count, v))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006189 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006190 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006191 }
6192 }
6193 }
6194 catch(std::bad_alloc&)
6195 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006196 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006197 }
6198}
6199
6200void __stdcall glUniform1i(GLint location, GLint x)
6201{
6202 glUniform1iv(location, 1, &x);
6203}
6204
6205void __stdcall glUniform1iv(GLint location, GLsizei count, const GLint* v)
6206{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006207 EVENT("(GLint location = %d, GLsizei count = %d, const GLint* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006208
6209 try
6210 {
6211 if (count < 0)
6212 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006213 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006214 }
6215
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006216 if (location == -1)
6217 {
6218 return;
6219 }
6220
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006221 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006222
6223 if (context)
6224 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00006225 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006226 if (!programBinary)
6227 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006228 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006229 }
6230
6231 if (!programBinary->setUniform1iv(location, count, v))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006232 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006233 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006234 }
6235 }
6236 }
6237 catch(std::bad_alloc&)
6238 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006239 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006240 }
6241}
6242
6243void __stdcall glUniform2f(GLint location, GLfloat x, GLfloat y)
6244{
6245 GLfloat xy[2] = {x, y};
6246
6247 glUniform2fv(location, 1, (GLfloat*)&xy);
6248}
6249
6250void __stdcall glUniform2fv(GLint location, GLsizei count, const GLfloat* v)
6251{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006252 EVENT("(GLint location = %d, GLsizei count = %d, const GLfloat* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006253
6254 try
6255 {
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006256 if (count < 0)
6257 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006258 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006259 }
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006260
6261 if (location == -1)
6262 {
6263 return;
6264 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006265
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006266 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006267
6268 if (context)
6269 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00006270 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006271 if (!programBinary)
6272 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006273 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006274 }
6275
6276 if (!programBinary->setUniform2fv(location, count, v))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006277 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006278 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006279 }
6280 }
6281 }
6282 catch(std::bad_alloc&)
6283 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006284 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006285 }
6286}
6287
6288void __stdcall glUniform2i(GLint location, GLint x, GLint y)
6289{
6290 GLint xy[4] = {x, y};
6291
6292 glUniform2iv(location, 1, (GLint*)&xy);
6293}
6294
6295void __stdcall glUniform2iv(GLint location, GLsizei count, const GLint* v)
6296{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006297 EVENT("(GLint location = %d, GLsizei count = %d, const GLint* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006298
6299 try
6300 {
6301 if (count < 0)
6302 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006303 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006304 }
6305
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006306 if (location == -1)
6307 {
6308 return;
6309 }
6310
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006311 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006312
6313 if (context)
6314 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00006315 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006316 if (!programBinary)
6317 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006318 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006319 }
6320
6321 if (!programBinary->setUniform2iv(location, count, v))
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006322 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006323 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006324 }
6325 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006326 }
6327 catch(std::bad_alloc&)
6328 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006329 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006330 }
6331}
6332
6333void __stdcall glUniform3f(GLint location, GLfloat x, GLfloat y, GLfloat z)
6334{
6335 GLfloat xyz[3] = {x, y, z};
6336
6337 glUniform3fv(location, 1, (GLfloat*)&xyz);
6338}
6339
6340void __stdcall glUniform3fv(GLint location, GLsizei count, const GLfloat* v)
6341{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006342 EVENT("(GLint location = %d, GLsizei count = %d, const GLfloat* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006343
6344 try
6345 {
6346 if (count < 0)
6347 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006348 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006349 }
6350
6351 if (location == -1)
6352 {
6353 return;
6354 }
6355
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006356 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006357
6358 if (context)
6359 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00006360 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006361 if (!programBinary)
6362 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006363 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006364 }
6365
6366 if (!programBinary->setUniform3fv(location, count, v))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006367 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006368 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006369 }
6370 }
6371 }
6372 catch(std::bad_alloc&)
6373 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006374 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006375 }
6376}
6377
6378void __stdcall glUniform3i(GLint location, GLint x, GLint y, GLint z)
6379{
6380 GLint xyz[3] = {x, y, z};
6381
6382 glUniform3iv(location, 1, (GLint*)&xyz);
6383}
6384
6385void __stdcall glUniform3iv(GLint location, GLsizei count, const GLint* v)
6386{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006387 EVENT("(GLint location = %d, GLsizei count = %d, const GLint* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006388
6389 try
6390 {
6391 if (count < 0)
6392 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006393 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006394 }
6395
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006396 if (location == -1)
6397 {
6398 return;
6399 }
6400
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006401 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006402
6403 if (context)
6404 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00006405 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006406 if (!programBinary)
6407 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006408 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006409 }
6410
6411 if (!programBinary->setUniform3iv(location, count, v))
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006412 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006413 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006414 }
6415 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006416 }
6417 catch(std::bad_alloc&)
6418 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006419 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006420 }
6421}
6422
6423void __stdcall glUniform4f(GLint location, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
6424{
6425 GLfloat xyzw[4] = {x, y, z, w};
6426
6427 glUniform4fv(location, 1, (GLfloat*)&xyzw);
6428}
6429
6430void __stdcall glUniform4fv(GLint location, GLsizei count, const GLfloat* v)
6431{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006432 EVENT("(GLint location = %d, GLsizei count = %d, const GLfloat* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006433
6434 try
6435 {
6436 if (count < 0)
6437 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006438 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006439 }
6440
6441 if (location == -1)
6442 {
6443 return;
6444 }
6445
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006446 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006447
6448 if (context)
6449 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00006450 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006451 if (!programBinary)
6452 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006453 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006454 }
6455
6456 if (!programBinary->setUniform4fv(location, count, v))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006457 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006458 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006459 }
6460 }
6461 }
6462 catch(std::bad_alloc&)
6463 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006464 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006465 }
6466}
6467
6468void __stdcall glUniform4i(GLint location, GLint x, GLint y, GLint z, GLint w)
6469{
6470 GLint xyzw[4] = {x, y, z, w};
6471
6472 glUniform4iv(location, 1, (GLint*)&xyzw);
6473}
6474
6475void __stdcall glUniform4iv(GLint location, GLsizei count, const GLint* v)
6476{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006477 EVENT("(GLint location = %d, GLsizei count = %d, const GLint* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006478
6479 try
6480 {
6481 if (count < 0)
6482 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006483 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006484 }
6485
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006486 if (location == -1)
6487 {
6488 return;
6489 }
6490
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006491 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006492
6493 if (context)
6494 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00006495 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006496 if (!programBinary)
6497 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006498 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006499 }
6500
6501 if (!programBinary->setUniform4iv(location, count, v))
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006502 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006503 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006504 }
6505 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006506 }
6507 catch(std::bad_alloc&)
6508 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006509 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006510 }
6511}
6512
6513void __stdcall glUniformMatrix2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
6514{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006515 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00006516 location, count, transpose, value);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006517
6518 try
6519 {
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00006520 if (count < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006521 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006522 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006523 }
6524
6525 if (location == -1)
6526 {
6527 return;
6528 }
6529
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006530 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006531
6532 if (context)
6533 {
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00006534 if (transpose != GL_FALSE && context->getClientVersion() < 3)
6535 {
6536 return gl::error(GL_INVALID_VALUE);
6537 }
6538
daniel@transgaming.com62a28462012-07-24 18:33:59 +00006539 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006540 if (!programBinary)
6541 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006542 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006543 }
6544
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00006545 if (!programBinary->setUniformMatrix2fv(location, count, transpose, value))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006546 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006547 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006548 }
6549 }
6550 }
6551 catch(std::bad_alloc&)
6552 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006553 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006554 }
6555}
6556
6557void __stdcall glUniformMatrix3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
6558{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006559 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00006560 location, count, transpose, value);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006561
6562 try
6563 {
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00006564 if (count < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006565 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006566 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006567 }
6568
6569 if (location == -1)
6570 {
6571 return;
6572 }
6573
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006574 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006575
6576 if (context)
6577 {
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00006578 if (transpose != GL_FALSE && context->getClientVersion() < 3)
6579 {
6580 return gl::error(GL_INVALID_VALUE);
6581 }
6582
daniel@transgaming.com62a28462012-07-24 18:33:59 +00006583 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006584 if (!programBinary)
6585 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006586 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006587 }
6588
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00006589 if (!programBinary->setUniformMatrix3fv(location, count, transpose, value))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006590 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006591 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006592 }
6593 }
6594 }
6595 catch(std::bad_alloc&)
6596 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006597 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006598 }
6599}
6600
6601void __stdcall glUniformMatrix4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
6602{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006603 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00006604 location, count, transpose, value);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006605
6606 try
6607 {
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00006608 if (count < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006609 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006610 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006611 }
6612
6613 if (location == -1)
6614 {
6615 return;
6616 }
6617
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006618 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006619
6620 if (context)
6621 {
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00006622 if (transpose != GL_FALSE && context->getClientVersion() < 3)
6623 {
6624 return gl::error(GL_INVALID_VALUE);
6625 }
6626
daniel@transgaming.com62a28462012-07-24 18:33:59 +00006627 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006628 if (!programBinary)
6629 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006630 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006631 }
6632
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00006633 if (!programBinary->setUniformMatrix4fv(location, count, transpose, value))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006634 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006635 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006636 }
6637 }
6638 }
6639 catch(std::bad_alloc&)
6640 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006641 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006642 }
6643}
6644
6645void __stdcall glUseProgram(GLuint program)
6646{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006647 EVENT("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006648
6649 try
6650 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006651 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006652
6653 if (context)
6654 {
6655 gl::Program *programObject = context->getProgram(program);
6656
daniel@transgaming.comc8478202010-04-13 19:53:35 +00006657 if (!programObject && program != 0)
6658 {
6659 if (context->getShader(program))
6660 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006661 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comc8478202010-04-13 19:53:35 +00006662 }
6663 else
6664 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006665 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comc8478202010-04-13 19:53:35 +00006666 }
6667 }
6668
daniel@transgaming.com716056c2012-07-24 18:38:59 +00006669 if (program != 0 && !programObject->isLinked())
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006670 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006671 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006672 }
6673
6674 context->useProgram(program);
6675 }
6676 }
6677 catch(std::bad_alloc&)
6678 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006679 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006680 }
6681}
6682
6683void __stdcall glValidateProgram(GLuint program)
6684{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006685 EVENT("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006686
6687 try
6688 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006689 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00006690
6691 if (context)
6692 {
6693 gl::Program *programObject = context->getProgram(program);
6694
6695 if (!programObject)
6696 {
6697 if (context->getShader(program))
6698 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006699 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00006700 }
6701 else
6702 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006703 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00006704 }
6705 }
6706
apatrick@chromium.org253b8d22012-06-22 19:27:21 +00006707 programObject->validate();
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00006708 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006709 }
6710 catch(std::bad_alloc&)
6711 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006712 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006713 }
6714}
6715
6716void __stdcall glVertexAttrib1f(GLuint index, GLfloat x)
6717{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006718 EVENT("(GLuint index = %d, GLfloat x = %f)", index, x);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006719
6720 try
6721 {
6722 if (index >= gl::MAX_VERTEX_ATTRIBS)
6723 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006724 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006725 }
6726
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006727 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006728
6729 if (context)
6730 {
6731 GLfloat vals[4] = { x, 0, 0, 1 };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00006732 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006733 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006734 }
6735 catch(std::bad_alloc&)
6736 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006737 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006738 }
6739}
6740
6741void __stdcall glVertexAttrib1fv(GLuint index, const GLfloat* values)
6742{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006743 EVENT("(GLuint index = %d, const GLfloat* values = 0x%0.8p)", index, values);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006744
6745 try
6746 {
6747 if (index >= gl::MAX_VERTEX_ATTRIBS)
6748 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006749 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006750 }
6751
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006752 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006753
6754 if (context)
6755 {
6756 GLfloat vals[4] = { values[0], 0, 0, 1 };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00006757 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006758 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006759 }
6760 catch(std::bad_alloc&)
6761 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006762 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006763 }
6764}
6765
6766void __stdcall glVertexAttrib2f(GLuint index, GLfloat x, GLfloat y)
6767{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006768 EVENT("(GLuint index = %d, GLfloat x = %f, GLfloat y = %f)", index, x, y);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006769
6770 try
6771 {
6772 if (index >= gl::MAX_VERTEX_ATTRIBS)
6773 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006774 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006775 }
6776
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006777 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006778
6779 if (context)
6780 {
6781 GLfloat vals[4] = { x, y, 0, 1 };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00006782 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006783 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006784 }
6785 catch(std::bad_alloc&)
6786 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006787 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006788 }
6789}
6790
6791void __stdcall glVertexAttrib2fv(GLuint index, const GLfloat* values)
6792{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006793 EVENT("(GLuint index = %d, const GLfloat* values = 0x%0.8p)", index, values);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006794
6795 try
6796 {
6797 if (index >= gl::MAX_VERTEX_ATTRIBS)
6798 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006799 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006800 }
6801
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006802 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006803
6804 if (context)
6805 {
6806 GLfloat vals[4] = { values[0], values[1], 0, 1 };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00006807 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006808 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006809 }
6810 catch(std::bad_alloc&)
6811 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006812 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006813 }
6814}
6815
6816void __stdcall glVertexAttrib3f(GLuint index, GLfloat x, GLfloat y, GLfloat z)
6817{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006818 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 +00006819
6820 try
6821 {
6822 if (index >= gl::MAX_VERTEX_ATTRIBS)
6823 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006824 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006825 }
6826
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006827 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006828
6829 if (context)
6830 {
6831 GLfloat vals[4] = { x, y, z, 1 };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00006832 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006833 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006834 }
6835 catch(std::bad_alloc&)
6836 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006837 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006838 }
6839}
6840
6841void __stdcall glVertexAttrib3fv(GLuint index, const GLfloat* values)
6842{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006843 EVENT("(GLuint index = %d, const GLfloat* values = 0x%0.8p)", index, values);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006844
6845 try
6846 {
6847 if (index >= gl::MAX_VERTEX_ATTRIBS)
6848 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006849 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006850 }
6851
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006852 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006853
6854 if (context)
6855 {
6856 GLfloat vals[4] = { values[0], values[1], values[2], 1 };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00006857 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006858 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006859 }
6860 catch(std::bad_alloc&)
6861 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006862 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006863 }
6864}
6865
6866void __stdcall glVertexAttrib4f(GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
6867{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006868 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 +00006869
6870 try
6871 {
6872 if (index >= gl::MAX_VERTEX_ATTRIBS)
6873 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006874 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006875 }
6876
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006877 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006878
6879 if (context)
6880 {
6881 GLfloat vals[4] = { x, y, z, w };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00006882 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006883 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006884 }
6885 catch(std::bad_alloc&)
6886 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006887 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006888 }
6889}
6890
6891void __stdcall glVertexAttrib4fv(GLuint index, const GLfloat* values)
6892{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006893 EVENT("(GLuint index = %d, const GLfloat* values = 0x%0.8p)", index, values);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006894
6895 try
6896 {
6897 if (index >= gl::MAX_VERTEX_ATTRIBS)
6898 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006899 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006900 }
6901
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006902 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006903
6904 if (context)
6905 {
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00006906 context->setVertexAttribf(index, values);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006907 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006908 }
6909 catch(std::bad_alloc&)
6910 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006911 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006912 }
6913}
6914
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00006915void __stdcall glVertexAttribDivisorANGLE(GLuint index, GLuint divisor)
6916{
6917 EVENT("(GLuint index = %d, GLuint divisor = %d)", index, divisor);
6918
6919 try
6920 {
6921 if (index >= gl::MAX_VERTEX_ATTRIBS)
6922 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006923 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00006924 }
6925
6926 gl::Context *context = gl::getNonLostContext();
6927
6928 if (context)
6929 {
6930 context->setVertexAttribDivisor(index, divisor);
6931 }
6932 }
6933 catch(std::bad_alloc&)
6934 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006935 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00006936 }
6937}
6938
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00006939void __stdcall glVertexAttribPointer(GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid* ptr)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006940{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006941 EVENT("(GLuint index = %d, GLint size = %d, GLenum type = 0x%X, "
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006942 "GLboolean normalized = %u, GLsizei stride = %d, const GLvoid* ptr = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00006943 index, size, type, normalized, stride, ptr);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006944
6945 try
6946 {
6947 if (index >= gl::MAX_VERTEX_ATTRIBS)
6948 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006949 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006950 }
6951
6952 if (size < 1 || size > 4)
6953 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006954 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006955 }
6956
shannon.woods%transgaming.com@gtempaccount.com1a4e09a2013-04-13 03:33:30 +00006957 gl::Context *context = gl::getNonLostContext();
6958
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006959 switch (type)
6960 {
6961 case GL_BYTE:
6962 case GL_UNSIGNED_BYTE:
6963 case GL_SHORT:
6964 case GL_UNSIGNED_SHORT:
6965 case GL_FIXED:
6966 case GL_FLOAT:
6967 break;
shannon.woods%transgaming.com@gtempaccount.com1a4e09a2013-04-13 03:33:30 +00006968 case GL_HALF_FLOAT:
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00006969 case GL_INT:
6970 case GL_UNSIGNED_INT:
shannon.woods%transgaming.com@gtempaccount.com1ab57be2013-04-13 03:38:39 +00006971 case GL_INT_2_10_10_10_REV:
6972 case GL_UNSIGNED_INT_2_10_10_10_REV:
shannon.woods%transgaming.com@gtempaccount.com1a4e09a2013-04-13 03:33:30 +00006973 if (context && context->getClientVersion() < 3)
6974 {
6975 return gl::error(GL_INVALID_ENUM);
6976 }
6977 else
6978 {
6979 break;
6980 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006981 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006982 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006983 }
6984
6985 if (stride < 0)
6986 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006987 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006988 }
6989
shannon.woods%transgaming.com@gtempaccount.com1ab57be2013-04-13 03:38:39 +00006990 if ((type == GL_INT_2_10_10_10_REV || type == GL_UNSIGNED_INT_2_10_10_10_REV) && size != 4)
6991 {
6992 return gl::error(GL_INVALID_OPERATION);
6993 }
6994
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006995 if (context)
6996 {
shannon.woods%transgaming.com@gtempaccount.com8de4e6a2013-04-13 03:37:44 +00006997 context->setVertexAttribState(index, context->getArrayBuffer(), size, type,
6998 normalized == GL_TRUE, false, stride, ptr);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006999 }
7000 }
7001 catch(std::bad_alloc&)
7002 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007003 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007004 }
7005}
7006
7007void __stdcall glViewport(GLint x, GLint y, GLsizei width, GLsizei height)
7008{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00007009 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 +00007010
7011 try
7012 {
7013 if (width < 0 || height < 0)
7014 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007015 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007016 }
7017
daniel@transgaming.com9d788502011-11-09 17:46:55 +00007018 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007019
7020 if (context)
7021 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00007022 context->setViewportParams(x, y, width, height);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007023 }
7024 }
7025 catch(std::bad_alloc&)
7026 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007027 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007028 }
7029}
7030
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007031// OpenGL ES 3.0 functions
7032
7033void __stdcall glReadBuffer(GLenum mode)
7034{
7035 EVENT("(GLenum mode = 0x%X)", mode);
7036
7037 try
7038 {
7039 gl::Context *context = gl::getNonLostContext();
7040
7041 if (context)
7042 {
7043 if (context->getClientVersion() < 3)
7044 {
7045 return gl::error(GL_INVALID_OPERATION);
7046 }
7047 }
7048
7049 UNIMPLEMENTED();
7050 }
7051 catch(std::bad_alloc&)
7052 {
7053 return gl::error(GL_OUT_OF_MEMORY);
7054 }
7055}
7056
7057void __stdcall glDrawRangeElements(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid* indices)
7058{
7059 EVENT("(GLenum mode = 0x%X, GLuint start = %u, GLuint end = %u, GLsizei count = %d, GLenum type = 0x%X, "
7060 "const GLvoid* indices = 0x%0.8p)", mode, start, end, count, type, indices);
7061
7062 try
7063 {
7064 gl::Context *context = gl::getNonLostContext();
7065
7066 if (context)
7067 {
7068 if (context->getClientVersion() < 3)
7069 {
7070 return gl::error(GL_INVALID_OPERATION);
7071 }
7072 }
7073
7074 UNIMPLEMENTED();
7075 }
7076 catch(std::bad_alloc&)
7077 {
7078 return gl::error(GL_OUT_OF_MEMORY);
7079 }
7080}
7081
7082void __stdcall glTexImage3D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid* pixels)
7083{
7084 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint internalformat = %d, GLsizei width = %d, "
7085 "GLsizei height = %d, GLsizei depth = %d, GLint border = %d, GLenum format = 0x%X, "
7086 "GLenum type = 0x%X, const GLvoid* pixels = 0x%0.8p)",
7087 target, level, internalformat, width, height, depth, border, format, type, pixels);
7088
7089 try
7090 {
7091 gl::Context *context = gl::getNonLostContext();
7092
7093 if (context)
7094 {
7095 if (context->getClientVersion() < 3)
7096 {
7097 return gl::error(GL_INVALID_OPERATION);
7098 }
7099 }
7100
7101 UNIMPLEMENTED();
7102 }
7103 catch(std::bad_alloc&)
7104 {
7105 return gl::error(GL_OUT_OF_MEMORY);
7106 }
7107}
7108
7109void __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)
7110{
7111 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
7112 "GLint zoffset = %d, GLsizei width = %d, GLsizei height = %d, GLsizei depth = %d, "
7113 "GLenum format = 0x%X, GLenum type = 0x%X, const GLvoid* pixels = 0x%0.8p)",
7114 target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels);
7115
7116 try
7117 {
7118 gl::Context *context = gl::getNonLostContext();
7119
7120 if (context)
7121 {
7122 if (context->getClientVersion() < 3)
7123 {
7124 return gl::error(GL_INVALID_OPERATION);
7125 }
7126 }
7127
7128 UNIMPLEMENTED();
7129 }
7130 catch(std::bad_alloc&)
7131 {
7132 return gl::error(GL_OUT_OF_MEMORY);
7133 }
7134}
7135
7136void __stdcall glCopyTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height)
7137{
7138 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
7139 "GLint zoffset = %d, GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d)",
7140 target, level, xoffset, yoffset, zoffset, x, y, width, height);
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 glCompressedTexImage3D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid* data)
7163{
7164 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint internalformat = %d, GLsizei width = %d, "
7165 "GLsizei height = %d, GLsizei depth = %d, GLint border = %d, GLsizei imageSize = %d, "
7166 "const GLvoid* data = 0x%0.8p)",
7167 target, level, internalformat, width, height, depth, border, imageSize, data);
7168
7169 try
7170 {
7171 gl::Context *context = gl::getNonLostContext();
7172
7173 if (context)
7174 {
7175 if (context->getClientVersion() < 3)
7176 {
7177 return gl::error(GL_INVALID_OPERATION);
7178 }
7179 }
7180
7181 UNIMPLEMENTED();
7182 }
7183 catch(std::bad_alloc&)
7184 {
7185 return gl::error(GL_OUT_OF_MEMORY);
7186 }
7187}
7188
7189void __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)
7190{
7191 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
7192 "GLint zoffset = %d, GLsizei width = %d, GLsizei height = %d, GLsizei depth = %d, "
7193 "GLenum format = 0x%X, GLsizei imageSize = %d, const GLvoid* data = 0x%0.8p)",
7194 target, level, xoffset, yoffset, zoffset, width, height, depth, format, imageSize, data);
7195
7196 try
7197 {
7198 gl::Context *context = gl::getNonLostContext();
7199
7200 if (context)
7201 {
7202 if (context->getClientVersion() < 3)
7203 {
7204 return gl::error(GL_INVALID_OPERATION);
7205 }
7206 }
7207
7208 UNIMPLEMENTED();
7209 }
7210 catch(std::bad_alloc&)
7211 {
7212 return gl::error(GL_OUT_OF_MEMORY);
7213 }
7214}
7215
7216void __stdcall glGenQueries(GLsizei n, GLuint* ids)
7217{
7218 EVENT("(GLsizei n = %d, GLuint* ids = 0x%0.8p)", n, ids);
7219
7220 try
7221 {
7222 gl::Context *context = gl::getNonLostContext();
7223
7224 if (context)
7225 {
7226 if (context->getClientVersion() < 3)
7227 {
7228 return gl::error(GL_INVALID_OPERATION);
7229 }
7230 }
7231
7232 UNIMPLEMENTED();
7233 }
7234 catch(std::bad_alloc&)
7235 {
7236 return gl::error(GL_OUT_OF_MEMORY);
7237 }
7238}
7239
7240void __stdcall glDeleteQueries(GLsizei n, const GLuint* ids)
7241{
7242 EVENT("(GLsizei n = %d, GLuint* ids = 0x%0.8p)", n, ids);
7243
7244 try
7245 {
7246 gl::Context *context = gl::getNonLostContext();
7247
7248 if (context)
7249 {
7250 if (context->getClientVersion() < 3)
7251 {
7252 return gl::error(GL_INVALID_OPERATION);
7253 }
7254 }
7255
7256 UNIMPLEMENTED();
7257 }
7258 catch(std::bad_alloc&)
7259 {
7260 return gl::error(GL_OUT_OF_MEMORY);
7261 }
7262}
7263
7264GLboolean __stdcall glIsQuery(GLuint id)
7265{
7266 EVENT("(GLuint id = %u)", id);
7267
7268 try
7269 {
7270 gl::Context *context = gl::getNonLostContext();
7271
7272 if (context)
7273 {
7274 if (context->getClientVersion() < 3)
7275 {
7276 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
7277 }
7278 }
7279
7280 UNIMPLEMENTED();
7281 }
7282 catch(std::bad_alloc&)
7283 {
7284 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
7285 }
7286
7287 return GL_FALSE;
7288}
7289
7290void __stdcall glBeginQuery(GLenum target, GLuint id)
7291{
7292 EVENT("(GLenum target = 0x%X, GLuint id = %u)", target, id);
7293
7294 try
7295 {
7296 gl::Context *context = gl::getNonLostContext();
7297
7298 if (context)
7299 {
7300 if (context->getClientVersion() < 3)
7301 {
7302 return gl::error(GL_INVALID_OPERATION);
7303 }
7304 }
7305
7306 UNIMPLEMENTED();
7307 }
7308 catch(std::bad_alloc&)
7309 {
7310 return gl::error(GL_OUT_OF_MEMORY);
7311 }
7312}
7313
7314void __stdcall glEndQuery(GLenum target)
7315{
7316 EVENT("(GLenum target = 0x%X)", target);
7317
7318 try
7319 {
7320 gl::Context *context = gl::getNonLostContext();
7321
7322 if (context)
7323 {
7324 if (context->getClientVersion() < 3)
7325 {
7326 return gl::error(GL_INVALID_OPERATION);
7327 }
7328 }
7329
7330 UNIMPLEMENTED();
7331 }
7332 catch(std::bad_alloc&)
7333 {
7334 return gl::error(GL_OUT_OF_MEMORY);
7335 }
7336}
7337
7338void __stdcall glGetQueryiv(GLenum target, GLenum pname, GLint* params)
7339{
7340 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLint* params = 0x%0.8p)", target, pname, params);
7341
7342 try
7343 {
7344 gl::Context *context = gl::getNonLostContext();
7345
7346 if (context)
7347 {
7348 if (context->getClientVersion() < 3)
7349 {
7350 return gl::error(GL_INVALID_OPERATION);
7351 }
7352 }
7353
7354 UNIMPLEMENTED();
7355 }
7356 catch(std::bad_alloc&)
7357 {
7358 return gl::error(GL_OUT_OF_MEMORY);
7359 }
7360}
7361
7362void __stdcall glGetQueryObjectuiv(GLuint id, GLenum pname, GLuint* params)
7363{
7364 EVENT("(GLuint id = %u, GLenum pname = 0x%X, GLint* params = 0x%0.8p)", id, pname, params);
7365
7366 try
7367 {
7368 gl::Context *context = gl::getNonLostContext();
7369
7370 if (context)
7371 {
7372 if (context->getClientVersion() < 3)
7373 {
7374 return gl::error(GL_INVALID_OPERATION);
7375 }
7376 }
7377
7378 UNIMPLEMENTED();
7379 }
7380 catch(std::bad_alloc&)
7381 {
7382 return gl::error(GL_OUT_OF_MEMORY);
7383 }
7384}
7385
7386GLboolean __stdcall glUnmapBuffer(GLenum target)
7387{
7388 EVENT("(GLenum target = 0x%X)", target);
7389
7390 try
7391 {
7392 gl::Context *context = gl::getNonLostContext();
7393
7394 if (context)
7395 {
7396 if (context->getClientVersion() < 3)
7397 {
7398 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
7399 }
7400 }
7401
7402 UNIMPLEMENTED();
7403 }
7404 catch(std::bad_alloc&)
7405 {
7406 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
7407 }
7408
7409 return GL_FALSE;
7410}
7411
7412void __stdcall glGetBufferPointerv(GLenum target, GLenum pname, GLvoid** params)
7413{
7414 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLvoid** params = 0x%0.8p)", target, pname, params);
7415
7416 try
7417 {
7418 gl::Context *context = gl::getNonLostContext();
7419
7420 if (context)
7421 {
7422 if (context->getClientVersion() < 3)
7423 {
7424 return gl::error(GL_INVALID_OPERATION);
7425 }
7426 }
7427
7428 UNIMPLEMENTED();
7429 }
7430 catch(std::bad_alloc&)
7431 {
7432 return gl::error(GL_OUT_OF_MEMORY);
7433 }
7434}
7435
7436void __stdcall glDrawBuffers(GLsizei n, const GLenum* bufs)
7437{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007438 try
7439 {
7440 gl::Context *context = gl::getNonLostContext();
7441
7442 if (context)
7443 {
7444 if (context->getClientVersion() < 3)
7445 {
7446 return gl::error(GL_INVALID_OPERATION);
7447 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007448
shannon.woods%transgaming.com@gtempaccount.com7948c5f2013-04-13 03:38:58 +00007449 glDrawBuffersEXT(n, bufs);
7450 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007451 }
7452 catch(std::bad_alloc&)
7453 {
7454 return gl::error(GL_OUT_OF_MEMORY);
7455 }
7456}
7457
7458void __stdcall glUniformMatrix2x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
7459{
7460 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
7461 location, count, transpose, value);
7462
7463 try
7464 {
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00007465 if (count < 0)
7466 {
7467 return gl::error(GL_INVALID_VALUE);
7468 }
7469
7470 if (location == -1)
7471 {
7472 return;
7473 }
7474
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007475 gl::Context *context = gl::getNonLostContext();
7476
7477 if (context)
7478 {
7479 if (context->getClientVersion() < 3)
7480 {
7481 return gl::error(GL_INVALID_OPERATION);
7482 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007483
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00007484 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
7485 if (!programBinary)
7486 {
7487 return gl::error(GL_INVALID_OPERATION);
7488 }
7489
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00007490 if (!programBinary->setUniformMatrix2x3fv(location, count, transpose, value))
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00007491 {
7492 return gl::error(GL_INVALID_OPERATION);
7493 }
7494 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007495 }
7496 catch(std::bad_alloc&)
7497 {
7498 return gl::error(GL_OUT_OF_MEMORY);
7499 }
7500}
7501
7502void __stdcall glUniformMatrix3x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
7503{
7504 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
7505 location, count, transpose, value);
7506
7507 try
7508 {
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00007509 if (count < 0)
7510 {
7511 return gl::error(GL_INVALID_VALUE);
7512 }
7513
7514 if (location == -1)
7515 {
7516 return;
7517 }
7518
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007519 gl::Context *context = gl::getNonLostContext();
7520
7521 if (context)
7522 {
7523 if (context->getClientVersion() < 3)
7524 {
7525 return gl::error(GL_INVALID_OPERATION);
7526 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007527
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00007528 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
7529 if (!programBinary)
7530 {
7531 return gl::error(GL_INVALID_OPERATION);
7532 }
7533
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00007534 if (!programBinary->setUniformMatrix3x2fv(location, count, transpose, value))
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00007535 {
7536 return gl::error(GL_INVALID_OPERATION);
7537 }
7538 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007539 }
7540 catch(std::bad_alloc&)
7541 {
7542 return gl::error(GL_OUT_OF_MEMORY);
7543 }
7544}
7545
7546void __stdcall glUniformMatrix2x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
7547{
7548 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
7549 location, count, transpose, value);
7550
7551 try
7552 {
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00007553 if (count < 0)
7554 {
7555 return gl::error(GL_INVALID_VALUE);
7556 }
7557
7558 if (location == -1)
7559 {
7560 return;
7561 }
7562
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007563 gl::Context *context = gl::getNonLostContext();
7564
7565 if (context)
7566 {
7567 if (context->getClientVersion() < 3)
7568 {
7569 return gl::error(GL_INVALID_OPERATION);
7570 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007571
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00007572 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
7573 if (!programBinary)
7574 {
7575 return gl::error(GL_INVALID_OPERATION);
7576 }
7577
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00007578 if (!programBinary->setUniformMatrix2x4fv(location, count, transpose, value))
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00007579 {
7580 return gl::error(GL_INVALID_OPERATION);
7581 }
7582 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007583 }
7584 catch(std::bad_alloc&)
7585 {
7586 return gl::error(GL_OUT_OF_MEMORY);
7587 }
7588}
7589
7590void __stdcall glUniformMatrix4x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
7591{
7592 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
7593 location, count, transpose, value);
7594
7595 try
7596 {
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00007597 if (count < 0)
7598 {
7599 return gl::error(GL_INVALID_VALUE);
7600 }
7601
7602 if (location == -1)
7603 {
7604 return;
7605 }
7606
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007607 gl::Context *context = gl::getNonLostContext();
7608
7609 if (context)
7610 {
7611 if (context->getClientVersion() < 3)
7612 {
7613 return gl::error(GL_INVALID_OPERATION);
7614 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007615
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00007616 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
7617 if (!programBinary)
7618 {
7619 return gl::error(GL_INVALID_OPERATION);
7620 }
7621
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00007622 if (!programBinary->setUniformMatrix4x2fv(location, count, transpose, value))
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00007623 {
7624 return gl::error(GL_INVALID_OPERATION);
7625 }
7626 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007627 }
7628 catch(std::bad_alloc&)
7629 {
7630 return gl::error(GL_OUT_OF_MEMORY);
7631 }
7632}
7633
7634void __stdcall glUniformMatrix3x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
7635{
7636 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
7637 location, count, transpose, value);
7638
7639 try
7640 {
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00007641 if (count < 0)
7642 {
7643 return gl::error(GL_INVALID_VALUE);
7644 }
7645
7646 if (location == -1)
7647 {
7648 return;
7649 }
7650
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007651 gl::Context *context = gl::getNonLostContext();
7652
7653 if (context)
7654 {
7655 if (context->getClientVersion() < 3)
7656 {
7657 return gl::error(GL_INVALID_OPERATION);
7658 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007659
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00007660 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
7661 if (!programBinary)
7662 {
7663 return gl::error(GL_INVALID_OPERATION);
7664 }
7665
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00007666 if (!programBinary->setUniformMatrix3x4fv(location, count, transpose, value))
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00007667 {
7668 return gl::error(GL_INVALID_OPERATION);
7669 }
7670 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007671 }
7672 catch(std::bad_alloc&)
7673 {
7674 return gl::error(GL_OUT_OF_MEMORY);
7675 }
7676}
7677
7678void __stdcall glUniformMatrix4x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
7679{
7680 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
7681 location, count, transpose, value);
7682
7683 try
7684 {
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00007685 if (count < 0)
7686 {
7687 return gl::error(GL_INVALID_VALUE);
7688 }
7689
7690 if (location == -1)
7691 {
7692 return;
7693 }
7694
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007695 gl::Context *context = gl::getNonLostContext();
7696
7697 if (context)
7698 {
7699 if (context->getClientVersion() < 3)
7700 {
7701 return gl::error(GL_INVALID_OPERATION);
7702 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007703
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00007704 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
7705 if (!programBinary)
7706 {
7707 return gl::error(GL_INVALID_OPERATION);
7708 }
7709
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00007710 if (!programBinary->setUniformMatrix4x3fv(location, count, transpose, value))
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00007711 {
7712 return gl::error(GL_INVALID_OPERATION);
7713 }
7714 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007715 }
7716 catch(std::bad_alloc&)
7717 {
7718 return gl::error(GL_OUT_OF_MEMORY);
7719 }
7720}
7721
7722void __stdcall glBlitFramebuffer(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter)
7723{
7724 EVENT("(GLint srcX0 = %d, GLint srcY0 = %d, GLint srcX1 = %d, GLint srcY1 = %d, GLint dstX0 = %d, "
7725 "GLint dstY0 = %d, GLint dstX1 = %d, GLint dstY1 = %d, GLbitfield mask = 0x%X, GLenum filter = 0x%X)",
7726 srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter);
7727
7728 try
7729 {
7730 gl::Context *context = gl::getNonLostContext();
7731
7732 if (context)
7733 {
7734 if (context->getClientVersion() < 3)
7735 {
7736 return gl::error(GL_INVALID_OPERATION);
7737 }
7738 }
7739
7740 UNIMPLEMENTED();
7741 }
7742 catch(std::bad_alloc&)
7743 {
7744 return gl::error(GL_OUT_OF_MEMORY);
7745 }
7746}
7747
7748void __stdcall glRenderbufferStorageMultisample(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height)
7749{
7750 EVENT("(GLenum target = 0x%X, GLsizei samples = %d, GLenum internalformat = 0x%X, GLsizei width = %d, GLsizei height = %d)",
7751 target, samples, internalformat, width, height);
7752
7753 try
7754 {
7755 gl::Context *context = gl::getNonLostContext();
7756
7757 if (context)
7758 {
7759 if (context->getClientVersion() < 3)
7760 {
7761 return gl::error(GL_INVALID_OPERATION);
7762 }
7763 }
7764
7765 UNIMPLEMENTED();
7766 }
7767 catch(std::bad_alloc&)
7768 {
7769 return gl::error(GL_OUT_OF_MEMORY);
7770 }
7771}
7772
7773void __stdcall glFramebufferTextureLayer(GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer)
7774{
7775 EVENT("(GLenum target = 0x%X, GLenum attachment = 0x%X, GLuint texture = %u, GLint level = %d, GLint layer = %d)",
7776 target, attachment, texture, level, layer);
7777
7778 try
7779 {
7780 gl::Context *context = gl::getNonLostContext();
7781
7782 if (context)
7783 {
7784 if (context->getClientVersion() < 3)
7785 {
7786 return gl::error(GL_INVALID_OPERATION);
7787 }
7788 }
7789
7790 UNIMPLEMENTED();
7791 }
7792 catch(std::bad_alloc&)
7793 {
7794 return gl::error(GL_OUT_OF_MEMORY);
7795 }
7796}
7797
7798GLvoid* __stdcall glMapBufferRange(GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access)
7799{
7800 EVENT("(GLenum target = 0x%X, GLintptr offset = %d, GLsizeiptr length = %d, GLbitfield access = 0x%X)",
7801 target, offset, length, access);
7802
7803 try
7804 {
7805 gl::Context *context = gl::getNonLostContext();
7806
7807 if (context)
7808 {
7809 if (context->getClientVersion() < 3)
7810 {
7811 return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLvoid*>(NULL));
7812 }
7813 }
7814
7815 UNIMPLEMENTED();
7816 }
7817 catch(std::bad_alloc&)
7818 {
7819 return gl::error(GL_OUT_OF_MEMORY, reinterpret_cast<GLvoid*>(NULL));
7820 }
7821
7822 return NULL;
7823}
7824
7825void __stdcall glFlushMappedBufferRange(GLenum target, GLintptr offset, GLsizeiptr length)
7826{
7827 EVENT("(GLenum target = 0x%X, GLintptr offset = %d, GLsizeiptr length = %d)", target, offset, length);
7828
7829 try
7830 {
7831 gl::Context *context = gl::getNonLostContext();
7832
7833 if (context)
7834 {
7835 if (context->getClientVersion() < 3)
7836 {
7837 return gl::error(GL_INVALID_OPERATION);
7838 }
7839 }
7840
7841 UNIMPLEMENTED();
7842 }
7843 catch(std::bad_alloc&)
7844 {
7845 return gl::error(GL_OUT_OF_MEMORY);
7846 }
7847}
7848
7849void __stdcall glBindVertexArray(GLuint array)
7850{
7851 EVENT("(GLuint array = %u)", array);
7852
7853 try
7854 {
7855 gl::Context *context = gl::getNonLostContext();
7856
7857 if (context)
7858 {
7859 if (context->getClientVersion() < 3)
7860 {
7861 return gl::error(GL_INVALID_OPERATION);
7862 }
7863 }
7864
7865 UNIMPLEMENTED();
7866 }
7867 catch(std::bad_alloc&)
7868 {
7869 return gl::error(GL_OUT_OF_MEMORY);
7870 }
7871}
7872
7873void __stdcall glDeleteVertexArrays(GLsizei n, const GLuint* arrays)
7874{
7875 EVENT("(GLsizei n = %d, const GLuint* arrays = 0x%0.8p)", n, arrays);
7876
7877 try
7878 {
7879 gl::Context *context = gl::getNonLostContext();
7880
7881 if (context)
7882 {
7883 if (context->getClientVersion() < 3)
7884 {
7885 return gl::error(GL_INVALID_OPERATION);
7886 }
7887 }
7888
7889 UNIMPLEMENTED();
7890 }
7891 catch(std::bad_alloc&)
7892 {
7893 return gl::error(GL_OUT_OF_MEMORY);
7894 }
7895}
7896
7897void __stdcall glGenVertexArrays(GLsizei n, GLuint* arrays)
7898{
7899 EVENT("(GLsizei n = %d, GLuint* arrays = 0x%0.8p)", n, arrays);
7900
7901 try
7902 {
7903 gl::Context *context = gl::getNonLostContext();
7904
7905 if (context)
7906 {
7907 if (context->getClientVersion() < 3)
7908 {
7909 return gl::error(GL_INVALID_OPERATION);
7910 }
7911 }
7912
7913 UNIMPLEMENTED();
7914 }
7915 catch(std::bad_alloc&)
7916 {
7917 return gl::error(GL_OUT_OF_MEMORY);
7918 }
7919}
7920
7921GLboolean __stdcall glIsVertexArray(GLuint array)
7922{
7923 EVENT("(GLuint array = %u)", array);
7924
7925 try
7926 {
7927 gl::Context *context = gl::getNonLostContext();
7928
7929 if (context)
7930 {
7931 if (context->getClientVersion() < 3)
7932 {
7933 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
7934 }
7935 }
7936
7937 UNIMPLEMENTED();
7938 }
7939 catch(std::bad_alloc&)
7940 {
7941 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
7942 }
7943
7944 return GL_FALSE;
7945}
7946
7947void __stdcall glGetIntegeri_v(GLenum target, GLuint index, GLint* data)
7948{
7949 EVENT("(GLenum target = 0x%X, GLuint index = %u, GLint* data = 0x%0.8p)",
7950 target, index, data);
7951
7952 try
7953 {
7954 gl::Context *context = gl::getNonLostContext();
7955
7956 if (context)
7957 {
7958 if (context->getClientVersion() < 3)
7959 {
7960 return gl::error(GL_INVALID_OPERATION);
7961 }
7962 }
7963
7964 UNIMPLEMENTED();
7965 }
7966 catch(std::bad_alloc&)
7967 {
7968 return gl::error(GL_OUT_OF_MEMORY);
7969 }
7970}
7971
7972void __stdcall glBeginTransformFeedback(GLenum primitiveMode)
7973{
7974 EVENT("(GLenum primitiveMode = 0x%X)", primitiveMode);
7975
7976 try
7977 {
7978 gl::Context *context = gl::getNonLostContext();
7979
7980 if (context)
7981 {
7982 if (context->getClientVersion() < 3)
7983 {
7984 return gl::error(GL_INVALID_OPERATION);
7985 }
7986 }
7987
7988 UNIMPLEMENTED();
7989 }
7990 catch(std::bad_alloc&)
7991 {
7992 return gl::error(GL_OUT_OF_MEMORY);
7993 }
7994}
7995
7996void __stdcall glEndTransformFeedback(void)
7997{
7998 EVENT("(void)");
7999
8000 try
8001 {
8002 gl::Context *context = gl::getNonLostContext();
8003
8004 if (context)
8005 {
8006 if (context->getClientVersion() < 3)
8007 {
8008 return gl::error(GL_INVALID_OPERATION);
8009 }
8010 }
8011
8012 UNIMPLEMENTED();
8013 }
8014 catch(std::bad_alloc&)
8015 {
8016 return gl::error(GL_OUT_OF_MEMORY);
8017 }
8018}
8019
8020void __stdcall glBindBufferRange(GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size)
8021{
8022 EVENT("(GLenum target = 0x%X, GLuint index = %u, GLuint buffer = %u, GLintptr offset = %d, GLsizeiptr size = %d)",
8023 target, index, buffer, offset, size);
8024
8025 try
8026 {
8027 gl::Context *context = gl::getNonLostContext();
8028
8029 if (context)
8030 {
8031 if (context->getClientVersion() < 3)
8032 {
8033 return gl::error(GL_INVALID_OPERATION);
8034 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008035
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00008036 switch (target)
8037 {
8038 case GL_TRANSFORM_FEEDBACK_BUFFER:
8039 if (index > context->getMaxTransformFeedbackBufferBindings())
8040 {
8041 return gl::error(GL_INVALID_VALUE);
8042 }
8043 break;
8044
8045 case GL_UNIFORM_BUFFER:
8046 if (index >= context->getMaximumCombinedUniformBufferBindings())
8047 {
8048 return gl::error(GL_INVALID_VALUE);
8049 }
8050 break;
8051
8052 default:
8053 return gl::error(GL_INVALID_ENUM);
8054 }
8055
8056 gl::Buffer *bufferObject = context->getBuffer(buffer);
8057 if (!bufferObject)
8058 {
8059 // Buffer index must not have been valid
8060 return gl::error(GL_INVALID_VALUE);
8061 }
8062
8063 if (size <= 0 || static_cast<unsigned int>(offset + size) > bufferObject->size())
8064 {
8065 return gl::error(GL_INVALID_VALUE);
8066 }
8067
8068 switch (target)
8069 {
8070 case GL_TRANSFORM_FEEDBACK_BUFFER:
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +00008071 context->bindIndexedTransformFeedbackBuffer(buffer, index, offset, size);
8072 context->bindGenericTransformFeedbackBuffer(buffer);
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00008073 break;
8074
8075 case GL_UNIFORM_BUFFER:
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +00008076 context->bindIndexedUniformBuffer(buffer, index, offset, size);
8077 context->bindGenericUniformBuffer(buffer);
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00008078 break;
8079
8080 default:
8081 UNREACHABLE();
8082 }
8083 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008084 }
8085 catch(std::bad_alloc&)
8086 {
8087 return gl::error(GL_OUT_OF_MEMORY);
8088 }
8089}
8090
8091void __stdcall glBindBufferBase(GLenum target, GLuint index, GLuint buffer)
8092{
8093 EVENT("(GLenum target = 0x%X, GLuint index = %u, GLuint buffer = %u)",
8094 target, index, buffer);
8095
8096 try
8097 {
8098 gl::Context *context = gl::getNonLostContext();
8099
8100 if (context)
8101 {
8102 if (context->getClientVersion() < 3)
8103 {
8104 return gl::error(GL_INVALID_OPERATION);
8105 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008106
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00008107 switch (target)
8108 {
8109 case GL_TRANSFORM_FEEDBACK_BUFFER:
8110 if (index > context->getMaxTransformFeedbackBufferBindings())
8111 {
8112 return gl::error(GL_INVALID_VALUE);
8113 }
8114 break;
8115
8116 case GL_UNIFORM_BUFFER:
8117 if (index > context->getMaximumCombinedUniformBufferBindings())
8118 {
8119 return gl::error(GL_INVALID_VALUE);
8120 }
8121 break;
8122
8123 default:
8124 return gl::error(GL_INVALID_ENUM);
8125 }
8126
8127 gl::Buffer *bufferObject = context->getBuffer(buffer);
8128 if (!bufferObject)
8129 {
8130 // Buffer index must not have been valid
8131 return gl::error(GL_INVALID_VALUE);
8132 }
8133
8134 switch (target)
8135 {
8136 case GL_TRANSFORM_FEEDBACK_BUFFER:
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +00008137 context->bindIndexedTransformFeedbackBuffer(buffer, index, 0, -1);
8138 context->bindGenericTransformFeedbackBuffer(buffer);
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00008139 break;
8140
8141 case GL_UNIFORM_BUFFER:
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +00008142 context->bindIndexedUniformBuffer(buffer, index, 0, -1);
8143 context->bindGenericUniformBuffer(buffer);
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00008144 break;
8145
8146 default:
8147 UNREACHABLE();
8148 }
8149 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008150 }
8151 catch(std::bad_alloc&)
8152 {
8153 return gl::error(GL_OUT_OF_MEMORY);
8154 }
8155}
8156
8157void __stdcall glTransformFeedbackVaryings(GLuint program, GLsizei count, const GLchar* const* varyings, GLenum bufferMode)
8158{
8159 EVENT("(GLuint program = %u, GLsizei count = %d, const GLchar* const* varyings = 0x%0.8p, GLenum bufferMode = 0x%X)",
8160 program, count, varyings, bufferMode);
8161
8162 try
8163 {
8164 gl::Context *context = gl::getNonLostContext();
8165
8166 if (context)
8167 {
8168 if (context->getClientVersion() < 3)
8169 {
8170 return gl::error(GL_INVALID_OPERATION);
8171 }
8172 }
8173
8174 UNIMPLEMENTED();
8175 }
8176 catch(std::bad_alloc&)
8177 {
8178 return gl::error(GL_OUT_OF_MEMORY);
8179 }
8180}
8181
8182void __stdcall glGetTransformFeedbackVarying(GLuint program, GLuint index, GLsizei bufSize, GLsizei* length, GLsizei* size, GLenum* type, GLchar* name)
8183{
8184 EVENT("(GLuint program = %u, GLuint index = %u, GLsizei bufSize = %d, GLsizei* length = 0x%0.8p, "
8185 "GLsizei* size = 0x%0.8p, GLenum* type = 0x%0.8p, GLchar* name = 0x%0.8p)",
8186 program, index, bufSize, length, size, type, name);
8187
8188 try
8189 {
8190 gl::Context *context = gl::getNonLostContext();
8191
8192 if (context)
8193 {
8194 if (context->getClientVersion() < 3)
8195 {
8196 return gl::error(GL_INVALID_OPERATION);
8197 }
8198 }
8199
8200 UNIMPLEMENTED();
8201 }
8202 catch(std::bad_alloc&)
8203 {
8204 return gl::error(GL_OUT_OF_MEMORY);
8205 }
8206}
8207
8208void __stdcall glVertexAttribIPointer(GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid* pointer)
8209{
8210 EVENT("(GLuint index = %u, GLint size = %d, GLenum type = 0x%X, GLsizei stride = %d, const GLvoid* pointer = 0x%0.8p)",
8211 index, size, type, stride, pointer);
8212
8213 try
8214 {
8215 gl::Context *context = gl::getNonLostContext();
8216
8217 if (context)
8218 {
8219 if (context->getClientVersion() < 3)
8220 {
8221 return gl::error(GL_INVALID_OPERATION);
8222 }
8223 }
8224
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00008225 if (index >= gl::MAX_VERTEX_ATTRIBS)
8226 {
8227 return gl::error(GL_INVALID_VALUE);
8228 }
8229
8230 if (size < 1 || size > 4)
8231 {
8232 return gl::error(GL_INVALID_VALUE);
8233 }
8234
8235 switch (type)
8236 {
8237 case GL_BYTE:
8238 case GL_UNSIGNED_BYTE:
8239 case GL_SHORT:
8240 case GL_UNSIGNED_SHORT:
8241 case GL_INT:
8242 case GL_UNSIGNED_INT:
shannon.woods%transgaming.com@gtempaccount.com1ab57be2013-04-13 03:38:39 +00008243 case GL_INT_2_10_10_10_REV:
8244 case GL_UNSIGNED_INT_2_10_10_10_REV:
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00008245 break;
8246 default:
8247 return gl::error(GL_INVALID_ENUM);
8248 }
8249
8250 if (stride < 0)
8251 {
8252 return gl::error(GL_INVALID_VALUE);
8253 }
8254
shannon.woods%transgaming.com@gtempaccount.com1ab57be2013-04-13 03:38:39 +00008255 if ((type == GL_INT_2_10_10_10_REV || type == GL_UNSIGNED_INT_2_10_10_10_REV) && size != 4)
8256 {
8257 return gl::error(GL_INVALID_OPERATION);
8258 }
8259
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00008260 if (context)
8261 {
8262 context->setVertexAttribState(index, context->getArrayBuffer(), size, type, false, true,
8263 stride, pointer);
8264 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008265 }
8266 catch(std::bad_alloc&)
8267 {
8268 return gl::error(GL_OUT_OF_MEMORY);
8269 }
8270}
8271
8272void __stdcall glGetVertexAttribIiv(GLuint index, GLenum pname, GLint* params)
8273{
8274 EVENT("(GLuint index = %u, GLenum pname = 0x%X, GLint* params = 0x%0.8p)",
8275 index, pname, params);
8276
8277 try
8278 {
8279 gl::Context *context = gl::getNonLostContext();
8280
8281 if (context)
8282 {
8283 if (context->getClientVersion() < 3)
8284 {
8285 return gl::error(GL_INVALID_OPERATION);
8286 }
8287 }
8288
8289 UNIMPLEMENTED();
8290 }
8291 catch(std::bad_alloc&)
8292 {
8293 return gl::error(GL_OUT_OF_MEMORY);
8294 }
8295}
8296
8297void __stdcall glGetVertexAttribIuiv(GLuint index, GLenum pname, GLuint* params)
8298{
8299 EVENT("(GLuint index = %u, GLenum pname = 0x%X, GLuint* params = 0x%0.8p)",
8300 index, pname, params);
8301
8302 try
8303 {
8304 gl::Context *context = gl::getNonLostContext();
8305
8306 if (context)
8307 {
8308 if (context->getClientVersion() < 3)
8309 {
8310 return gl::error(GL_INVALID_OPERATION);
8311 }
8312 }
8313
8314 UNIMPLEMENTED();
8315 }
8316 catch(std::bad_alloc&)
8317 {
8318 return gl::error(GL_OUT_OF_MEMORY);
8319 }
8320}
8321
8322void __stdcall glVertexAttribI4i(GLuint index, GLint x, GLint y, GLint z, GLint w)
8323{
8324 EVENT("(GLuint index = %u, GLint x = %d, GLint y = %d, GLint z = %d, GLint w = %d)",
8325 index, x, y, z, w);
8326
8327 try
8328 {
8329 gl::Context *context = gl::getNonLostContext();
8330
8331 if (context)
8332 {
8333 if (context->getClientVersion() < 3)
8334 {
8335 return gl::error(GL_INVALID_OPERATION);
8336 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008337
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00008338 if (index >= gl::MAX_VERTEX_ATTRIBS)
8339 {
8340 return gl::error(GL_INVALID_VALUE);
8341 }
8342
8343 GLint vals[4] = { x, y, z, w };
8344 context->setVertexAttribi(index, vals);
8345 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008346 }
8347 catch(std::bad_alloc&)
8348 {
8349 return gl::error(GL_OUT_OF_MEMORY);
8350 }
8351}
8352
8353void __stdcall glVertexAttribI4ui(GLuint index, GLuint x, GLuint y, GLuint z, GLuint w)
8354{
8355 EVENT("(GLuint index = %u, GLuint x = %u, GLuint y = %u, GLuint z = %u, GLuint w = %u)",
8356 index, x, y, z, w);
8357
8358 try
8359 {
8360 gl::Context *context = gl::getNonLostContext();
8361
8362 if (context)
8363 {
8364 if (context->getClientVersion() < 3)
8365 {
8366 return gl::error(GL_INVALID_OPERATION);
8367 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008368
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00008369 if (index >= gl::MAX_VERTEX_ATTRIBS)
8370 {
8371 return gl::error(GL_INVALID_VALUE);
8372 }
8373
8374 GLuint vals[4] = { x, y, z, w };
8375 context->setVertexAttribu(index, vals);
8376 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008377 }
8378 catch(std::bad_alloc&)
8379 {
8380 return gl::error(GL_OUT_OF_MEMORY);
8381 }
8382}
8383
8384void __stdcall glVertexAttribI4iv(GLuint index, const GLint* v)
8385{
8386 EVENT("(GLuint index = %u, const GLint* v = 0x%0.8p)", index, v);
8387
8388 try
8389 {
8390 gl::Context *context = gl::getNonLostContext();
8391
8392 if (context)
8393 {
8394 if (context->getClientVersion() < 3)
8395 {
8396 return gl::error(GL_INVALID_OPERATION);
8397 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008398
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00008399 if (index >= gl::MAX_VERTEX_ATTRIBS)
8400 {
8401 return gl::error(GL_INVALID_VALUE);
8402 }
8403
8404 context->setVertexAttribi(index, v);
8405 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008406 }
8407 catch(std::bad_alloc&)
8408 {
8409 return gl::error(GL_OUT_OF_MEMORY);
8410 }
8411}
8412
8413void __stdcall glVertexAttribI4uiv(GLuint index, const GLuint* v)
8414{
8415 EVENT("(GLuint index = %u, const GLuint* v = 0x%0.8p)", index, v);
8416
8417 try
8418 {
8419 gl::Context *context = gl::getNonLostContext();
8420
8421 if (context)
8422 {
8423 if (context->getClientVersion() < 3)
8424 {
8425 return gl::error(GL_INVALID_OPERATION);
8426 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008427
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00008428 if (index >= gl::MAX_VERTEX_ATTRIBS)
8429 {
8430 return gl::error(GL_INVALID_VALUE);
8431 }
8432
8433 context->setVertexAttribu(index, v);
8434 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008435 }
8436 catch(std::bad_alloc&)
8437 {
8438 return gl::error(GL_OUT_OF_MEMORY);
8439 }
8440}
8441
8442void __stdcall glGetUniformuiv(GLuint program, GLint location, GLuint* params)
8443{
8444 EVENT("(GLuint program = %u, GLint location = %d, GLuint* params = 0x%0.8p)",
8445 program, location, params);
8446
8447 try
8448 {
8449 gl::Context *context = gl::getNonLostContext();
8450
8451 if (context)
8452 {
8453 if (context->getClientVersion() < 3)
8454 {
8455 return gl::error(GL_INVALID_OPERATION);
8456 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008457
shannon.woods%transgaming.com@gtempaccount.come2290122013-04-13 03:41:07 +00008458 if (program == 0)
8459 {
8460 return gl::error(GL_INVALID_VALUE);
8461 }
8462
8463 gl::Program *programObject = context->getProgram(program);
8464
8465 if (!programObject || !programObject->isLinked())
8466 {
8467 return gl::error(GL_INVALID_OPERATION);
8468 }
8469
8470 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
8471 if (!programBinary)
8472 {
8473 return gl::error(GL_INVALID_OPERATION);
8474 }
8475
8476 if (!programBinary->getUniformuiv(location, NULL, params))
8477 {
8478 return gl::error(GL_INVALID_OPERATION);
8479 }
8480 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008481 }
8482 catch(std::bad_alloc&)
8483 {
8484 return gl::error(GL_OUT_OF_MEMORY);
8485 }
8486}
8487
8488GLint __stdcall glGetFragDataLocation(GLuint program, const GLchar *name)
8489{
8490 EVENT("(GLuint program = %u, const GLchar *name = 0x%0.8p)",
8491 program, name);
8492
8493 try
8494 {
8495 gl::Context *context = gl::getNonLostContext();
8496
8497 if (context)
8498 {
8499 if (context->getClientVersion() < 3)
8500 {
8501 return gl::error(GL_INVALID_OPERATION, 0);
8502 }
8503 }
8504
8505 UNIMPLEMENTED();
8506 }
8507 catch(std::bad_alloc&)
8508 {
8509 return gl::error(GL_OUT_OF_MEMORY, 0);
8510 }
8511
8512 return 0;
8513}
8514
8515void __stdcall glUniform1ui(GLint location, GLuint v0)
8516{
shannon.woods%transgaming.com@gtempaccount.com8431b9c2013-04-13 03:40:17 +00008517 glUniform1uiv(location, 1, &v0);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008518}
8519
8520void __stdcall glUniform2ui(GLint location, GLuint v0, GLuint v1)
8521{
shannon.woods%transgaming.com@gtempaccount.com8431b9c2013-04-13 03:40:17 +00008522 const GLuint xy[] = { v0, v1 };
8523 glUniform2uiv(location, 1, xy);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008524}
8525
8526void __stdcall glUniform3ui(GLint location, GLuint v0, GLuint v1, GLuint v2)
8527{
shannon.woods%transgaming.com@gtempaccount.com8431b9c2013-04-13 03:40:17 +00008528 const GLuint xyz[] = { v0, v1, v2 };
8529 glUniform3uiv(location, 1, xyz);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008530}
8531
8532void __stdcall glUniform4ui(GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3)
8533{
shannon.woods%transgaming.com@gtempaccount.com8431b9c2013-04-13 03:40:17 +00008534 const GLuint xyzw[] = { v0, v1, v2, v3 };
8535 glUniform4uiv(location, 1, xyzw);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008536}
8537
8538void __stdcall glUniform1uiv(GLint location, GLsizei count, const GLuint* value)
8539{
8540 EVENT("(GLint location = %d, GLsizei count = %d, const GLuint* value = 0x%0.8p)",
8541 location, count, value);
8542
8543 try
8544 {
8545 gl::Context *context = gl::getNonLostContext();
8546
8547 if (context)
8548 {
8549 if (context->getClientVersion() < 3)
8550 {
8551 return gl::error(GL_INVALID_OPERATION);
8552 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008553
shannon.woods%transgaming.com@gtempaccount.com50ea4ab2013-04-13 03:40:36 +00008554 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
8555 if (!programBinary)
8556 {
8557 return gl::error(GL_INVALID_OPERATION);
8558 }
8559
8560 if (!programBinary->setUniform1uiv(location, count, value))
8561 {
8562 return gl::error(GL_INVALID_OPERATION);
8563 }
8564 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008565 }
8566 catch(std::bad_alloc&)
8567 {
8568 return gl::error(GL_OUT_OF_MEMORY);
8569 }
8570}
8571
8572void __stdcall glUniform2uiv(GLint location, GLsizei count, const GLuint* value)
8573{
8574 EVENT("(GLint location = %d, GLsizei count = %d, const GLuint* value = 0x%0.8p)",
8575 location, count, value);
8576
8577 try
8578 {
8579 gl::Context *context = gl::getNonLostContext();
8580
8581 if (context)
8582 {
8583 if (context->getClientVersion() < 3)
8584 {
8585 return gl::error(GL_INVALID_OPERATION);
8586 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008587
shannon.woods%transgaming.com@gtempaccount.com50ea4ab2013-04-13 03:40:36 +00008588 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
8589 if (!programBinary)
8590 {
8591 return gl::error(GL_INVALID_OPERATION);
8592 }
8593
8594 if (!programBinary->setUniform2uiv(location, count, value))
8595 {
8596 return gl::error(GL_INVALID_OPERATION);
8597 }
8598 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008599 }
8600 catch(std::bad_alloc&)
8601 {
8602 return gl::error(GL_OUT_OF_MEMORY);
8603 }
8604}
8605
8606void __stdcall glUniform3uiv(GLint location, GLsizei count, const GLuint* value)
8607{
8608 EVENT("(GLint location = %d, GLsizei count = %d, const GLuint* value)",
8609 location, count, value);
8610
8611 try
8612 {
8613 gl::Context *context = gl::getNonLostContext();
8614
8615 if (context)
8616 {
8617 if (context->getClientVersion() < 3)
8618 {
8619 return gl::error(GL_INVALID_OPERATION);
8620 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008621
shannon.woods%transgaming.com@gtempaccount.com50ea4ab2013-04-13 03:40:36 +00008622 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
8623 if (!programBinary)
8624 {
8625 return gl::error(GL_INVALID_OPERATION);
8626 }
8627
8628 if (!programBinary->setUniform3uiv(location, count, value))
8629 {
8630 return gl::error(GL_INVALID_OPERATION);
8631 }
8632 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008633 }
8634 catch(std::bad_alloc&)
8635 {
8636 return gl::error(GL_OUT_OF_MEMORY);
8637 }
8638}
8639
8640void __stdcall glUniform4uiv(GLint location, GLsizei count, const GLuint* value)
8641{
8642 EVENT("(GLint location = %d, GLsizei count = %d, const GLuint* value = 0x%0.8p)",
8643 location, count, value);
8644
8645 try
8646 {
8647 gl::Context *context = gl::getNonLostContext();
8648
8649 if (context)
8650 {
8651 if (context->getClientVersion() < 3)
8652 {
8653 return gl::error(GL_INVALID_OPERATION);
8654 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008655
shannon.woods%transgaming.com@gtempaccount.com50ea4ab2013-04-13 03:40:36 +00008656 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
8657 if (!programBinary)
8658 {
8659 return gl::error(GL_INVALID_OPERATION);
8660 }
8661
8662 if (!programBinary->setUniform4uiv(location, count, value))
8663 {
8664 return gl::error(GL_INVALID_OPERATION);
8665 }
8666 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008667 }
8668 catch(std::bad_alloc&)
8669 {
8670 return gl::error(GL_OUT_OF_MEMORY);
8671 }
8672}
8673
8674void __stdcall glClearBufferiv(GLenum buffer, GLint drawbuffer, const GLint* value)
8675{
8676 EVENT("(GLenum buffer = 0x%X, GLint drawbuffer = %d, const GLint* value = 0x%0.8p)",
8677 buffer, drawbuffer, value);
8678
8679 try
8680 {
8681 gl::Context *context = gl::getNonLostContext();
8682
8683 if (context)
8684 {
8685 if (context->getClientVersion() < 3)
8686 {
8687 return gl::error(GL_INVALID_OPERATION);
8688 }
8689 }
8690
8691 UNIMPLEMENTED();
8692 }
8693 catch(std::bad_alloc&)
8694 {
8695 return gl::error(GL_OUT_OF_MEMORY);
8696 }
8697}
8698
8699void __stdcall glClearBufferuiv(GLenum buffer, GLint drawbuffer, const GLuint* value)
8700{
8701 EVENT("(GLenum buffer = 0x%X, GLint drawbuffer = %d, const GLuint* value = 0x%0.8p)",
8702 buffer, drawbuffer, value);
8703
8704 try
8705 {
8706 gl::Context *context = gl::getNonLostContext();
8707
8708 if (context)
8709 {
8710 if (context->getClientVersion() < 3)
8711 {
8712 return gl::error(GL_INVALID_OPERATION);
8713 }
8714 }
8715
8716 UNIMPLEMENTED();
8717 }
8718 catch(std::bad_alloc&)
8719 {
8720 return gl::error(GL_OUT_OF_MEMORY);
8721 }
8722}
8723
8724void __stdcall glClearBufferfv(GLenum buffer, GLint drawbuffer, const GLfloat* value)
8725{
8726 EVENT("(GLenum buffer = 0x%X, GLint drawbuffer = %d, const GLfloat* value = 0x%0.8p)",
8727 buffer, drawbuffer, value);
8728
8729 try
8730 {
8731 gl::Context *context = gl::getNonLostContext();
8732
8733 if (context)
8734 {
8735 if (context->getClientVersion() < 3)
8736 {
8737 return gl::error(GL_INVALID_OPERATION);
8738 }
8739 }
8740
8741 UNIMPLEMENTED();
8742 }
8743 catch(std::bad_alloc&)
8744 {
8745 return gl::error(GL_OUT_OF_MEMORY);
8746 }
8747}
8748
8749void __stdcall glClearBufferfi(GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil)
8750{
8751 EVENT("(GLenum buffer = 0x%X, GLint drawbuffer = %d, GLfloat depth, GLint stencil = %d)",
8752 buffer, drawbuffer, depth, stencil);
8753
8754 try
8755 {
8756 gl::Context *context = gl::getNonLostContext();
8757
8758 if (context)
8759 {
8760 if (context->getClientVersion() < 3)
8761 {
8762 return gl::error(GL_INVALID_OPERATION);
8763 }
8764 }
8765
8766 UNIMPLEMENTED();
8767 }
8768 catch(std::bad_alloc&)
8769 {
8770 return gl::error(GL_OUT_OF_MEMORY);
8771 }
8772}
8773
8774const GLubyte* __stdcall glGetStringi(GLenum name, GLuint index)
8775{
8776 EVENT("(GLenum name = 0x%X, GLuint index = %u)", name, index);
8777
8778 try
8779 {
8780 gl::Context *context = gl::getNonLostContext();
8781
8782 if (context)
8783 {
8784 if (context->getClientVersion() < 3)
8785 {
8786 return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLubyte*>(NULL));
8787 }
8788 }
8789
8790 UNIMPLEMENTED();
8791 }
8792 catch(std::bad_alloc&)
8793 {
8794 return gl::error(GL_OUT_OF_MEMORY, reinterpret_cast<GLubyte*>(NULL));
8795 }
8796
8797 return NULL;
8798}
8799
8800void __stdcall glCopyBufferSubData(GLenum readTarget, GLenum writeTarget, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size)
8801{
8802 EVENT("(GLenum readTarget = 0x%X, GLenum writeTarget = 0x%X, GLintptr readOffset = %d, GLintptr writeOffset = %d, GLsizeiptr size = %d)",
8803 readTarget, writeTarget, readOffset, writeOffset, size);
8804
8805 try
8806 {
8807 gl::Context *context = gl::getNonLostContext();
8808
8809 if (context)
8810 {
8811 if (context->getClientVersion() < 3)
8812 {
8813 return gl::error(GL_INVALID_OPERATION);
8814 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008815
shannon.woods%transgaming.com@gtempaccount.com296c3f22013-04-13 03:39:39 +00008816 gl::Buffer *readBuffer = NULL;
8817 switch (readTarget)
8818 {
8819 case GL_ARRAY_BUFFER:
8820 readBuffer = context->getArrayBuffer();
8821 break;
8822 case GL_COPY_READ_BUFFER:
8823 readBuffer = context->getCopyReadBuffer();
8824 break;
8825 case GL_COPY_WRITE_BUFFER:
8826 readBuffer = context->getCopyWriteBuffer();
8827 break;
8828 case GL_ELEMENT_ARRAY_BUFFER:
8829 readBuffer = context->getElementArrayBuffer();
8830 break;
8831 case GL_PIXEL_PACK_BUFFER:
8832 readBuffer = context->getPixelPackBuffer();
8833 break;
8834 case GL_PIXEL_UNPACK_BUFFER:
8835 readBuffer = context->getPixelUnpackBuffer();
8836 break;
8837 case GL_TRANSFORM_FEEDBACK_BUFFER:
8838 readBuffer = context->getGenericTransformFeedbackBuffer();
8839 break;
8840 case GL_UNIFORM_BUFFER:
8841 readBuffer = context->getGenericUniformBuffer();
8842 break;
8843 default:
8844 return gl::error(GL_INVALID_ENUM);
8845 }
8846
8847 gl::Buffer *writeBuffer = NULL;
8848 switch (writeTarget)
8849 {
8850 case GL_ARRAY_BUFFER:
8851 writeBuffer = context->getArrayBuffer();
8852 break;
8853 case GL_COPY_READ_BUFFER:
8854 writeBuffer = context->getCopyReadBuffer();
8855 break;
8856 case GL_COPY_WRITE_BUFFER:
8857 writeBuffer = context->getCopyWriteBuffer();
8858 break;
8859 case GL_ELEMENT_ARRAY_BUFFER:
8860 writeBuffer = context->getElementArrayBuffer();
8861 break;
8862 case GL_PIXEL_PACK_BUFFER:
8863 writeBuffer = context->getPixelPackBuffer();
8864 break;
8865 case GL_PIXEL_UNPACK_BUFFER:
8866 writeBuffer = context->getPixelUnpackBuffer();
8867 break;
8868 case GL_TRANSFORM_FEEDBACK_BUFFER:
8869 writeBuffer = context->getGenericTransformFeedbackBuffer();
8870 break;
8871 case GL_UNIFORM_BUFFER:
8872 writeBuffer = context->getGenericUniformBuffer();
8873 break;
8874 default:
8875 return gl::error(GL_INVALID_ENUM);
8876 }
8877
8878 if (!readBuffer || !writeBuffer)
8879 {
8880 return gl::error(GL_INVALID_OPERATION);
8881 }
8882
8883 if (readOffset < 0 || writeOffset < 0 || size < 0 ||
8884 static_cast<unsigned int>(readOffset + size) > readBuffer->size() ||
8885 static_cast<unsigned int>(writeOffset + size) > writeBuffer->size())
8886 {
8887 return gl::error(GL_INVALID_VALUE);
8888 }
8889
8890 if (readBuffer == writeBuffer && abs(readOffset - writeOffset) < size)
8891 {
8892 return gl::error(GL_INVALID_VALUE);
8893 }
8894
8895 // TODO: Verify that readBuffer and writeBuffer are not currently mapped (GL_INVALID_OPERATION)
8896
shannon.woods%transgaming.com@gtempaccount.comc53376a2013-04-13 03:41:23 +00008897 // if size is zero, the copy is a successful no-op
8898 if (size > 0)
8899 {
8900 writeBuffer->copyBufferSubData(readBuffer, readOffset, writeOffset, size);
8901 }
shannon.woods%transgaming.com@gtempaccount.com296c3f22013-04-13 03:39:39 +00008902 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008903 }
8904 catch(std::bad_alloc&)
8905 {
8906 return gl::error(GL_OUT_OF_MEMORY);
8907 }
8908}
8909
8910void __stdcall glGetUniformIndices(GLuint program, GLsizei uniformCount, const GLchar* const* uniformNames, GLuint* uniformIndices)
8911{
8912 EVENT("(GLuint program = %u, GLsizei uniformCount = %d, const GLchar* const* uniformNames = 0x%0.8p, GLuint* uniformIndices = 0x%0.8p)",
8913 program, uniformCount, uniformNames, uniformIndices);
8914
8915 try
8916 {
8917 gl::Context *context = gl::getNonLostContext();
8918
8919 if (context)
8920 {
8921 if (context->getClientVersion() < 3)
8922 {
8923 return gl::error(GL_INVALID_OPERATION);
8924 }
8925 }
8926
8927 UNIMPLEMENTED();
8928 }
8929 catch(std::bad_alloc&)
8930 {
8931 return gl::error(GL_OUT_OF_MEMORY);
8932 }
8933}
8934
8935void __stdcall glGetActiveUniformsiv(GLuint program, GLsizei uniformCount, const GLuint* uniformIndices, GLenum pname, GLint* params)
8936{
8937 EVENT("(GLuint program = %u, GLsizei uniformCount = %d, const GLuint* uniformIndices = 0x%0.8p, GLenum pname = 0x%X, GLint* params = 0x%0.8p)",
8938 program, uniformCount, uniformIndices, pname, params);
8939
8940 try
8941 {
8942 gl::Context *context = gl::getNonLostContext();
8943
8944 if (context)
8945 {
8946 if (context->getClientVersion() < 3)
8947 {
8948 return gl::error(GL_INVALID_OPERATION);
8949 }
8950 }
8951
8952 UNIMPLEMENTED();
8953 }
8954 catch(std::bad_alloc&)
8955 {
8956 return gl::error(GL_OUT_OF_MEMORY);
8957 }
8958}
8959
8960GLuint __stdcall glGetUniformBlockIndex(GLuint program, const GLchar* uniformBlockName)
8961{
8962 EVENT("(GLuint program = %u, const GLchar* uniformBlockName = 0x%0.8p)", program, uniformBlockName);
8963
8964 try
8965 {
8966 gl::Context *context = gl::getNonLostContext();
8967
8968 if (context)
8969 {
8970 if (context->getClientVersion() < 3)
8971 {
8972 return gl::error(GL_INVALID_OPERATION, 0);
8973 }
8974 }
8975
8976 UNIMPLEMENTED();
8977 }
8978 catch(std::bad_alloc&)
8979 {
8980 return gl::error(GL_OUT_OF_MEMORY, 0);
8981 }
8982
8983 return 0;
8984}
8985
8986void __stdcall glGetActiveUniformBlockiv(GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint* params)
8987{
8988 EVENT("(GLuint program = %u, GLuint uniformBlockIndex = %u, GLenum pname = 0x%X, GLint* params = 0x%0.8p)",
8989 program, uniformBlockIndex, pname, params);
8990
8991 try
8992 {
8993 gl::Context *context = gl::getNonLostContext();
8994
8995 if (context)
8996 {
8997 if (context->getClientVersion() < 3)
8998 {
8999 return gl::error(GL_INVALID_OPERATION);
9000 }
9001 }
9002
9003 UNIMPLEMENTED();
9004 }
9005 catch(std::bad_alloc&)
9006 {
9007 return gl::error(GL_OUT_OF_MEMORY);
9008 }
9009}
9010
9011void __stdcall glGetActiveUniformBlockName(GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei* length, GLchar* uniformBlockName)
9012{
9013 EVENT("(GLuint program = %u, GLuint uniformBlockIndex = %u, GLsizei bufSize = %d, GLsizei* length = 0x%0.8p, GLchar* uniformBlockName = 0x%0.8p)",
9014 program, uniformBlockIndex, bufSize, length, uniformBlockName);
9015
9016 try
9017 {
9018 gl::Context *context = gl::getNonLostContext();
9019
9020 if (context)
9021 {
9022 if (context->getClientVersion() < 3)
9023 {
9024 return gl::error(GL_INVALID_OPERATION);
9025 }
9026 }
9027
9028 UNIMPLEMENTED();
9029 }
9030 catch(std::bad_alloc&)
9031 {
9032 return gl::error(GL_OUT_OF_MEMORY);
9033 }
9034}
9035
9036void __stdcall glUniformBlockBinding(GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding)
9037{
9038 EVENT("(GLuint program = %u, GLuint uniformBlockIndex = %u, GLuint uniformBlockBinding = %u)",
9039 program, uniformBlockIndex, uniformBlockBinding);
9040
9041 try
9042 {
9043 gl::Context *context = gl::getNonLostContext();
9044
9045 if (context)
9046 {
9047 if (context->getClientVersion() < 3)
9048 {
9049 return gl::error(GL_INVALID_OPERATION);
9050 }
9051 }
9052
9053 UNIMPLEMENTED();
9054 }
9055 catch(std::bad_alloc&)
9056 {
9057 return gl::error(GL_OUT_OF_MEMORY);
9058 }
9059}
9060
9061void __stdcall glDrawArraysInstanced(GLenum mode, GLint first, GLsizei count, GLsizei instanceCount)
9062{
9063 EVENT("(GLenum mode = 0x%X, GLint first = %d, GLsizei count = %d, GLsizei instanceCount = %d)",
9064 mode, first, count, instanceCount);
9065
9066 try
9067 {
9068 gl::Context *context = gl::getNonLostContext();
9069
9070 if (context)
9071 {
9072 if (context->getClientVersion() < 3)
9073 {
9074 return gl::error(GL_INVALID_OPERATION);
9075 }
9076 }
9077
9078 UNIMPLEMENTED();
9079 }
9080 catch(std::bad_alloc&)
9081 {
9082 return gl::error(GL_OUT_OF_MEMORY);
9083 }
9084}
9085
9086void __stdcall glDrawElementsInstanced(GLenum mode, GLsizei count, GLenum type, const GLvoid* indices, GLsizei instanceCount)
9087{
9088 EVENT("(GLenum mode = 0x%X, GLsizei count = %d, GLenum type = 0x%X, const GLvoid* indices = 0x%0.8p, GLsizei instanceCount = %d)",
9089 mode, count, type, indices, instanceCount);
9090
9091 try
9092 {
9093 gl::Context *context = gl::getNonLostContext();
9094
9095 if (context)
9096 {
9097 if (context->getClientVersion() < 3)
9098 {
9099 return gl::error(GL_INVALID_OPERATION);
9100 }
9101 }
9102
9103 UNIMPLEMENTED();
9104 }
9105 catch(std::bad_alloc&)
9106 {
9107 return gl::error(GL_OUT_OF_MEMORY);
9108 }
9109}
9110
9111GLsync __stdcall glFenceSync(GLenum condition, GLbitfield flags)
9112{
9113 EVENT("(GLenum condition = 0x%X, GLbitfield flags = 0x%X)", condition, flags);
9114
9115 try
9116 {
9117 gl::Context *context = gl::getNonLostContext();
9118
9119 if (context)
9120 {
9121 if (context->getClientVersion() < 3)
9122 {
9123 return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLsync>(NULL));
9124 }
9125 }
9126
9127 UNIMPLEMENTED();
9128 }
9129 catch(std::bad_alloc&)
9130 {
9131 return gl::error(GL_OUT_OF_MEMORY, reinterpret_cast<GLsync>(NULL));
9132 }
9133
9134 return NULL;
9135}
9136
9137GLboolean __stdcall glIsSync(GLsync sync)
9138{
9139 EVENT("(GLsync sync = 0x%0.8p)", sync);
9140
9141 try
9142 {
9143 gl::Context *context = gl::getNonLostContext();
9144
9145 if (context)
9146 {
9147 if (context->getClientVersion() < 3)
9148 {
9149 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
9150 }
9151 }
9152
9153 UNIMPLEMENTED();
9154 }
9155 catch(std::bad_alloc&)
9156 {
9157 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
9158 }
9159
9160 return GL_FALSE;
9161}
9162
9163void __stdcall glDeleteSync(GLsync sync)
9164{
9165 EVENT("(GLsync sync = 0x%0.8p)", sync);
9166
9167 try
9168 {
9169 gl::Context *context = gl::getNonLostContext();
9170
9171 if (context)
9172 {
9173 if (context->getClientVersion() < 3)
9174 {
9175 return gl::error(GL_INVALID_OPERATION);
9176 }
9177 }
9178
9179 UNIMPLEMENTED();
9180 }
9181 catch(std::bad_alloc&)
9182 {
9183 return gl::error(GL_OUT_OF_MEMORY);
9184 }
9185}
9186
9187GLenum __stdcall glClientWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout)
9188{
9189 EVENT("(GLsync sync = 0x%0.8p, GLbitfield flags = 0x%X, GLuint64 timeout = %llu)",
9190 sync, flags, timeout);
9191
9192 try
9193 {
9194 gl::Context *context = gl::getNonLostContext();
9195
9196 if (context)
9197 {
9198 if (context->getClientVersion() < 3)
9199 {
9200 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
9201 }
9202 }
9203
9204 UNIMPLEMENTED();
9205 }
9206 catch(std::bad_alloc&)
9207 {
9208 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
9209 }
9210
9211 return GL_FALSE;
9212}
9213
9214void __stdcall glWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout)
9215{
9216 EVENT("(GLsync sync = 0x%0.8p, GLbitfield flags = 0x%X, GLuint64 timeout = %llu)",
9217 sync, flags, timeout);
9218
9219 try
9220 {
9221 gl::Context *context = gl::getNonLostContext();
9222
9223 if (context)
9224 {
9225 if (context->getClientVersion() < 3)
9226 {
9227 return gl::error(GL_INVALID_OPERATION);
9228 }
9229 }
9230
9231 UNIMPLEMENTED();
9232 }
9233 catch(std::bad_alloc&)
9234 {
9235 return gl::error(GL_OUT_OF_MEMORY);
9236 }
9237}
9238
9239void __stdcall glGetInteger64v(GLenum pname, GLint64* params)
9240{
9241 EVENT("(GLenum pname = 0x%X, GLint64* params = 0x%0.8p)",
9242 pname, params);
9243
9244 try
9245 {
9246 gl::Context *context = gl::getNonLostContext();
9247
9248 if (context)
9249 {
9250 if (context->getClientVersion() < 3)
9251 {
9252 return gl::error(GL_INVALID_OPERATION);
9253 }
9254 }
9255
9256 UNIMPLEMENTED();
9257 }
9258 catch(std::bad_alloc&)
9259 {
9260 return gl::error(GL_OUT_OF_MEMORY);
9261 }
9262}
9263
9264void __stdcall glGetSynciv(GLsync sync, GLenum pname, GLsizei bufSize, GLsizei* length, GLint* values)
9265{
9266 EVENT("(GLsync sync = 0x%0.8p, GLenum pname = 0x%X, GLsizei bufSize = %d, GLsizei* length = 0x%0.8p, GLint* values = 0x%0.8p)",
9267 sync, pname, bufSize, length, values);
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);
9278 }
9279 }
9280
9281 UNIMPLEMENTED();
9282 }
9283 catch(std::bad_alloc&)
9284 {
9285 return gl::error(GL_OUT_OF_MEMORY);
9286 }
9287}
9288
9289void __stdcall glGetInteger64i_v(GLenum target, GLuint index, GLint64* data)
9290{
9291 EVENT("(GLenum target = 0x%X, GLuint index = %u, GLint64* data = 0x%0.8p)",
9292 target, index, data);
9293
9294 try
9295 {
9296 gl::Context *context = gl::getNonLostContext();
9297
9298 if (context)
9299 {
9300 if (context->getClientVersion() < 3)
9301 {
9302 return gl::error(GL_INVALID_OPERATION);
9303 }
9304 }
9305
9306 UNIMPLEMENTED();
9307 }
9308 catch(std::bad_alloc&)
9309 {
9310 return gl::error(GL_OUT_OF_MEMORY);
9311 }
9312}
9313
9314void __stdcall glGetBufferParameteri64v(GLenum target, GLenum pname, GLint64* params)
9315{
9316 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLint64* params = 0x%0.8p)",
9317 target, pname, params);
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 glGenSamplers(GLsizei count, GLuint* samplers)
9340{
9341 EVENT("(GLsizei count = %d, GLuint* samplers = 0x%0.8p)", count, samplers);
9342
9343 try
9344 {
9345 gl::Context *context = gl::getNonLostContext();
9346
9347 if (context)
9348 {
9349 if (context->getClientVersion() < 3)
9350 {
9351 return gl::error(GL_INVALID_OPERATION);
9352 }
9353 }
9354
9355 UNIMPLEMENTED();
9356 }
9357 catch(std::bad_alloc&)
9358 {
9359 return gl::error(GL_OUT_OF_MEMORY);
9360 }
9361}
9362
9363void __stdcall glDeleteSamplers(GLsizei count, const GLuint* samplers)
9364{
9365 EVENT("(GLsizei count = %d, const GLuint* samplers = 0x%0.8p)", count, samplers);
9366
9367 try
9368 {
9369 gl::Context *context = gl::getNonLostContext();
9370
9371 if (context)
9372 {
9373 if (context->getClientVersion() < 3)
9374 {
9375 return gl::error(GL_INVALID_OPERATION);
9376 }
9377 }
9378
9379 UNIMPLEMENTED();
9380 }
9381 catch(std::bad_alloc&)
9382 {
9383 return gl::error(GL_OUT_OF_MEMORY);
9384 }
9385}
9386
9387GLboolean __stdcall glIsSampler(GLuint sampler)
9388{
9389 EVENT("(GLuint sampler = %u)", sampler);
9390
9391 try
9392 {
9393 gl::Context *context = gl::getNonLostContext();
9394
9395 if (context)
9396 {
9397 if (context->getClientVersion() < 3)
9398 {
9399 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
9400 }
9401 }
9402
9403 UNIMPLEMENTED();
9404 }
9405 catch(std::bad_alloc&)
9406 {
9407 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
9408 }
9409
9410 return GL_FALSE;
9411}
9412
9413void __stdcall glBindSampler(GLuint unit, GLuint sampler)
9414{
9415 EVENT("(GLuint unit = %u, GLuint sampler = %u)", unit, sampler);
9416
9417 try
9418 {
9419 gl::Context *context = gl::getNonLostContext();
9420
9421 if (context)
9422 {
9423 if (context->getClientVersion() < 3)
9424 {
9425 return gl::error(GL_INVALID_OPERATION);
9426 }
9427 }
9428
9429 UNIMPLEMENTED();
9430 }
9431 catch(std::bad_alloc&)
9432 {
9433 return gl::error(GL_OUT_OF_MEMORY);
9434 }
9435}
9436
9437void __stdcall glSamplerParameteri(GLuint sampler, GLenum pname, GLint param)
9438{
9439 EVENT("(GLuint sampler = %u, GLenum pname = 0x%X, GLint param = %d)", sampler, pname, param);
9440
9441 try
9442 {
9443 gl::Context *context = gl::getNonLostContext();
9444
9445 if (context)
9446 {
9447 if (context->getClientVersion() < 3)
9448 {
9449 return gl::error(GL_INVALID_OPERATION);
9450 }
9451 }
9452
9453 UNIMPLEMENTED();
9454 }
9455 catch(std::bad_alloc&)
9456 {
9457 return gl::error(GL_OUT_OF_MEMORY);
9458 }
9459}
9460
9461void __stdcall glSamplerParameteriv(GLuint sampler, GLenum pname, const GLint* param)
9462{
9463 EVENT("(GLuint sampler = %u, GLenum pname = 0x%X, const GLint* param = 0x%0.8p)",
9464 sampler, pname, param);
9465
9466 try
9467 {
9468 gl::Context *context = gl::getNonLostContext();
9469
9470 if (context)
9471 {
9472 if (context->getClientVersion() < 3)
9473 {
9474 return gl::error(GL_INVALID_OPERATION);
9475 }
9476 }
9477
9478 UNIMPLEMENTED();
9479 }
9480 catch(std::bad_alloc&)
9481 {
9482 return gl::error(GL_OUT_OF_MEMORY);
9483 }
9484}
9485
9486void __stdcall glSamplerParameterf(GLuint sampler, GLenum pname, GLfloat param)
9487{
9488 EVENT("(GLuint sampler = %u, GLenum pname = 0x%X, GLfloat param = %g)", sampler, pname, param);
9489
9490 try
9491 {
9492 gl::Context *context = gl::getNonLostContext();
9493
9494 if (context)
9495 {
9496 if (context->getClientVersion() < 3)
9497 {
9498 return gl::error(GL_INVALID_OPERATION);
9499 }
9500 }
9501
9502 UNIMPLEMENTED();
9503 }
9504 catch(std::bad_alloc&)
9505 {
9506 return gl::error(GL_OUT_OF_MEMORY);
9507 }
9508}
9509
9510void __stdcall glSamplerParameterfv(GLuint sampler, GLenum pname, const GLfloat* param)
9511{
9512 EVENT("(GLuint sampler = %u, GLenum pname = 0x%X, const GLfloat* param = 0x%0.8p)", sampler, pname, param);
9513
9514 try
9515 {
9516 gl::Context *context = gl::getNonLostContext();
9517
9518 if (context)
9519 {
9520 if (context->getClientVersion() < 3)
9521 {
9522 return gl::error(GL_INVALID_OPERATION);
9523 }
9524 }
9525
9526 UNIMPLEMENTED();
9527 }
9528 catch(std::bad_alloc&)
9529 {
9530 return gl::error(GL_OUT_OF_MEMORY);
9531 }
9532}
9533
9534void __stdcall glGetSamplerParameteriv(GLuint sampler, GLenum pname, GLint* params)
9535{
9536 EVENT("(GLuint sampler = %u, GLenum pname = 0x%X, GLint* params = 0x%0.8p)", sampler, pname, params);
9537
9538 try
9539 {
9540 gl::Context *context = gl::getNonLostContext();
9541
9542 if (context)
9543 {
9544 if (context->getClientVersion() < 3)
9545 {
9546 return gl::error(GL_INVALID_OPERATION);
9547 }
9548 }
9549
9550 UNIMPLEMENTED();
9551 }
9552 catch(std::bad_alloc&)
9553 {
9554 return gl::error(GL_OUT_OF_MEMORY);
9555 }
9556}
9557
9558void __stdcall glGetSamplerParameterfv(GLuint sampler, GLenum pname, GLfloat* params)
9559{
9560 EVENT("(GLuint sample = %ur, GLenum pname = 0x%X, GLfloat* params = 0x%0.8p)", sampler, pname, params);
9561
9562 try
9563 {
9564 gl::Context *context = gl::getNonLostContext();
9565
9566 if (context)
9567 {
9568 if (context->getClientVersion() < 3)
9569 {
9570 return gl::error(GL_INVALID_OPERATION);
9571 }
9572 }
9573
9574 UNIMPLEMENTED();
9575 }
9576 catch(std::bad_alloc&)
9577 {
9578 return gl::error(GL_OUT_OF_MEMORY);
9579 }
9580}
9581
9582void __stdcall glVertexAttribDivisor(GLuint index, GLuint divisor)
9583{
9584 EVENT("(GLuint index = %u, GLuint divisor = %u)", index, divisor);
9585
9586 try
9587 {
shannon.woods%transgaming.com@gtempaccount.com8736bd62013-04-13 03:35:41 +00009588 if (index >= gl::MAX_VERTEX_ATTRIBS)
9589 {
9590 return gl::error(GL_INVALID_VALUE);
9591 }
9592
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009593 gl::Context *context = gl::getNonLostContext();
9594
9595 if (context)
9596 {
9597 if (context->getClientVersion() < 3)
9598 {
9599 return gl::error(GL_INVALID_OPERATION);
9600 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009601
shannon.woods%transgaming.com@gtempaccount.com8736bd62013-04-13 03:35:41 +00009602 context->setVertexAttribDivisor(index, divisor);
9603 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009604 }
9605 catch(std::bad_alloc&)
9606 {
9607 return gl::error(GL_OUT_OF_MEMORY);
9608 }
9609}
9610
9611void __stdcall glBindTransformFeedback(GLenum target, GLuint id)
9612{
9613 EVENT("(GLenum target = 0x%X, GLuint id = %u)", target, id);
9614
9615 try
9616 {
9617 gl::Context *context = gl::getNonLostContext();
9618
9619 if (context)
9620 {
9621 if (context->getClientVersion() < 3)
9622 {
9623 return gl::error(GL_INVALID_OPERATION);
9624 }
9625 }
9626
9627 UNIMPLEMENTED();
9628 }
9629 catch(std::bad_alloc&)
9630 {
9631 return gl::error(GL_OUT_OF_MEMORY);
9632 }
9633}
9634
9635void __stdcall glDeleteTransformFeedbacks(GLsizei n, const GLuint* ids)
9636{
9637 EVENT("(GLsizei n = %d, const GLuint* ids = 0x%0.8p)", n, ids);
9638
9639 try
9640 {
9641 gl::Context *context = gl::getNonLostContext();
9642
9643 if (context)
9644 {
9645 if (context->getClientVersion() < 3)
9646 {
9647 return gl::error(GL_INVALID_OPERATION);
9648 }
9649 }
9650
9651 UNIMPLEMENTED();
9652 }
9653 catch(std::bad_alloc&)
9654 {
9655 return gl::error(GL_OUT_OF_MEMORY);
9656 }
9657}
9658
9659void __stdcall glGenTransformFeedbacks(GLsizei n, GLuint* ids)
9660{
9661 EVENT("(GLsizei n = %d, GLuint* ids = 0x%0.8p)", n, ids);
9662
9663 try
9664 {
9665 gl::Context *context = gl::getNonLostContext();
9666
9667 if (context)
9668 {
9669 if (context->getClientVersion() < 3)
9670 {
9671 return gl::error(GL_INVALID_OPERATION);
9672 }
9673 }
9674
9675 UNIMPLEMENTED();
9676 }
9677 catch(std::bad_alloc&)
9678 {
9679 return gl::error(GL_OUT_OF_MEMORY);
9680 }
9681}
9682
9683GLboolean __stdcall glIsTransformFeedback(GLuint id)
9684{
9685 EVENT("(GLuint id = %u)", id);
9686
9687 try
9688 {
9689 gl::Context *context = gl::getNonLostContext();
9690
9691 if (context)
9692 {
9693 if (context->getClientVersion() < 3)
9694 {
9695 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
9696 }
9697 }
9698
9699 UNIMPLEMENTED();
9700 }
9701 catch(std::bad_alloc&)
9702 {
9703 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
9704 }
9705
9706 return GL_FALSE;
9707}
9708
9709void __stdcall glPauseTransformFeedback(void)
9710{
9711 EVENT("(void)");
9712
9713 try
9714 {
9715 gl::Context *context = gl::getNonLostContext();
9716
9717 if (context)
9718 {
9719 if (context->getClientVersion() < 3)
9720 {
9721 return gl::error(GL_INVALID_OPERATION);
9722 }
9723 }
9724
9725 UNIMPLEMENTED();
9726 }
9727 catch(std::bad_alloc&)
9728 {
9729 return gl::error(GL_OUT_OF_MEMORY);
9730 }
9731}
9732
9733void __stdcall glResumeTransformFeedback(void)
9734{
9735 EVENT("(void)");
9736
9737 try
9738 {
9739 gl::Context *context = gl::getNonLostContext();
9740
9741 if (context)
9742 {
9743 if (context->getClientVersion() < 3)
9744 {
9745 return gl::error(GL_INVALID_OPERATION);
9746 }
9747 }
9748
9749 UNIMPLEMENTED();
9750 }
9751 catch(std::bad_alloc&)
9752 {
9753 return gl::error(GL_OUT_OF_MEMORY);
9754 }
9755}
9756
9757void __stdcall glGetProgramBinary(GLuint program, GLsizei bufSize, GLsizei* length, GLenum* binaryFormat, GLvoid* binary)
9758{
9759 EVENT("(GLuint program = %u, GLsizei bufSize = %d, GLsizei* length = 0x%0.8p, GLenum* binaryFormat = 0x%0.8p, GLvoid* binary = 0x%0.8p)",
9760 program, bufSize, length, binaryFormat, binary);
9761
9762 try
9763 {
9764 gl::Context *context = gl::getNonLostContext();
9765
9766 if (context)
9767 {
9768 if (context->getClientVersion() < 3)
9769 {
9770 return gl::error(GL_INVALID_OPERATION);
9771 }
9772 }
9773
9774 UNIMPLEMENTED();
9775 }
9776 catch(std::bad_alloc&)
9777 {
9778 return gl::error(GL_OUT_OF_MEMORY);
9779 }
9780}
9781
9782void __stdcall glProgramBinary(GLuint program, GLenum binaryFormat, const GLvoid* binary, GLsizei length)
9783{
9784 EVENT("(GLuint program = %u, GLenum binaryFormat = 0x%X, const GLvoid* binary = 0x%0.8p, GLsizei length = %d)",
9785 program, binaryFormat, binary, length);
9786
9787 try
9788 {
9789 gl::Context *context = gl::getNonLostContext();
9790
9791 if (context)
9792 {
9793 if (context->getClientVersion() < 3)
9794 {
9795 return gl::error(GL_INVALID_OPERATION);
9796 }
9797 }
9798
9799 UNIMPLEMENTED();
9800 }
9801 catch(std::bad_alloc&)
9802 {
9803 return gl::error(GL_OUT_OF_MEMORY);
9804 }
9805}
9806
9807void __stdcall glProgramParameteri(GLuint program, GLenum pname, GLint value)
9808{
9809 EVENT("(GLuint program = %u, GLenum pname = 0x%X, GLint value = %d)",
9810 program, pname, value);
9811
9812 try
9813 {
9814 gl::Context *context = gl::getNonLostContext();
9815
9816 if (context)
9817 {
9818 if (context->getClientVersion() < 3)
9819 {
9820 return gl::error(GL_INVALID_OPERATION);
9821 }
9822 }
9823
9824 UNIMPLEMENTED();
9825 }
9826 catch(std::bad_alloc&)
9827 {
9828 return gl::error(GL_OUT_OF_MEMORY);
9829 }
9830}
9831
9832void __stdcall glInvalidateFramebuffer(GLenum target, GLsizei numAttachments, const GLenum* attachments)
9833{
9834 EVENT("(GLenum target = 0x%X, GLsizei numAttachments = %d, const GLenum* attachments = 0x%0.8p)",
9835 target, numAttachments, attachments);
9836
9837 try
9838 {
9839 gl::Context *context = gl::getNonLostContext();
9840
9841 if (context)
9842 {
9843 if (context->getClientVersion() < 3)
9844 {
9845 return gl::error(GL_INVALID_OPERATION);
9846 }
9847 }
9848
9849 UNIMPLEMENTED();
9850 }
9851 catch(std::bad_alloc&)
9852 {
9853 return gl::error(GL_OUT_OF_MEMORY);
9854 }
9855}
9856
9857void __stdcall glInvalidateSubFramebuffer(GLenum target, GLsizei numAttachments, const GLenum* attachments, GLint x, GLint y, GLsizei width, GLsizei height)
9858{
9859 EVENT("(GLenum target = 0x%X, GLsizei numAttachments = %d, const GLenum* attachments = 0x%0.8p, GLint x = %d, "
9860 "GLint y = %d, GLsizei width = %d, GLsizei height = %d)",
9861 target, numAttachments, attachments, x, y, width, height);
9862
9863 try
9864 {
9865 gl::Context *context = gl::getNonLostContext();
9866
9867 if (context)
9868 {
9869 if (context->getClientVersion() < 3)
9870 {
9871 return gl::error(GL_INVALID_OPERATION);
9872 }
9873 }
9874
9875 UNIMPLEMENTED();
9876 }
9877 catch(std::bad_alloc&)
9878 {
9879 return gl::error(GL_OUT_OF_MEMORY);
9880 }
9881}
9882
9883void __stdcall glTexStorage2D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height)
9884{
9885 EVENT("(GLenum target = 0x%X, GLsizei levels = %d, GLenum internalformat = 0x%X, GLsizei width = %d, GLsizei height = %d)",
9886 target, levels, internalformat, width, height);
9887
9888 try
9889 {
9890 gl::Context *context = gl::getNonLostContext();
9891
9892 if (context)
9893 {
9894 if (context->getClientVersion() < 3)
9895 {
9896 return gl::error(GL_INVALID_OPERATION);
9897 }
9898 }
9899
9900 UNIMPLEMENTED();
9901 }
9902 catch(std::bad_alloc&)
9903 {
9904 return gl::error(GL_OUT_OF_MEMORY);
9905 }
9906}
9907
9908void __stdcall glTexStorage3D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth)
9909{
9910 EVENT("(GLenum target = 0x%X, GLsizei levels = %d, GLenum internalformat = 0x%X, GLsizei width = %d, "
9911 "GLsizei height = %d, GLsizei depth = %d)",
9912 target, levels, internalformat, width, height, depth);
9913
9914 try
9915 {
9916 gl::Context *context = gl::getNonLostContext();
9917
9918 if (context)
9919 {
9920 if (context->getClientVersion() < 3)
9921 {
9922 return gl::error(GL_INVALID_OPERATION);
9923 }
shannon.woods%transgaming.com@gtempaccount.com14eb55e2013-04-13 03:35:06 +00009924 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009925 }
9926 catch(std::bad_alloc&)
9927 {
9928 return gl::error(GL_OUT_OF_MEMORY);
9929 }
9930}
9931
9932void __stdcall glGetInternalformativ(GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize, GLint* params)
9933{
9934 EVENT("(GLenum target = 0x%X, GLenum internalformat = 0x%X, GLenum pname = 0x%X, GLsizei bufSize = %d, "
9935 "GLint* params = 0x%0.8p)",
9936 target, internalformat, pname, bufSize, params);
9937
9938 try
9939 {
9940 gl::Context *context = gl::getNonLostContext();
9941
9942 if (context)
9943 {
9944 if (context->getClientVersion() < 3)
9945 {
9946 return gl::error(GL_INVALID_OPERATION);
9947 }
9948 }
9949
9950 UNIMPLEMENTED();
9951 }
9952 catch(std::bad_alloc&)
9953 {
9954 return gl::error(GL_OUT_OF_MEMORY);
9955 }
9956}
9957
9958// Extension functions
9959
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +00009960void __stdcall glBlitFramebufferANGLE(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1,
9961 GLbitfield mask, GLenum filter)
9962{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00009963 EVENT("(GLint srcX0 = %d, GLint srcY0 = %d, GLint srcX1 = %d, GLint srcY1 = %d, "
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +00009964 "GLint dstX0 = %d, GLint dstY0 = %d, GLint dstX1 = %d, GLint dstY1 = %d, "
9965 "GLbitfield mask = 0x%X, GLenum filter = 0x%X)",
9966 srcX0, srcY0, srcX1, srcX1, dstX0, dstY0, dstX1, dstY1, mask, filter);
9967
9968 try
9969 {
9970 switch (filter)
9971 {
9972 case GL_NEAREST:
9973 break;
9974 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00009975 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +00009976 }
9977
9978 if ((mask & ~(GL_COLOR_BUFFER_BIT | GL_STENCIL_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)) != 0)
9979 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00009980 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +00009981 }
9982
9983 if (srcX1 - srcX0 != dstX1 - dstX0 || srcY1 - srcY0 != dstY1 - dstY0)
9984 {
9985 ERR("Scaling and flipping in BlitFramebufferANGLE not supported by this implementation");
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00009986 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +00009987 }
9988
daniel@transgaming.com9d788502011-11-09 17:46:55 +00009989 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +00009990
9991 if (context)
9992 {
9993 if (context->getReadFramebufferHandle() == context->getDrawFramebufferHandle())
9994 {
9995 ERR("Blits with the same source and destination framebuffer are not supported by this implementation.");
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00009996 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +00009997 }
9998
9999 context->blitFramebuffer(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask);
10000 }
10001 }
10002 catch(std::bad_alloc&)
10003 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010004 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +000010005 }
10006}
10007
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +000010008void __stdcall glTexImage3DOES(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth,
10009 GLint border, GLenum format, GLenum type, const GLvoid* pixels)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000010010{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +000010011 EVENT("(GLenum target = 0x%X, GLint level = %d, GLenum internalformat = 0x%X, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +000010012 "GLsizei width = %d, GLsizei height = %d, GLsizei depth = %d, GLint border = %d, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +000010013 "GLenum format = 0x%X, GLenum type = 0x%x, const GLvoid* pixels = 0x%0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000010014 target, level, internalformat, width, height, depth, border, format, type, pixels);
10015
10016 try
10017 {
10018 UNIMPLEMENTED(); // FIXME
10019 }
10020 catch(std::bad_alloc&)
10021 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010022 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000010023 }
10024}
daniel@transgaming.comce3d0f22010-05-04 03:35:14 +000010025
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010026void __stdcall glGetProgramBinaryOES(GLuint program, GLsizei bufSize, GLsizei *length,
10027 GLenum *binaryFormat, void *binary)
10028{
apatrick@chromium.org90080e32012-07-09 22:15:33 +000010029 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 +000010030 program, bufSize, length, binaryFormat, binary);
10031
10032 try
10033 {
10034 gl::Context *context = gl::getNonLostContext();
10035
10036 if (context)
10037 {
10038 gl::Program *programObject = context->getProgram(program);
10039
daniel@transgaming.com716056c2012-07-24 18:38:59 +000010040 if (!programObject || !programObject->isLinked())
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010041 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010042 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010043 }
10044
10045 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
10046
10047 if (!programBinary)
10048 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010049 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010050 }
10051
apatrick@chromium.org90080e32012-07-09 22:15:33 +000010052 if (!programBinary->save(binary, bufSize, length))
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010053 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010054 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010055 }
apatrick@chromium.org90080e32012-07-09 22:15:33 +000010056
10057 *binaryFormat = GL_PROGRAM_BINARY_ANGLE;
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010058 }
10059 }
10060 catch(std::bad_alloc&)
10061 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010062 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010063 }
10064}
10065
10066void __stdcall glProgramBinaryOES(GLuint program, GLenum binaryFormat,
10067 const void *binary, GLint length)
10068{
10069 EVENT("(GLenum program = 0x%X, binaryFormat = 0x%x, binary = 0x%0.8p, length = %d)",
10070 program, binaryFormat, binary, length);
10071
10072 try
10073 {
10074 gl::Context *context = gl::getNonLostContext();
10075
10076 if (context)
10077 {
10078 if (binaryFormat != GL_PROGRAM_BINARY_ANGLE)
10079 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010080 return gl::error(GL_INVALID_ENUM);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010081 }
10082
10083 gl::Program *programObject = context->getProgram(program);
10084
10085 if (!programObject)
10086 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010087 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010088 }
10089
daniel@transgaming.com95d29422012-07-24 18:36:10 +000010090 context->setProgramBinary(program, binary, length);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010091 }
10092 }
10093 catch(std::bad_alloc&)
10094 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010095 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010096 }
10097}
10098
shannon.woods%transgaming.com@gtempaccount.com4059a382013-04-13 03:31:16 +000010099void __stdcall glDrawBuffersEXT(GLsizei n, const GLenum *bufs)
10100{
10101 EVENT("(GLenum n = %d, bufs = 0x%0.8p)", n, bufs);
10102
10103 try
10104 {
10105 gl::Context *context = gl::getNonLostContext();
10106
10107 if (context)
10108 {
10109 if (n < 0 || (unsigned int)n > context->getMaximumRenderTargets())
10110 {
10111 return gl::error(GL_INVALID_VALUE);
10112 }
10113
10114 if (context->getDrawFramebufferHandle() == 0)
10115 {
shannon.woods%transgaming.com@gtempaccount.com2fa73c52013-04-13 03:37:20 +000010116 if (n != 1)
shannon.woods%transgaming.com@gtempaccount.com4059a382013-04-13 03:31:16 +000010117 {
10118 return gl::error(GL_INVALID_OPERATION);
10119 }
10120
shannon.woods%transgaming.com@gtempaccount.com2fa73c52013-04-13 03:37:20 +000010121 if (bufs[0] != GL_NONE && bufs[0] != GL_BACK)
shannon.woods%transgaming.com@gtempaccount.com4059a382013-04-13 03:31:16 +000010122 {
shannon.woods%transgaming.com@gtempaccount.com2fa73c52013-04-13 03:37:20 +000010123 return gl::error(GL_INVALID_OPERATION);
shannon.woods%transgaming.com@gtempaccount.com4059a382013-04-13 03:31:16 +000010124 }
10125 }
10126 else
10127 {
10128 for (int colorAttachment = 0; colorAttachment < n; colorAttachment++)
10129 {
10130 const GLenum attachment = GL_COLOR_ATTACHMENT0_EXT + colorAttachment;
10131 if (bufs[colorAttachment] != GL_NONE && bufs[colorAttachment] != attachment)
10132 {
10133 return gl::error(GL_INVALID_OPERATION);
10134 }
10135 }
10136 }
10137
10138 gl::Framebuffer *framebuffer = context->getDrawFramebuffer();
10139
10140 for (int colorAttachment = 0; colorAttachment < n; colorAttachment++)
10141 {
10142 framebuffer->setDrawBufferState(colorAttachment, bufs[colorAttachment]);
10143 }
shannon.woods%transgaming.com@gtempaccount.com2fa73c52013-04-13 03:37:20 +000010144
10145 for (int colorAttachment = n; colorAttachment < (int)context->getMaximumRenderTargets(); colorAttachment++)
10146 {
10147 framebuffer->setDrawBufferState(colorAttachment, GL_NONE);
10148 }
shannon.woods%transgaming.com@gtempaccount.com4059a382013-04-13 03:31:16 +000010149 }
10150 }
10151 catch (std::bad_alloc&)
10152 {
10153 return gl::error(GL_OUT_OF_MEMORY);
10154 }
10155}
10156
daniel@transgaming.comce3d0f22010-05-04 03:35:14 +000010157__eglMustCastToProperFunctionPointerType __stdcall glGetProcAddress(const char *procname)
10158{
10159 struct Extension
10160 {
10161 const char *name;
10162 __eglMustCastToProperFunctionPointerType address;
10163 };
10164
10165 static const Extension glExtensions[] =
10166 {
10167 {"glTexImage3DOES", (__eglMustCastToProperFunctionPointerType)glTexImage3DOES},
daniel@transgaming.com01868132010-08-24 19:21:17 +000010168 {"glBlitFramebufferANGLE", (__eglMustCastToProperFunctionPointerType)glBlitFramebufferANGLE},
daniel@transgaming.com1fe96c92011-01-14 15:08:44 +000010169 {"glRenderbufferStorageMultisampleANGLE", (__eglMustCastToProperFunctionPointerType)glRenderbufferStorageMultisampleANGLE},
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +000010170 {"glDeleteFencesNV", (__eglMustCastToProperFunctionPointerType)glDeleteFencesNV},
10171 {"glGenFencesNV", (__eglMustCastToProperFunctionPointerType)glGenFencesNV},
10172 {"glIsFenceNV", (__eglMustCastToProperFunctionPointerType)glIsFenceNV},
10173 {"glTestFenceNV", (__eglMustCastToProperFunctionPointerType)glTestFenceNV},
10174 {"glGetFenceivNV", (__eglMustCastToProperFunctionPointerType)glGetFenceivNV},
10175 {"glFinishFenceNV", (__eglMustCastToProperFunctionPointerType)glFinishFenceNV},
10176 {"glSetFenceNV", (__eglMustCastToProperFunctionPointerType)glSetFenceNV},
zmo@google.coma574f782011-10-03 21:45:23 +000010177 {"glGetTranslatedShaderSourceANGLE", (__eglMustCastToProperFunctionPointerType)glGetTranslatedShaderSourceANGLE},
daniel@transgaming.com0bd1f2f2011-11-11 04:19:03 +000010178 {"glTexStorage2DEXT", (__eglMustCastToProperFunctionPointerType)glTexStorage2DEXT},
daniel@transgaming.com709ed112011-11-12 03:18:10 +000010179 {"glGetGraphicsResetStatusEXT", (__eglMustCastToProperFunctionPointerType)glGetGraphicsResetStatusEXT},
10180 {"glReadnPixelsEXT", (__eglMustCastToProperFunctionPointerType)glReadnPixelsEXT},
10181 {"glGetnUniformfvEXT", (__eglMustCastToProperFunctionPointerType)glGetnUniformfvEXT},
10182 {"glGetnUniformivEXT", (__eglMustCastToProperFunctionPointerType)glGetnUniformivEXT},
daniel@transgaming.com86bdb822012-01-20 18:24:39 +000010183 {"glGenQueriesEXT", (__eglMustCastToProperFunctionPointerType)glGenQueriesEXT},
10184 {"glDeleteQueriesEXT", (__eglMustCastToProperFunctionPointerType)glDeleteQueriesEXT},
10185 {"glIsQueryEXT", (__eglMustCastToProperFunctionPointerType)glIsQueryEXT},
10186 {"glBeginQueryEXT", (__eglMustCastToProperFunctionPointerType)glBeginQueryEXT},
10187 {"glEndQueryEXT", (__eglMustCastToProperFunctionPointerType)glEndQueryEXT},
10188 {"glGetQueryivEXT", (__eglMustCastToProperFunctionPointerType)glGetQueryivEXT},
10189 {"glGetQueryObjectuivEXT", (__eglMustCastToProperFunctionPointerType)glGetQueryObjectuivEXT},
shannon.woods%transgaming.com@gtempaccount.com77d94722013-04-13 03:34:22 +000010190 {"glDrawBuffersEXT", (__eglMustCastToProperFunctionPointerType)glDrawBuffersEXT},
daniel@transgaming.comdce02fd2012-01-27 15:39:51 +000010191 {"glVertexAttribDivisorANGLE", (__eglMustCastToProperFunctionPointerType)glVertexAttribDivisorANGLE},
10192 {"glDrawArraysInstancedANGLE", (__eglMustCastToProperFunctionPointerType)glDrawArraysInstancedANGLE},
10193 {"glDrawElementsInstancedANGLE", (__eglMustCastToProperFunctionPointerType)glDrawElementsInstancedANGLE},
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010194 {"glGetProgramBinaryOES", (__eglMustCastToProperFunctionPointerType)glGetProgramBinaryOES},
10195 {"glProgramBinaryOES", (__eglMustCastToProperFunctionPointerType)glProgramBinaryOES}, };
daniel@transgaming.comce3d0f22010-05-04 03:35:14 +000010196
shannon.woods@transgaming.comd438fd42013-02-28 23:17:45 +000010197 for (unsigned int ext = 0; ext < ArraySize(glExtensions); ext++)
daniel@transgaming.comce3d0f22010-05-04 03:35:14 +000010198 {
10199 if (strcmp(procname, glExtensions[ext].name) == 0)
10200 {
10201 return (__eglMustCastToProperFunctionPointerType)glExtensions[ext].address;
10202 }
10203 }
10204
10205 return NULL;
10206}
10207
daniel@transgaming.com17f548c2011-11-09 17:47:02 +000010208// Non-public functions used by EGL
10209
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +000010210bool __stdcall glBindTexImage(egl::Surface *surface)
jbauman@chromium.orgae345802011-03-30 22:04:25 +000010211{
10212 EVENT("(egl::Surface* surface = 0x%0.8p)",
10213 surface);
10214
10215 try
10216 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +000010217 gl::Context *context = gl::getNonLostContext();
jbauman@chromium.orgae345802011-03-30 22:04:25 +000010218
10219 if (context)
10220 {
10221 gl::Texture2D *textureObject = context->getTexture2D();
10222
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +000010223 if (textureObject->isImmutable())
10224 {
10225 return false;
10226 }
10227
jbauman@chromium.orgae345802011-03-30 22:04:25 +000010228 if (textureObject)
10229 {
10230 textureObject->bindTexImage(surface);
10231 }
10232 }
10233 }
10234 catch(std::bad_alloc&)
10235 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010236 return gl::error(GL_OUT_OF_MEMORY, false);
jbauman@chromium.orgae345802011-03-30 22:04:25 +000010237 }
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +000010238
10239 return true;
jbauman@chromium.orgae345802011-03-30 22:04:25 +000010240}
10241
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000010242}