blob: 4e0d96dd5995960eabbe1f8edd00efc3fa3f8af1 [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;
shannon.woods%transgaming.com@gtempaccount.comc416e1c2013-04-13 03:45:05 +0000553 case GL_TEXTURE_3D:
554 if (context->getClientVersion() < 3)
555 {
556 return gl::error(GL_INVALID_ENUM);
557 }
558 context->bindTexture3D(texture);
559 return;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000560 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000561 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000562 }
563 }
564 }
565 catch(std::bad_alloc&)
566 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000567 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000568 }
569}
570
571void __stdcall glBlendColor(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha)
572{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000573 EVENT("(GLclampf red = %f, GLclampf green = %f, GLclampf blue = %f, GLclampf alpha = %f)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +0000574 red, green, blue, alpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000575
576 try
577 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000578 gl::Context* context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000579
580 if (context)
581 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +0000582 context->setBlendColor(gl::clamp01(red), gl::clamp01(green), gl::clamp01(blue), gl::clamp01(alpha));
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000583 }
584 }
585 catch(std::bad_alloc&)
586 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000587 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000588 }
589}
590
591void __stdcall glBlendEquation(GLenum mode)
592{
593 glBlendEquationSeparate(mode, mode);
594}
595
596void __stdcall glBlendEquationSeparate(GLenum modeRGB, GLenum modeAlpha)
597{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000598 EVENT("(GLenum modeRGB = 0x%X, GLenum modeAlpha = 0x%X)", modeRGB, modeAlpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000599
600 try
601 {
shannon.woods%transgaming.com@gtempaccount.com00b6a0e2013-04-13 03:38:00 +0000602 gl::Context *context = gl::getNonLostContext();
603
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000604 switch (modeRGB)
605 {
606 case GL_FUNC_ADD:
607 case GL_FUNC_SUBTRACT:
608 case GL_FUNC_REVERSE_SUBTRACT:
609 break;
shannon.woods%transgaming.com@gtempaccount.com00b6a0e2013-04-13 03:38:00 +0000610
611 case GL_MIN:
612 case GL_MAX:
613 if (context && context->getClientVersion() < 3)
614 {
615 return gl::error(GL_INVALID_ENUM);
616 }
617 break;
618
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000619 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000620 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000621 }
622
623 switch (modeAlpha)
624 {
625 case GL_FUNC_ADD:
626 case GL_FUNC_SUBTRACT:
627 case GL_FUNC_REVERSE_SUBTRACT:
628 break;
shannon.woods%transgaming.com@gtempaccount.com00b6a0e2013-04-13 03:38:00 +0000629
630 case GL_MIN:
631 case GL_MAX:
632 if (context && context->getClientVersion() < 3)
633 {
634 return gl::error(GL_INVALID_ENUM);
635 }
636 break;
637
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000638 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000639 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000640 }
641
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000642 if (context)
643 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +0000644 context->setBlendEquation(modeRGB, modeAlpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000645 }
646 }
647 catch(std::bad_alloc&)
648 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000649 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000650 }
651}
652
653void __stdcall glBlendFunc(GLenum sfactor, GLenum dfactor)
654{
655 glBlendFuncSeparate(sfactor, dfactor, sfactor, dfactor);
656}
657
658void __stdcall glBlendFuncSeparate(GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha)
659{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000660 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 +0000661 srcRGB, dstRGB, srcAlpha, dstAlpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000662
663 try
664 {
665 switch (srcRGB)
666 {
667 case GL_ZERO:
668 case GL_ONE:
669 case GL_SRC_COLOR:
670 case GL_ONE_MINUS_SRC_COLOR:
671 case GL_DST_COLOR:
672 case GL_ONE_MINUS_DST_COLOR:
673 case GL_SRC_ALPHA:
674 case GL_ONE_MINUS_SRC_ALPHA:
675 case GL_DST_ALPHA:
676 case GL_ONE_MINUS_DST_ALPHA:
677 case GL_CONSTANT_COLOR:
678 case GL_ONE_MINUS_CONSTANT_COLOR:
679 case GL_CONSTANT_ALPHA:
680 case GL_ONE_MINUS_CONSTANT_ALPHA:
681 case GL_SRC_ALPHA_SATURATE:
682 break;
683 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000684 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000685 }
686
687 switch (dstRGB)
688 {
689 case GL_ZERO:
690 case GL_ONE:
691 case GL_SRC_COLOR:
692 case GL_ONE_MINUS_SRC_COLOR:
693 case GL_DST_COLOR:
694 case GL_ONE_MINUS_DST_COLOR:
695 case GL_SRC_ALPHA:
696 case GL_ONE_MINUS_SRC_ALPHA:
697 case GL_DST_ALPHA:
698 case GL_ONE_MINUS_DST_ALPHA:
699 case GL_CONSTANT_COLOR:
700 case GL_ONE_MINUS_CONSTANT_COLOR:
701 case GL_CONSTANT_ALPHA:
702 case GL_ONE_MINUS_CONSTANT_ALPHA:
703 break;
704 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000705 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000706 }
707
708 switch (srcAlpha)
709 {
710 case GL_ZERO:
711 case GL_ONE:
712 case GL_SRC_COLOR:
713 case GL_ONE_MINUS_SRC_COLOR:
714 case GL_DST_COLOR:
715 case GL_ONE_MINUS_DST_COLOR:
716 case GL_SRC_ALPHA:
717 case GL_ONE_MINUS_SRC_ALPHA:
718 case GL_DST_ALPHA:
719 case GL_ONE_MINUS_DST_ALPHA:
720 case GL_CONSTANT_COLOR:
721 case GL_ONE_MINUS_CONSTANT_COLOR:
722 case GL_CONSTANT_ALPHA:
723 case GL_ONE_MINUS_CONSTANT_ALPHA:
724 case GL_SRC_ALPHA_SATURATE:
725 break;
726 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000727 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000728 }
729
730 switch (dstAlpha)
731 {
732 case GL_ZERO:
733 case GL_ONE:
734 case GL_SRC_COLOR:
735 case GL_ONE_MINUS_SRC_COLOR:
736 case GL_DST_COLOR:
737 case GL_ONE_MINUS_DST_COLOR:
738 case GL_SRC_ALPHA:
739 case GL_ONE_MINUS_SRC_ALPHA:
740 case GL_DST_ALPHA:
741 case GL_ONE_MINUS_DST_ALPHA:
742 case GL_CONSTANT_COLOR:
743 case GL_ONE_MINUS_CONSTANT_COLOR:
744 case GL_CONSTANT_ALPHA:
745 case GL_ONE_MINUS_CONSTANT_ALPHA:
746 break;
747 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000748 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000749 }
750
daniel@transgaming.comfe453652010-03-16 06:23:28 +0000751 bool constantColorUsed = (srcRGB == GL_CONSTANT_COLOR || srcRGB == GL_ONE_MINUS_CONSTANT_COLOR ||
752 dstRGB == GL_CONSTANT_COLOR || dstRGB == GL_ONE_MINUS_CONSTANT_COLOR);
753
754 bool constantAlphaUsed = (srcRGB == GL_CONSTANT_ALPHA || srcRGB == GL_ONE_MINUS_CONSTANT_ALPHA ||
755 dstRGB == GL_CONSTANT_ALPHA || dstRGB == GL_ONE_MINUS_CONSTANT_ALPHA);
756
757 if (constantColorUsed && constantAlphaUsed)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000758 {
daniel@transgaming.comfe453652010-03-16 06:23:28 +0000759 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 +0000760 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000761 }
762
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000763 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000764
765 if (context)
766 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +0000767 context->setBlendFactors(srcRGB, dstRGB, srcAlpha, dstAlpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000768 }
769 }
770 catch(std::bad_alloc&)
771 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000772 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000773 }
774}
775
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +0000776void __stdcall glBufferData(GLenum target, GLsizeiptr size, const GLvoid* data, GLenum usage)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000777{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000778 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 +0000779 target, size, data, usage);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000780
781 try
782 {
783 if (size < 0)
784 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000785 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000786 }
787
shannon.woods%transgaming.com@gtempaccount.comf2db40b2013-04-13 03:37:09 +0000788 gl::Context *context = gl::getNonLostContext();
789
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000790 switch (usage)
791 {
792 case GL_STREAM_DRAW:
793 case GL_STATIC_DRAW:
794 case GL_DYNAMIC_DRAW:
795 break;
shannon.woods%transgaming.com@gtempaccount.comf2db40b2013-04-13 03:37:09 +0000796
797 case GL_STREAM_READ:
798 case GL_STREAM_COPY:
799 case GL_STATIC_READ:
800 case GL_STATIC_COPY:
801 case GL_DYNAMIC_READ:
802 case GL_DYNAMIC_COPY:
803 if (context && context->getClientVersion() < 3)
804 {
805 return gl::error(GL_INVALID_ENUM);
806 }
807 break;
808
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000809 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000810 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000811 }
812
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000813 if (context)
814 {
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +0000815 // Check ES3 specific targets
816 switch (target)
817 {
shannon.woods%transgaming.com@gtempaccount.com51171882013-04-13 03:39:10 +0000818 case GL_COPY_READ_BUFFER:
819 case GL_COPY_WRITE_BUFFER:
shannon.woods%transgaming.com@gtempaccount.comc926e5f2013-04-13 03:39:18 +0000820 case GL_PIXEL_PACK_BUFFER:
821 case GL_PIXEL_UNPACK_BUFFER:
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +0000822 case GL_UNIFORM_BUFFER:
823 case GL_TRANSFORM_FEEDBACK_BUFFER:
824 if (context->getClientVersion() < 3)
825 {
826 return gl::error(GL_INVALID_ENUM);
827 }
828 }
829
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000830 gl::Buffer *buffer;
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +0000831
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000832 switch (target)
833 {
834 case GL_ARRAY_BUFFER:
835 buffer = context->getArrayBuffer();
836 break;
837 case GL_ELEMENT_ARRAY_BUFFER:
838 buffer = context->getElementArrayBuffer();
839 break;
shannon.woods%transgaming.com@gtempaccount.com51171882013-04-13 03:39:10 +0000840 case GL_COPY_READ_BUFFER:
841 buffer = context->getCopyReadBuffer();
842 break;
843 case GL_COPY_WRITE_BUFFER:
844 buffer = context->getCopyWriteBuffer();
845 break;
shannon.woods%transgaming.com@gtempaccount.comc926e5f2013-04-13 03:39:18 +0000846 case GL_PIXEL_PACK_BUFFER:
847 buffer = context->getPixelPackBuffer();
848 break;
849 case GL_PIXEL_UNPACK_BUFFER:
850 buffer = context->getPixelUnpackBuffer();
851 break;
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +0000852 case GL_TRANSFORM_FEEDBACK_BUFFER:
853 buffer = context->getGenericTransformFeedbackBuffer();
854 break;
855 case GL_UNIFORM_BUFFER:
856 buffer = context->getGenericUniformBuffer();
857 break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000858 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000859 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000860 }
861
862 if (!buffer)
863 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000864 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000865 }
866
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +0000867 buffer->bufferData(data, size, usage);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000868 }
869 }
870 catch(std::bad_alloc&)
871 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000872 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000873 }
874}
875
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +0000876void __stdcall glBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid* data)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000877{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000878 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 +0000879 target, offset, size, data);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000880
881 try
882 {
daniel@transgaming.comdefa1c32010-05-18 18:51:45 +0000883 if (size < 0 || offset < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000884 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000885 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000886 }
887
daniel@transgaming.comd4620a32010-03-21 04:31:28 +0000888 if (data == NULL)
889 {
890 return;
891 }
892
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000893 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +0000894
895 if (context)
896 {
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +0000897 // Check ES3 specific targets
898 switch (target)
899 {
shannon.woods%transgaming.com@gtempaccount.com51171882013-04-13 03:39:10 +0000900 case GL_COPY_READ_BUFFER:
901 case GL_COPY_WRITE_BUFFER:
shannon.woods%transgaming.com@gtempaccount.comc926e5f2013-04-13 03:39:18 +0000902 case GL_PIXEL_PACK_BUFFER:
903 case GL_PIXEL_UNPACK_BUFFER:
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +0000904 case GL_UNIFORM_BUFFER:
905 case GL_TRANSFORM_FEEDBACK_BUFFER:
906 if (context->getClientVersion() < 3)
907 {
908 return gl::error(GL_INVALID_ENUM);
909 }
910 }
911
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +0000912 gl::Buffer *buffer;
913
914 switch (target)
915 {
916 case GL_ARRAY_BUFFER:
917 buffer = context->getArrayBuffer();
918 break;
919 case GL_ELEMENT_ARRAY_BUFFER:
920 buffer = context->getElementArrayBuffer();
921 break;
shannon.woods%transgaming.com@gtempaccount.com51171882013-04-13 03:39:10 +0000922 case GL_COPY_READ_BUFFER:
923 buffer = context->getCopyReadBuffer();
924 break;
925 case GL_COPY_WRITE_BUFFER:
926 buffer = context->getCopyWriteBuffer();
927 break;
shannon.woods%transgaming.com@gtempaccount.comc926e5f2013-04-13 03:39:18 +0000928 case GL_PIXEL_PACK_BUFFER:
929 buffer = context->getPixelPackBuffer();
930 break;
931 case GL_PIXEL_UNPACK_BUFFER:
932 buffer = context->getPixelUnpackBuffer();
933 break;
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +0000934 case GL_TRANSFORM_FEEDBACK_BUFFER:
935 buffer = context->getGenericTransformFeedbackBuffer();
936 break;
937 case GL_UNIFORM_BUFFER:
938 buffer = context->getGenericUniformBuffer();
939 break;
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +0000940 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000941 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +0000942 }
943
944 if (!buffer)
945 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000946 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +0000947 }
948
daniel@transgaming.comdefa1c32010-05-18 18:51:45 +0000949 if ((size_t)size + offset > buffer->size())
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +0000950 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000951 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +0000952 }
daniel@transgaming.comdefa1c32010-05-18 18:51:45 +0000953
954 buffer->bufferSubData(data, size, offset);
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +0000955 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000956 }
957 catch(std::bad_alloc&)
958 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000959 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000960 }
961}
962
963GLenum __stdcall glCheckFramebufferStatus(GLenum target)
964{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000965 EVENT("(GLenum target = 0x%X)", target);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000966
967 try
968 {
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +0000969 if (target != GL_FRAMEBUFFER && target != GL_DRAW_FRAMEBUFFER_ANGLE && target != GL_READ_FRAMEBUFFER_ANGLE)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000970 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000971 return gl::error(GL_INVALID_ENUM, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000972 }
973
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000974 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000975
976 if (context)
977 {
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +0000978 gl::Framebuffer *framebuffer = NULL;
979 if (target == GL_READ_FRAMEBUFFER_ANGLE)
980 {
981 framebuffer = context->getReadFramebuffer();
982 }
983 else
984 {
985 framebuffer = context->getDrawFramebuffer();
986 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000987
988 return framebuffer->completeness();
989 }
990 }
991 catch(std::bad_alloc&)
992 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000993 return gl::error(GL_OUT_OF_MEMORY, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000994 }
995
996 return 0;
997}
998
999void __stdcall glClear(GLbitfield mask)
1000{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00001001 EVENT("(GLbitfield mask = 0x%X)", mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001002
1003 try
1004 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001005 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001006
1007 if (context)
1008 {
1009 context->clear(mask);
1010 }
1011 }
1012 catch(std::bad_alloc&)
1013 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001014 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001015 }
1016}
1017
1018void __stdcall glClearColor(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha)
1019{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001020 EVENT("(GLclampf red = %f, GLclampf green = %f, GLclampf blue = %f, GLclampf alpha = %f)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001021 red, green, blue, alpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001022
1023 try
1024 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001025 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001026
1027 if (context)
1028 {
1029 context->setClearColor(red, green, blue, alpha);
1030 }
1031 }
1032 catch(std::bad_alloc&)
1033 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001034 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001035 }
1036}
1037
1038void __stdcall glClearDepthf(GLclampf depth)
1039{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001040 EVENT("(GLclampf depth = %f)", depth);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001041
1042 try
1043 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001044 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001045
1046 if (context)
1047 {
1048 context->setClearDepth(depth);
1049 }
1050 }
1051 catch(std::bad_alloc&)
1052 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001053 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001054 }
1055}
1056
1057void __stdcall glClearStencil(GLint s)
1058{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001059 EVENT("(GLint s = %d)", s);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001060
1061 try
1062 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001063 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001064
1065 if (context)
1066 {
1067 context->setClearStencil(s);
1068 }
1069 }
1070 catch(std::bad_alloc&)
1071 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001072 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001073 }
1074}
1075
1076void __stdcall glColorMask(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha)
1077{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00001078 EVENT("(GLboolean red = %d, GLboolean green = %u, GLboolean blue = %u, GLboolean alpha = %u)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001079 red, green, blue, alpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001080
1081 try
1082 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001083 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001084
1085 if (context)
1086 {
daniel@transgaming.coma36f98e2010-05-18 18:51:09 +00001087 context->setColorMask(red == GL_TRUE, green == GL_TRUE, blue == GL_TRUE, alpha == GL_TRUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001088 }
1089 }
1090 catch(std::bad_alloc&)
1091 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001092 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001093 }
1094}
1095
1096void __stdcall glCompileShader(GLuint shader)
1097{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001098 EVENT("(GLuint shader = %d)", shader);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001099
1100 try
1101 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001102 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001103
1104 if (context)
1105 {
1106 gl::Shader *shaderObject = context->getShader(shader);
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00001107
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001108 if (!shaderObject)
1109 {
daniel@transgaming.com0cefaf42010-04-13 03:26:36 +00001110 if (context->getProgram(shader))
1111 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001112 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com0cefaf42010-04-13 03:26:36 +00001113 }
1114 else
1115 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001116 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com0cefaf42010-04-13 03:26:36 +00001117 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001118 }
1119
1120 shaderObject->compile();
1121 }
1122 }
1123 catch(std::bad_alloc&)
1124 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001125 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001126 }
1127}
1128
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00001129void __stdcall glCompressedTexImage2D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height,
1130 GLint border, GLsizei imageSize, const GLvoid* data)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001131{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001132 EVENT("(GLenum target = 0x%X, GLint level = %d, GLenum internalformat = 0x%X, GLsizei width = %d, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00001133 "GLsizei height = %d, GLint border = %d, GLsizei imageSize = %d, const GLvoid* data = 0x%0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001134 target, level, internalformat, width, height, border, imageSize, data);
1135
1136 try
1137 {
daniel@transgaming.com4f9ef0d2011-05-30 23:51:19 +00001138 if (!validImageSize(level, width, height) || border != 0 || imageSize < 0)
daniel@transgaming.com41430492010-03-11 20:36:18 +00001139 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001140 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com41430492010-03-11 20:36:18 +00001141 }
1142
daniel@transgaming.com01868132010-08-24 19:21:17 +00001143 switch (internalformat)
1144 {
1145 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
1146 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
gman@chromium.org50c526d2011-08-10 05:19:44 +00001147 case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
1148 case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
daniel@transgaming.com01868132010-08-24 19:21:17 +00001149 break;
1150 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001151 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com01868132010-08-24 19:21:17 +00001152 }
1153
1154 if (border != 0)
1155 {
shannon.woods@transgaming.com0efef902013-02-28 23:21:09 +00001156 return gl::error(GL_INVALID_OPERATION);
1157 }
1158
1159 if (width != 1 && width != 2 && width % 4 != 0)
1160 {
1161 return gl::error(GL_INVALID_OPERATION);
1162 }
1163
1164 if (height != 1 && height != 2 && height % 4 != 0)
1165 {
1166 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com01868132010-08-24 19:21:17 +00001167 }
1168
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001169 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com01868132010-08-24 19:21:17 +00001170
1171 if (context)
1172 {
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001173 if (level > context->getMaximumTextureLevel())
1174 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001175 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001176 }
1177
1178 switch (target)
1179 {
1180 case GL_TEXTURE_2D:
shannon.woods%transgaming.com@gtempaccount.comc1fdf6b2013-04-13 03:44:41 +00001181 if (width > (context->getMaximum2DTextureDimension() >> level) ||
1182 height > (context->getMaximum2DTextureDimension() >> level))
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001183 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001184 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001185 }
1186 break;
1187 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
1188 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
1189 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
1190 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
1191 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
1192 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
1193 if (width != height)
1194 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001195 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001196 }
1197
1198 if (width > (context->getMaximumCubeTextureDimension() >> level) ||
1199 height > (context->getMaximumCubeTextureDimension() >> level))
1200 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001201 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001202 }
1203 break;
1204 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001205 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001206 }
1207
gman@chromium.org50c526d2011-08-10 05:19:44 +00001208 switch (internalformat) {
1209 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
1210 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
1211 if (!context->supportsDXT1Textures())
1212 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001213 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 +00001214 }
1215 break;
1216 case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
1217 if (!context->supportsDXT3Textures())
1218 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001219 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 +00001220 }
1221 break;
1222 case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
1223 if (!context->supportsDXT5Textures())
1224 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001225 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 +00001226 }
1227 break;
1228 default: UNREACHABLE();
daniel@transgaming.com01868132010-08-24 19:21:17 +00001229 }
1230
1231 if (imageSize != gl::ComputeCompressedSize(width, height, internalformat))
1232 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001233 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com01868132010-08-24 19:21:17 +00001234 }
1235
1236 if (target == GL_TEXTURE_2D)
1237 {
1238 gl::Texture2D *texture = context->getTexture2D();
1239
1240 if (!texture)
1241 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001242 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com01868132010-08-24 19:21:17 +00001243 }
1244
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00001245 if (texture->isImmutable())
1246 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001247 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00001248 }
1249
daniel@transgaming.com01868132010-08-24 19:21:17 +00001250 texture->setCompressedImage(level, internalformat, width, height, imageSize, data);
1251 }
1252 else
1253 {
1254 gl::TextureCubeMap *texture = context->getTextureCubeMap();
1255
1256 if (!texture)
1257 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001258 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com01868132010-08-24 19:21:17 +00001259 }
1260
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00001261 if (texture->isImmutable())
1262 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001263 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00001264 }
1265
daniel@transgaming.com01868132010-08-24 19:21:17 +00001266 switch (target)
1267 {
1268 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
1269 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
1270 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
1271 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
1272 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
1273 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
1274 texture->setCompressedImage(target, level, internalformat, width, height, imageSize, data);
1275 break;
1276 default: UNREACHABLE();
1277 }
1278 }
1279 }
1280
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001281 }
1282 catch(std::bad_alloc&)
1283 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001284 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001285 }
1286}
1287
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00001288void __stdcall glCompressedTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height,
1289 GLenum format, GLsizei imageSize, const GLvoid* data)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001290{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001291 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001292 "GLsizei width = %d, GLsizei height = %d, GLenum format = 0x%X, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00001293 "GLsizei imageSize = %d, const GLvoid* data = 0x%0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001294 target, level, xoffset, yoffset, width, height, format, imageSize, data);
1295
1296 try
1297 {
apatrick@chromium.org551022e2012-01-23 19:56:54 +00001298 if (!gl::IsInternalTextureTarget(target))
daniel@transgaming.com41430492010-03-11 20:36:18 +00001299 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001300 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com41430492010-03-11 20:36:18 +00001301 }
1302
daniel@transgaming.com4f9ef0d2011-05-30 23:51:19 +00001303 if (xoffset < 0 || yoffset < 0 || !validImageSize(level, width, height) || imageSize < 0)
daniel@transgaming.com41430492010-03-11 20:36:18 +00001304 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001305 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com41430492010-03-11 20:36:18 +00001306 }
1307
daniel@transgaming.com01868132010-08-24 19:21:17 +00001308 switch (format)
daniel@transgaming.com41430492010-03-11 20:36:18 +00001309 {
daniel@transgaming.com01868132010-08-24 19:21:17 +00001310 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
1311 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
gman@chromium.org50c526d2011-08-10 05:19:44 +00001312 case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
1313 case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
daniel@transgaming.com01868132010-08-24 19:21:17 +00001314 break;
1315 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001316 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com41430492010-03-11 20:36:18 +00001317 }
1318
daniel@transgaming.com01868132010-08-24 19:21:17 +00001319 if (width == 0 || height == 0 || data == NULL)
1320 {
1321 return;
1322 }
1323
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001324 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com01868132010-08-24 19:21:17 +00001325
1326 if (context)
1327 {
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001328 if (level > context->getMaximumTextureLevel())
1329 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001330 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001331 }
1332
gman@chromium.org50c526d2011-08-10 05:19:44 +00001333 switch (format) {
1334 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
1335 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
1336 if (!context->supportsDXT1Textures())
1337 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001338 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 +00001339 }
1340 break;
1341 case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
1342 if (!context->supportsDXT3Textures())
1343 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001344 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 +00001345 }
1346 break;
1347 case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
1348 if (!context->supportsDXT5Textures())
1349 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001350 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 +00001351 }
1352 break;
1353 default: UNREACHABLE();
daniel@transgaming.com01868132010-08-24 19:21:17 +00001354 }
1355
1356 if (imageSize != gl::ComputeCompressedSize(width, height, format))
1357 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001358 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com01868132010-08-24 19:21:17 +00001359 }
1360
1361 if (xoffset % 4 != 0 || yoffset % 4 != 0)
1362 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001363 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 +00001364 // does not exist unless DXT textures are supported.
daniel@transgaming.com01868132010-08-24 19:21:17 +00001365 }
1366
1367 if (target == GL_TEXTURE_2D)
1368 {
1369 gl::Texture2D *texture = context->getTexture2D();
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00001370 if (validateSubImageParams2D(true, width, height, xoffset, yoffset, level, format, GL_NONE, texture))
daniel@transgaming.com01868132010-08-24 19:21:17 +00001371 {
daniel@transgaming.com343373a2011-11-29 19:42:32 +00001372 texture->subImageCompressed(level, xoffset, yoffset, width, height, format, imageSize, data);
daniel@transgaming.com01868132010-08-24 19:21:17 +00001373 }
daniel@transgaming.com01868132010-08-24 19:21:17 +00001374 }
1375 else if (gl::IsCubemapTextureTarget(target))
1376 {
1377 gl::TextureCubeMap *texture = context->getTextureCubeMap();
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00001378 if (validateSubImageParamsCube(true, width, height, xoffset, yoffset, target, level, format, GL_NONE, texture))
daniel@transgaming.com01868132010-08-24 19:21:17 +00001379 {
daniel@transgaming.com343373a2011-11-29 19:42:32 +00001380 texture->subImageCompressed(target, level, xoffset, yoffset, width, height, format, imageSize, data);
daniel@transgaming.com01868132010-08-24 19:21:17 +00001381 }
daniel@transgaming.com01868132010-08-24 19:21:17 +00001382 }
1383 else
1384 {
1385 UNREACHABLE();
1386 }
1387 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001388 }
1389 catch(std::bad_alloc&)
1390 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001391 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001392 }
1393}
1394
1395void __stdcall glCopyTexImage2D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border)
1396{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001397 EVENT("(GLenum target = 0x%X, GLint level = %d, GLenum internalformat = 0x%X, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001398 "GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d, GLint border = %d)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001399 target, level, internalformat, x, y, width, height, border);
1400
1401 try
1402 {
daniel@transgaming.com4f9ef0d2011-05-30 23:51:19 +00001403 if (!validImageSize(level, width, height))
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001404 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001405 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001406 }
1407
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001408 if (border != 0)
1409 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001410 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001411 }
1412
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001413 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001414
1415 if (context)
1416 {
daniel@transgaming.com32b11442011-11-19 02:42:48 +00001417 if (level > context->getMaximumTextureLevel())
1418 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001419 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com32b11442011-11-19 02:42:48 +00001420 }
1421
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001422 switch (target)
1423 {
1424 case GL_TEXTURE_2D:
shannon.woods%transgaming.com@gtempaccount.comc1fdf6b2013-04-13 03:44:41 +00001425 if (width > (context->getMaximum2DTextureDimension() >> level) ||
1426 height > (context->getMaximum2DTextureDimension() >> level))
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001427 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001428 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001429 }
1430 break;
1431 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
1432 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
1433 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
1434 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
1435 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
1436 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
1437 if (width != height)
1438 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001439 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001440 }
1441
1442 if (width > (context->getMaximumCubeTextureDimension() >> level) ||
1443 height > (context->getMaximumCubeTextureDimension() >> level))
1444 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001445 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001446 }
1447 break;
1448 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001449 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001450 }
1451
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00001452 gl::Framebuffer *framebuffer = context->getReadFramebuffer();
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001453
daniel@transgaming.combbc57792010-07-28 19:21:05 +00001454 if (framebuffer->completeness() != GL_FRAMEBUFFER_COMPLETE)
1455 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001456 return gl::error(GL_INVALID_FRAMEBUFFER_OPERATION);
daniel@transgaming.combbc57792010-07-28 19:21:05 +00001457 }
1458
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00001459 if (context->getReadFramebufferHandle() != 0 && framebuffer->getSamples() != 0)
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00001460 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001461 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00001462 }
1463
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00001464 gl::Renderbuffer *source = framebuffer->getReadColorbuffer();
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +00001465 GLenum colorbufferFormat = source->getInternalFormat();
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001466
1467 // [OpenGL ES 2.0.24] table 3.9
1468 switch (internalformat)
1469 {
1470 case GL_ALPHA:
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00001471 if (colorbufferFormat != GL_ALPHA8_EXT &&
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001472 colorbufferFormat != GL_RGBA4 &&
1473 colorbufferFormat != GL_RGB5_A1 &&
shannon.woods@transgaming.com28e7ba02013-02-28 23:09:28 +00001474 colorbufferFormat != GL_BGRA8_EXT &&
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001475 colorbufferFormat != GL_RGBA8_OES)
1476 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001477 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001478 }
1479 break;
1480 case GL_LUMINANCE:
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00001481 case GL_RGB:
1482 if (colorbufferFormat != GL_RGB565 &&
1483 colorbufferFormat != GL_RGB8_OES &&
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001484 colorbufferFormat != GL_RGBA4 &&
1485 colorbufferFormat != GL_RGB5_A1 &&
shannon.woods@transgaming.com28e7ba02013-02-28 23:09:28 +00001486 colorbufferFormat != GL_BGRA8_EXT &&
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001487 colorbufferFormat != GL_RGBA8_OES)
1488 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001489 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001490 }
1491 break;
1492 case GL_LUMINANCE_ALPHA:
1493 case GL_RGBA:
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00001494 if (colorbufferFormat != GL_RGBA4 &&
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001495 colorbufferFormat != GL_RGB5_A1 &&
shannon.woods@transgaming.com28e7ba02013-02-28 23:09:28 +00001496 colorbufferFormat != GL_BGRA8_EXT &&
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001497 colorbufferFormat != GL_RGBA8_OES)
1498 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001499 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001500 }
1501 break;
1502 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
1503 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
gman@chromium.org50c526d2011-08-10 05:19:44 +00001504 if (context->supportsDXT1Textures())
1505 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001506 return gl::error(GL_INVALID_OPERATION);
gman@chromium.org50c526d2011-08-10 05:19:44 +00001507 }
1508 else
1509 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001510 return gl::error(GL_INVALID_ENUM);
gman@chromium.org50c526d2011-08-10 05:19:44 +00001511 }
1512 break;
1513 case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
1514 if (context->supportsDXT3Textures())
1515 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001516 return gl::error(GL_INVALID_OPERATION);
gman@chromium.org50c526d2011-08-10 05:19:44 +00001517 }
1518 else
1519 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001520 return gl::error(GL_INVALID_ENUM);
gman@chromium.org50c526d2011-08-10 05:19:44 +00001521 }
1522 break;
1523 case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
1524 if (context->supportsDXT5Textures())
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001525 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001526 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001527 }
1528 else
1529 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001530 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001531 }
1532 break;
daniel@transgaming.com0c854682012-05-31 01:14:11 +00001533 case GL_DEPTH_COMPONENT:
1534 case GL_DEPTH_COMPONENT16:
1535 case GL_DEPTH_COMPONENT32_OES:
1536 case GL_DEPTH_STENCIL_OES:
1537 case GL_DEPTH24_STENCIL8_OES:
1538 if (context->supportsDepthTextures())
1539 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001540 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com0c854682012-05-31 01:14:11 +00001541 }
1542 else
1543 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001544 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com0c854682012-05-31 01:14:11 +00001545 }
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001546 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001547 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001548 }
1549
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001550 if (target == GL_TEXTURE_2D)
1551 {
1552 gl::Texture2D *texture = context->getTexture2D();
1553
1554 if (!texture)
1555 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001556 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001557 }
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00001558
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00001559 if (texture->isImmutable())
1560 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001561 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00001562 }
1563
apatrick@chromium.orgb31f5322011-01-19 19:02:52 +00001564 texture->copyImage(level, internalformat, x, y, width, height, framebuffer);
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001565 }
daniel@transgaming.com19ffc242010-05-04 03:35:21 +00001566 else if (gl::IsCubemapTextureTarget(target))
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001567 {
1568 gl::TextureCubeMap *texture = context->getTextureCubeMap();
1569
1570 if (!texture)
1571 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001572 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001573 }
1574
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00001575 if (texture->isImmutable())
1576 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001577 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00001578 }
1579
apatrick@chromium.orgb31f5322011-01-19 19:02:52 +00001580 texture->copyImage(target, level, internalformat, x, y, width, height, framebuffer);
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001581 }
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001582 else UNREACHABLE();
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001583 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001584 }
1585 catch(std::bad_alloc&)
1586 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001587 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001588 }
1589}
1590
1591void __stdcall glCopyTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height)
1592{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001593 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001594 "GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001595 target, level, xoffset, yoffset, x, y, width, height);
1596
1597 try
1598 {
apatrick@chromium.org551022e2012-01-23 19:56:54 +00001599 if (!gl::IsInternalTextureTarget(target))
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001600 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001601 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001602 }
1603
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001604 if (level < 0 || xoffset < 0 || yoffset < 0 || width < 0 || height < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001605 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001606 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001607 }
1608
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001609 if (std::numeric_limits<GLsizei>::max() - xoffset < width || std::numeric_limits<GLsizei>::max() - yoffset < height)
1610 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001611 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001612 }
1613
1614 if (width == 0 || height == 0)
1615 {
1616 return;
1617 }
1618
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001619 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001620
1621 if (context)
1622 {
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001623 if (level > context->getMaximumTextureLevel())
1624 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001625 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001626 }
1627
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00001628 gl::Framebuffer *framebuffer = context->getReadFramebuffer();
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001629
daniel@transgaming.combbc57792010-07-28 19:21:05 +00001630 if (framebuffer->completeness() != GL_FRAMEBUFFER_COMPLETE)
1631 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001632 return gl::error(GL_INVALID_FRAMEBUFFER_OPERATION);
daniel@transgaming.combbc57792010-07-28 19:21:05 +00001633 }
1634
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00001635 if (context->getReadFramebufferHandle() != 0 && framebuffer->getSamples() != 0)
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00001636 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001637 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00001638 }
1639
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00001640 gl::Renderbuffer *source = framebuffer->getReadColorbuffer();
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +00001641 GLenum colorbufferFormat = source->getInternalFormat();
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001642 gl::Texture *texture = NULL;
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +00001643 GLenum textureFormat = GL_RGBA;
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001644
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001645 if (target == GL_TEXTURE_2D)
1646 {
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +00001647 gl::Texture2D *tex2d = context->getTexture2D();
1648
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00001649 if (!validateSubImageParams2D(false, width, height, xoffset, yoffset, level, GL_NONE, GL_NONE, tex2d))
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +00001650 {
1651 return; // error already registered by validateSubImageParams
1652 }
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00001653 textureFormat = gl::ExtractFormat(tex2d->getInternalFormat(level));
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +00001654 texture = tex2d;
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001655 }
daniel@transgaming.com19ffc242010-05-04 03:35:21 +00001656 else if (gl::IsCubemapTextureTarget(target))
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001657 {
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +00001658 gl::TextureCubeMap *texcube = context->getTextureCubeMap();
1659
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00001660 if (!validateSubImageParamsCube(false, width, height, xoffset, yoffset, target, level, GL_NONE, GL_NONE, texcube))
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +00001661 {
1662 return; // error already registered by validateSubImageParams
1663 }
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00001664 textureFormat = gl::ExtractFormat(texcube->getInternalFormat(target, level));
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +00001665 texture = texcube;
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001666 }
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001667 else UNREACHABLE();
1668
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001669 // [OpenGL ES 2.0.24] table 3.9
1670 switch (textureFormat)
1671 {
1672 case GL_ALPHA:
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00001673 if (colorbufferFormat != GL_ALPHA8_EXT &&
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001674 colorbufferFormat != GL_RGBA4 &&
1675 colorbufferFormat != GL_RGB5_A1 &&
1676 colorbufferFormat != GL_RGBA8_OES)
1677 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001678 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001679 }
1680 break;
1681 case GL_LUMINANCE:
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00001682 case GL_RGB:
1683 if (colorbufferFormat != GL_RGB565 &&
1684 colorbufferFormat != GL_RGB8_OES &&
1685 colorbufferFormat != GL_RGBA4 &&
1686 colorbufferFormat != GL_RGB5_A1 &&
1687 colorbufferFormat != GL_RGBA8_OES)
1688 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001689 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00001690 }
1691 break;
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001692 case GL_LUMINANCE_ALPHA:
1693 case GL_RGBA:
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00001694 if (colorbufferFormat != GL_RGBA4 &&
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001695 colorbufferFormat != GL_RGB5_A1 &&
1696 colorbufferFormat != GL_RGBA8_OES)
1697 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001698 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001699 }
1700 break;
1701 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
1702 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
gman@chromium.org50c526d2011-08-10 05:19:44 +00001703 case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
1704 case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001705 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com0c854682012-05-31 01:14:11 +00001706 case GL_DEPTH_COMPONENT:
1707 case GL_DEPTH_STENCIL_OES:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001708 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001709 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001710 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001711 }
1712
shannon.woods%transgaming.com@gtempaccount.com95996562013-04-13 03:44:58 +00001713 texture->copySubImage(target, level, xoffset, yoffset, 0, x, y, width, height, framebuffer);
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001714 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001715 }
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001716
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001717 catch(std::bad_alloc&)
1718 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001719 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001720 }
1721}
1722
1723GLuint __stdcall glCreateProgram(void)
1724{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001725 EVENT("()");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001726
1727 try
1728 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001729 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001730
1731 if (context)
1732 {
1733 return context->createProgram();
1734 }
1735 }
1736 catch(std::bad_alloc&)
1737 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001738 return gl::error(GL_OUT_OF_MEMORY, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001739 }
1740
1741 return 0;
1742}
1743
1744GLuint __stdcall glCreateShader(GLenum type)
1745{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001746 EVENT("(GLenum type = 0x%X)", type);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001747
1748 try
1749 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001750 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001751
1752 if (context)
1753 {
1754 switch (type)
1755 {
1756 case GL_FRAGMENT_SHADER:
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00001757 case GL_VERTEX_SHADER:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001758 return context->createShader(type);
1759 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001760 return gl::error(GL_INVALID_ENUM, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001761 }
1762 }
1763 }
1764 catch(std::bad_alloc&)
1765 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001766 return gl::error(GL_OUT_OF_MEMORY, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001767 }
1768
1769 return 0;
1770}
1771
1772void __stdcall glCullFace(GLenum mode)
1773{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001774 EVENT("(GLenum mode = 0x%X)", mode);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001775
1776 try
1777 {
1778 switch (mode)
1779 {
1780 case GL_FRONT:
1781 case GL_BACK:
1782 case GL_FRONT_AND_BACK:
1783 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001784 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001785
1786 if (context)
1787 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00001788 context->setCullMode(mode);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001789 }
1790 }
1791 break;
1792 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001793 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001794 }
1795 }
1796 catch(std::bad_alloc&)
1797 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001798 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001799 }
1800}
1801
1802void __stdcall glDeleteBuffers(GLsizei n, const GLuint* buffers)
1803{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001804 EVENT("(GLsizei n = %d, const GLuint* buffers = 0x%0.8p)", n, buffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001805
1806 try
1807 {
1808 if (n < 0)
1809 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001810 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001811 }
1812
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001813 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001814
1815 if (context)
1816 {
1817 for (int i = 0; i < n; i++)
1818 {
1819 context->deleteBuffer(buffers[i]);
1820 }
1821 }
1822 }
1823 catch(std::bad_alloc&)
1824 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001825 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001826 }
1827}
1828
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001829void __stdcall glDeleteFencesNV(GLsizei n, const GLuint* fences)
1830{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001831 EVENT("(GLsizei n = %d, const GLuint* fences = 0x%0.8p)", n, fences);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001832
1833 try
1834 {
1835 if (n < 0)
1836 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001837 return gl::error(GL_INVALID_VALUE);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001838 }
1839
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001840 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001841
1842 if (context)
1843 {
1844 for (int i = 0; i < n; i++)
1845 {
1846 context->deleteFence(fences[i]);
1847 }
1848 }
1849 }
1850 catch(std::bad_alloc&)
1851 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001852 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001853 }
1854}
1855
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001856void __stdcall glDeleteFramebuffers(GLsizei n, const GLuint* framebuffers)
1857{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001858 EVENT("(GLsizei n = %d, const GLuint* framebuffers = 0x%0.8p)", n, framebuffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001859
1860 try
1861 {
1862 if (n < 0)
1863 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001864 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001865 }
1866
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001867 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001868
1869 if (context)
1870 {
1871 for (int i = 0; i < n; i++)
1872 {
1873 if (framebuffers[i] != 0)
1874 {
1875 context->deleteFramebuffer(framebuffers[i]);
1876 }
1877 }
1878 }
1879 }
1880 catch(std::bad_alloc&)
1881 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001882 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001883 }
1884}
1885
1886void __stdcall glDeleteProgram(GLuint program)
1887{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001888 EVENT("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001889
1890 try
1891 {
daniel@transgaming.com75401e62010-04-13 03:26:39 +00001892 if (program == 0)
1893 {
1894 return;
1895 }
1896
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001897 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001898
1899 if (context)
1900 {
daniel@transgaming.com75401e62010-04-13 03:26:39 +00001901 if (!context->getProgram(program))
1902 {
1903 if(context->getShader(program))
1904 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001905 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com75401e62010-04-13 03:26:39 +00001906 }
1907 else
1908 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001909 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com75401e62010-04-13 03:26:39 +00001910 }
1911 }
1912
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001913 context->deleteProgram(program);
1914 }
1915 }
1916 catch(std::bad_alloc&)
1917 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001918 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001919 }
1920}
1921
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00001922void __stdcall glDeleteQueriesEXT(GLsizei n, const GLuint *ids)
1923{
1924 EVENT("(GLsizei n = %d, const GLuint *ids = 0x%0.8p)", n, ids);
1925
1926 try
1927 {
1928 if (n < 0)
1929 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001930 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00001931 }
1932
1933 gl::Context *context = gl::getNonLostContext();
1934
1935 if (context)
1936 {
1937 for (int i = 0; i < n; i++)
1938 {
1939 context->deleteQuery(ids[i]);
1940 }
1941 }
1942 }
1943 catch(std::bad_alloc&)
1944 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001945 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00001946 }
1947}
1948
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001949void __stdcall glDeleteRenderbuffers(GLsizei n, const GLuint* renderbuffers)
1950{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001951 EVENT("(GLsizei n = %d, const GLuint* renderbuffers = 0x%0.8p)", n, renderbuffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001952
1953 try
1954 {
1955 if (n < 0)
1956 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001957 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001958 }
1959
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001960 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001961
1962 if (context)
1963 {
daniel@transgaming.come2b22122010-03-11 19:22:14 +00001964 for (int i = 0; i < n; i++)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001965 {
1966 context->deleteRenderbuffer(renderbuffers[i]);
1967 }
1968 }
1969 }
1970 catch(std::bad_alloc&)
1971 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001972 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001973 }
1974}
1975
1976void __stdcall glDeleteShader(GLuint shader)
1977{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001978 EVENT("(GLuint shader = %d)", shader);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001979
1980 try
1981 {
daniel@transgaming.com75401e62010-04-13 03:26:39 +00001982 if (shader == 0)
1983 {
1984 return;
1985 }
1986
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001987 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001988
1989 if (context)
1990 {
daniel@transgaming.com75401e62010-04-13 03:26:39 +00001991 if (!context->getShader(shader))
1992 {
1993 if(context->getProgram(shader))
1994 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001995 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com75401e62010-04-13 03:26:39 +00001996 }
1997 else
1998 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001999 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com75401e62010-04-13 03:26:39 +00002000 }
2001 }
2002
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002003 context->deleteShader(shader);
2004 }
2005 }
2006 catch(std::bad_alloc&)
2007 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002008 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002009 }
2010}
2011
2012void __stdcall glDeleteTextures(GLsizei n, const GLuint* textures)
2013{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002014 EVENT("(GLsizei n = %d, const GLuint* textures = 0x%0.8p)", n, textures);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002015
2016 try
2017 {
2018 if (n < 0)
2019 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002020 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002021 }
2022
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002023 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002024
2025 if (context)
2026 {
2027 for (int i = 0; i < n; i++)
2028 {
2029 if (textures[i] != 0)
2030 {
2031 context->deleteTexture(textures[i]);
2032 }
2033 }
2034 }
2035 }
2036 catch(std::bad_alloc&)
2037 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002038 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002039 }
2040}
2041
2042void __stdcall glDepthFunc(GLenum func)
2043{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002044 EVENT("(GLenum func = 0x%X)", func);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002045
2046 try
2047 {
2048 switch (func)
2049 {
2050 case GL_NEVER:
2051 case GL_ALWAYS:
2052 case GL_LESS:
2053 case GL_LEQUAL:
2054 case GL_EQUAL:
2055 case GL_GREATER:
2056 case GL_GEQUAL:
2057 case GL_NOTEQUAL:
2058 break;
2059 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002060 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002061 }
2062
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002063 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002064
2065 if (context)
2066 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00002067 context->setDepthFunc(func);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002068 }
2069 }
2070 catch(std::bad_alloc&)
2071 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002072 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002073 }
2074}
2075
2076void __stdcall glDepthMask(GLboolean flag)
2077{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00002078 EVENT("(GLboolean flag = %u)", flag);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002079
2080 try
2081 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002082 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002083
2084 if (context)
2085 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00002086 context->setDepthMask(flag != GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002087 }
2088 }
2089 catch(std::bad_alloc&)
2090 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002091 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002092 }
2093}
2094
2095void __stdcall glDepthRangef(GLclampf zNear, GLclampf zFar)
2096{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002097 EVENT("(GLclampf zNear = %f, GLclampf zFar = %f)", zNear, zFar);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002098
2099 try
2100 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002101 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002102
2103 if (context)
2104 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00002105 context->setDepthRange(zNear, zFar);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002106 }
2107 }
2108 catch(std::bad_alloc&)
2109 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002110 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002111 }
2112}
2113
2114void __stdcall glDetachShader(GLuint program, GLuint shader)
2115{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002116 EVENT("(GLuint program = %d, GLuint shader = %d)", program, shader);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002117
2118 try
2119 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002120 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002121
2122 if (context)
2123 {
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00002124
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002125 gl::Program *programObject = context->getProgram(program);
2126 gl::Shader *shaderObject = context->getShader(shader);
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00002127
2128 if (!programObject)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002129 {
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00002130 gl::Shader *shaderByProgramHandle;
2131 shaderByProgramHandle = context->getShader(program);
2132 if (!shaderByProgramHandle)
2133 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002134 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00002135 }
2136 else
2137 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002138 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00002139 }
2140 }
2141
2142 if (!shaderObject)
2143 {
2144 gl::Program *programByShaderHandle = context->getProgram(shader);
2145 if (!programByShaderHandle)
2146 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002147 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00002148 }
2149 else
2150 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002151 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00002152 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002153 }
2154
2155 if (!programObject->detachShader(shaderObject))
2156 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002157 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002158 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002159 }
2160 }
2161 catch(std::bad_alloc&)
2162 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002163 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002164 }
2165}
2166
2167void __stdcall glDisable(GLenum cap)
2168{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002169 EVENT("(GLenum cap = 0x%X)", cap);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002170
2171 try
2172 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002173 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002174
2175 if (context)
2176 {
2177 switch (cap)
2178 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00002179 case GL_CULL_FACE: context->setCullFace(false); break;
2180 case GL_POLYGON_OFFSET_FILL: context->setPolygonOffsetFill(false); break;
2181 case GL_SAMPLE_ALPHA_TO_COVERAGE: context->setSampleAlphaToCoverage(false); break;
2182 case GL_SAMPLE_COVERAGE: context->setSampleCoverage(false); break;
2183 case GL_SCISSOR_TEST: context->setScissorTest(false); break;
2184 case GL_STENCIL_TEST: context->setStencilTest(false); break;
2185 case GL_DEPTH_TEST: context->setDepthTest(false); break;
2186 case GL_BLEND: context->setBlend(false); break;
2187 case GL_DITHER: context->setDither(false); break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002188 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002189 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002190 }
2191 }
2192 }
2193 catch(std::bad_alloc&)
2194 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002195 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002196 }
2197}
2198
2199void __stdcall glDisableVertexAttribArray(GLuint index)
2200{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002201 EVENT("(GLuint index = %d)", index);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002202
2203 try
2204 {
2205 if (index >= gl::MAX_VERTEX_ATTRIBS)
2206 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002207 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002208 }
2209
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002210 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002211
2212 if (context)
2213 {
daniel@transgaming.com83921382011-01-08 05:46:00 +00002214 context->setEnableVertexAttribArray(index, false);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002215 }
2216 }
2217 catch(std::bad_alloc&)
2218 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002219 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002220 }
2221}
2222
2223void __stdcall glDrawArrays(GLenum mode, GLint first, GLsizei count)
2224{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002225 EVENT("(GLenum mode = 0x%X, GLint first = %d, GLsizei count = %d)", mode, first, count);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002226
2227 try
2228 {
2229 if (count < 0 || first < 0)
2230 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002231 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002232 }
2233
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002234 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002235
2236 if (context)
2237 {
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00002238 context->drawArrays(mode, first, count, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002239 }
2240 }
2241 catch(std::bad_alloc&)
2242 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002243 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002244 }
2245}
2246
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002247void __stdcall glDrawArraysInstancedANGLE(GLenum mode, GLint first, GLsizei count, GLsizei primcount)
2248{
2249 EVENT("(GLenum mode = 0x%X, GLint first = %d, GLsizei count = %d, GLsizei primcount = %d)", mode, first, count, primcount);
2250
2251 try
2252 {
2253 if (count < 0 || first < 0 || primcount < 0)
2254 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002255 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002256 }
2257
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00002258 if (primcount > 0)
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002259 {
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00002260 gl::Context *context = gl::getNonLostContext();
2261
2262 if (context)
2263 {
2264 context->drawArrays(mode, first, count, primcount);
2265 }
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002266 }
2267 }
2268 catch(std::bad_alloc&)
2269 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002270 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002271 }
2272}
2273
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00002274void __stdcall glDrawElements(GLenum mode, GLsizei count, GLenum type, const GLvoid* indices)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002275{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002276 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 +00002277 mode, count, type, indices);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002278
2279 try
2280 {
2281 if (count < 0)
2282 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002283 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002284 }
2285
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002286 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002287
2288 if (context)
2289 {
daniel@transgaming.com83921382011-01-08 05:46:00 +00002290 switch (type)
2291 {
2292 case GL_UNSIGNED_BYTE:
2293 case GL_UNSIGNED_SHORT:
2294 break;
2295 case GL_UNSIGNED_INT:
2296 if (!context->supports32bitIndices())
2297 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002298 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com83921382011-01-08 05:46:00 +00002299 }
2300 break;
2301 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002302 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com83921382011-01-08 05:46:00 +00002303 }
2304
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00002305 context->drawElements(mode, count, type, indices, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002306 }
2307 }
2308 catch(std::bad_alloc&)
2309 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002310 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002311 }
2312}
2313
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002314void __stdcall glDrawElementsInstancedANGLE(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLsizei primcount)
2315{
2316 EVENT("(GLenum mode = 0x%X, GLsizei count = %d, GLenum type = 0x%X, const GLvoid* indices = 0x%0.8p, GLsizei primcount = %d)",
2317 mode, count, type, indices, primcount);
2318
2319 try
2320 {
2321 if (count < 0 || primcount < 0)
2322 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002323 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002324 }
2325
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00002326 if (primcount > 0)
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002327 {
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00002328 gl::Context *context = gl::getNonLostContext();
2329
2330 if (context)
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002331 {
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00002332 switch (type)
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002333 {
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00002334 case GL_UNSIGNED_BYTE:
2335 case GL_UNSIGNED_SHORT:
2336 break;
2337 case GL_UNSIGNED_INT:
2338 if (!context->supports32bitIndices())
2339 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002340 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00002341 }
2342 break;
2343 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002344 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002345 }
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00002346
2347 context->drawElements(mode, count, type, indices, primcount);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002348 }
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002349 }
2350 }
2351 catch(std::bad_alloc&)
2352 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002353 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002354 }
2355}
2356
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002357void __stdcall glEnable(GLenum cap)
2358{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002359 EVENT("(GLenum cap = 0x%X)", cap);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002360
2361 try
2362 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002363 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002364
2365 if (context)
2366 {
2367 switch (cap)
2368 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00002369 case GL_CULL_FACE: context->setCullFace(true); break;
2370 case GL_POLYGON_OFFSET_FILL: context->setPolygonOffsetFill(true); break;
2371 case GL_SAMPLE_ALPHA_TO_COVERAGE: context->setSampleAlphaToCoverage(true); break;
2372 case GL_SAMPLE_COVERAGE: context->setSampleCoverage(true); break;
2373 case GL_SCISSOR_TEST: context->setScissorTest(true); break;
2374 case GL_STENCIL_TEST: context->setStencilTest(true); break;
2375 case GL_DEPTH_TEST: context->setDepthTest(true); break;
2376 case GL_BLEND: context->setBlend(true); break;
2377 case GL_DITHER: context->setDither(true); break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002378 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002379 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002380 }
2381 }
2382 }
2383 catch(std::bad_alloc&)
2384 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002385 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002386 }
2387}
2388
2389void __stdcall glEnableVertexAttribArray(GLuint index)
2390{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002391 EVENT("(GLuint index = %d)", index);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002392
2393 try
2394 {
2395 if (index >= gl::MAX_VERTEX_ATTRIBS)
2396 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002397 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002398 }
2399
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002400 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002401
2402 if (context)
2403 {
daniel@transgaming.com83921382011-01-08 05:46:00 +00002404 context->setEnableVertexAttribArray(index, true);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002405 }
2406 }
2407 catch(std::bad_alloc&)
2408 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002409 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002410 }
2411}
2412
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00002413void __stdcall glEndQueryEXT(GLenum target)
2414{
2415 EVENT("GLenum target = 0x%X)", target);
2416
2417 try
2418 {
2419 switch (target)
2420 {
2421 case GL_ANY_SAMPLES_PASSED_EXT:
2422 case GL_ANY_SAMPLES_PASSED_CONSERVATIVE_EXT:
2423 break;
2424 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002425 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00002426 }
2427
2428 gl::Context *context = gl::getNonLostContext();
2429
2430 if (context)
2431 {
2432 context->endQuery(target);
2433 }
2434 }
2435 catch(std::bad_alloc&)
2436 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002437 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00002438 }
2439}
2440
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002441void __stdcall glFinishFenceNV(GLuint fence)
2442{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002443 EVENT("(GLuint fence = %d)", fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002444
2445 try
2446 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002447 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002448
2449 if (context)
2450 {
2451 gl::Fence* fenceObject = context->getFence(fence);
2452
2453 if (fenceObject == NULL)
2454 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002455 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002456 }
2457
2458 fenceObject->finishFence();
2459 }
2460 }
2461 catch(std::bad_alloc&)
2462 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002463 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002464 }
2465}
2466
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002467void __stdcall glFinish(void)
2468{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002469 EVENT("()");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002470
2471 try
2472 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002473 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002474
2475 if (context)
2476 {
daniel@transgaming.com0d86aa72011-10-26 02:35:10 +00002477 context->sync(true);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002478 }
2479 }
2480 catch(std::bad_alloc&)
2481 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002482 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002483 }
2484}
2485
2486void __stdcall glFlush(void)
2487{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002488 EVENT("()");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002489
2490 try
2491 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002492 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002493
2494 if (context)
2495 {
daniel@transgaming.com0d86aa72011-10-26 02:35:10 +00002496 context->sync(false);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002497 }
2498 }
2499 catch(std::bad_alloc&)
2500 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002501 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002502 }
2503}
2504
2505void __stdcall glFramebufferRenderbuffer(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer)
2506{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002507 EVENT("(GLenum target = 0x%X, GLenum attachment = 0x%X, GLenum renderbuffertarget = 0x%X, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00002508 "GLuint renderbuffer = %d)", target, attachment, renderbuffertarget, renderbuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002509
2510 try
2511 {
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002512 if ((target != GL_FRAMEBUFFER && target != GL_DRAW_FRAMEBUFFER_ANGLE && target != GL_READ_FRAMEBUFFER_ANGLE)
daniel@transgaming.com2fa45512011-10-04 18:43:18 +00002513 || (renderbuffertarget != GL_RENDERBUFFER && renderbuffer != 0))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002514 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002515 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002516 }
2517
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002518 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002519
2520 if (context)
2521 {
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002522 gl::Framebuffer *framebuffer = NULL;
2523 GLuint framebufferHandle = 0;
2524 if (target == GL_READ_FRAMEBUFFER_ANGLE)
2525 {
2526 framebuffer = context->getReadFramebuffer();
2527 framebufferHandle = context->getReadFramebufferHandle();
2528 }
daniel@transgaming.com2fa45512011-10-04 18:43:18 +00002529 else
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002530 {
2531 framebuffer = context->getDrawFramebuffer();
2532 framebufferHandle = context->getDrawFramebufferHandle();
2533 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002534
daniel@transgaming.com2fa45512011-10-04 18:43:18 +00002535 if (!framebuffer || (framebufferHandle == 0 && renderbuffer != 0))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002536 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002537 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002538 }
2539
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002540 if (attachment >= GL_COLOR_ATTACHMENT0_EXT && attachment <= GL_COLOR_ATTACHMENT15_EXT)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002541 {
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002542 const unsigned int colorAttachment = (attachment - GL_COLOR_ATTACHMENT0_EXT);
2543
2544 if (colorAttachment >= context->getMaximumRenderTargets())
2545 {
2546 return gl::error(GL_INVALID_VALUE);
2547 }
2548
2549 framebuffer->setColorbuffer(colorAttachment, GL_RENDERBUFFER, renderbuffer);
2550 }
2551 else
2552 {
2553 switch (attachment)
2554 {
2555 case GL_DEPTH_ATTACHMENT:
2556 framebuffer->setDepthbuffer(GL_RENDERBUFFER, renderbuffer);
2557 break;
2558 case GL_STENCIL_ATTACHMENT:
2559 framebuffer->setStencilbuffer(GL_RENDERBUFFER, renderbuffer);
2560 break;
2561 default:
2562 return gl::error(GL_INVALID_ENUM);
2563 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002564 }
2565 }
2566 }
2567 catch(std::bad_alloc&)
2568 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002569 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002570 }
2571}
2572
2573void __stdcall glFramebufferTexture2D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level)
2574{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002575 EVENT("(GLenum target = 0x%X, GLenum attachment = 0x%X, GLenum textarget = 0x%X, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00002576 "GLuint texture = %d, GLint level = %d)", target, attachment, textarget, texture, level);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002577
2578 try
2579 {
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002580 if (target != GL_FRAMEBUFFER && target != GL_DRAW_FRAMEBUFFER_ANGLE && target != GL_READ_FRAMEBUFFER_ANGLE)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002581 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002582 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002583 }
2584
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002585 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002586
2587 if (context)
2588 {
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002589 if (attachment >= GL_COLOR_ATTACHMENT0_EXT && attachment <= GL_COLOR_ATTACHMENT15_EXT)
2590 {
2591 const unsigned int colorAttachment = (attachment - GL_COLOR_ATTACHMENT0_EXT);
2592
2593 if (colorAttachment >= context->getMaximumRenderTargets())
2594 {
2595 return gl::error(GL_INVALID_VALUE);
2596 }
2597 }
2598 else
2599 {
2600 switch (attachment)
2601 {
2602 case GL_DEPTH_ATTACHMENT:
2603 case GL_STENCIL_ATTACHMENT:
2604 break;
2605 default:
2606 return gl::error(GL_INVALID_ENUM);
2607 }
2608 }
2609
daniel@transgaming.com93a81472010-04-20 18:52:58 +00002610 if (texture == 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002611 {
daniel@transgaming.com93a81472010-04-20 18:52:58 +00002612 textarget = GL_NONE;
2613 }
2614 else
2615 {
2616 gl::Texture *tex = context->getTexture(texture);
2617
2618 if (tex == NULL)
2619 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002620 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com93a81472010-04-20 18:52:58 +00002621 }
2622
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002623 switch (textarget)
2624 {
2625 case GL_TEXTURE_2D:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002626 {
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00002627 if (tex->getTarget() != GL_TEXTURE_2D)
2628 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002629 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00002630 }
2631 gl::Texture2D *tex2d = static_cast<gl::Texture2D *>(tex);
daniel@transgaming.com92f49922012-05-09 15:49:19 +00002632 if (tex2d->isCompressed(0))
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00002633 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002634 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00002635 }
2636 break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002637 }
daniel@transgaming.com93a81472010-04-20 18:52:58 +00002638
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002639 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002640 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002641 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002642 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002643 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002644 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
daniel@transgaming.com93a81472010-04-20 18:52:58 +00002645 {
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00002646 if (tex->getTarget() != GL_TEXTURE_CUBE_MAP)
2647 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002648 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00002649 }
2650 gl::TextureCubeMap *texcube = static_cast<gl::TextureCubeMap *>(tex);
daniel@transgaming.com4df88e82012-05-09 15:49:24 +00002651 if (texcube->isCompressed(textarget, level))
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00002652 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002653 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00002654 }
2655 break;
daniel@transgaming.com93a81472010-04-20 18:52:58 +00002656 }
daniel@transgaming.com93a81472010-04-20 18:52:58 +00002657
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002658 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002659 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002660 }
2661
2662 if (level != 0)
2663 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002664 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002665 }
2666 }
2667
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002668 gl::Framebuffer *framebuffer = NULL;
2669 GLuint framebufferHandle = 0;
2670 if (target == GL_READ_FRAMEBUFFER_ANGLE)
2671 {
2672 framebuffer = context->getReadFramebuffer();
2673 framebufferHandle = context->getReadFramebufferHandle();
2674 }
2675 else
2676 {
2677 framebuffer = context->getDrawFramebuffer();
2678 framebufferHandle = context->getDrawFramebufferHandle();
2679 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002680
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002681 if (framebufferHandle == 0 || !framebuffer)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002682 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002683 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002684 }
2685
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002686 if (attachment >= GL_COLOR_ATTACHMENT0_EXT && attachment <= GL_COLOR_ATTACHMENT15_EXT)
daniel@transgaming.comfbc09532010-04-26 15:33:41 +00002687 {
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002688 const unsigned int colorAttachment = (attachment - GL_COLOR_ATTACHMENT0_EXT);
2689
2690 if (colorAttachment >= context->getMaximumRenderTargets())
2691 {
2692 return gl::error(GL_INVALID_VALUE);
2693 }
2694
2695 framebuffer->setColorbuffer(colorAttachment, textarget, texture);
2696 }
2697 else
2698 {
2699 switch (attachment)
2700 {
2701 case GL_DEPTH_ATTACHMENT: framebuffer->setDepthbuffer(textarget, texture); break;
2702 case GL_STENCIL_ATTACHMENT: framebuffer->setStencilbuffer(textarget, texture); break;
2703 }
daniel@transgaming.comfbc09532010-04-26 15:33:41 +00002704 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002705 }
2706 }
2707 catch(std::bad_alloc&)
2708 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002709 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002710 }
2711}
2712
2713void __stdcall glFrontFace(GLenum mode)
2714{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002715 EVENT("(GLenum mode = 0x%X)", mode);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002716
2717 try
2718 {
2719 switch (mode)
2720 {
2721 case GL_CW:
2722 case GL_CCW:
2723 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002724 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002725
2726 if (context)
2727 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00002728 context->setFrontFace(mode);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002729 }
2730 }
2731 break;
2732 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002733 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002734 }
2735 }
2736 catch(std::bad_alloc&)
2737 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002738 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002739 }
2740}
2741
2742void __stdcall glGenBuffers(GLsizei n, GLuint* buffers)
2743{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002744 EVENT("(GLsizei n = %d, GLuint* buffers = 0x%0.8p)", n, buffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002745
2746 try
2747 {
2748 if (n < 0)
2749 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002750 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002751 }
2752
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002753 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002754
2755 if (context)
2756 {
2757 for (int i = 0; i < n; i++)
2758 {
2759 buffers[i] = context->createBuffer();
2760 }
2761 }
2762 }
2763 catch(std::bad_alloc&)
2764 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002765 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002766 }
2767}
2768
2769void __stdcall glGenerateMipmap(GLenum target)
2770{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002771 EVENT("(GLenum target = 0x%X)", target);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002772
2773 try
2774 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002775 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com8fd99e22010-04-20 18:52:00 +00002776
2777 if (context)
2778 {
daniel@transgaming.com8fd99e22010-04-20 18:52:00 +00002779 switch (target)
2780 {
2781 case GL_TEXTURE_2D:
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00002782 {
2783 gl::Texture2D *tex2d = context->getTexture2D();
2784
daniel@transgaming.com92f49922012-05-09 15:49:19 +00002785 if (tex2d->isCompressed(0))
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00002786 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002787 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00002788 }
daniel@transgaming.com0c854682012-05-31 01:14:11 +00002789 if (tex2d->isDepth(0))
2790 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002791 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com0c854682012-05-31 01:14:11 +00002792 }
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00002793
2794 tex2d->generateMipmaps();
2795 break;
2796 }
daniel@transgaming.com8fd99e22010-04-20 18:52:00 +00002797
2798 case GL_TEXTURE_CUBE_MAP:
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00002799 {
2800 gl::TextureCubeMap *texcube = context->getTextureCubeMap();
2801
daniel@transgaming.com4df88e82012-05-09 15:49:24 +00002802 if (texcube->isCompressed(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0))
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00002803 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002804 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00002805 }
2806
2807 texcube->generateMipmaps();
2808 break;
2809 }
daniel@transgaming.com8fd99e22010-04-20 18:52:00 +00002810
2811 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002812 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com8fd99e22010-04-20 18:52:00 +00002813 }
daniel@transgaming.com8fd99e22010-04-20 18:52:00 +00002814 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002815 }
2816 catch(std::bad_alloc&)
2817 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002818 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002819 }
2820}
2821
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002822void __stdcall glGenFencesNV(GLsizei n, GLuint* fences)
2823{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002824 EVENT("(GLsizei n = %d, GLuint* fences = 0x%0.8p)", n, fences);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002825
2826 try
2827 {
2828 if (n < 0)
2829 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002830 return gl::error(GL_INVALID_VALUE);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002831 }
2832
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002833 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002834
2835 if (context)
2836 {
2837 for (int i = 0; i < n; i++)
2838 {
2839 fences[i] = context->createFence();
2840 }
2841 }
2842 }
2843 catch(std::bad_alloc&)
2844 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002845 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002846 }
2847}
2848
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002849void __stdcall glGenFramebuffers(GLsizei n, GLuint* framebuffers)
2850{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002851 EVENT("(GLsizei n = %d, GLuint* framebuffers = 0x%0.8p)", n, framebuffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002852
2853 try
2854 {
2855 if (n < 0)
2856 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002857 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002858 }
2859
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002860 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002861
2862 if (context)
2863 {
2864 for (int i = 0; i < n; i++)
2865 {
2866 framebuffers[i] = context->createFramebuffer();
2867 }
2868 }
2869 }
2870 catch(std::bad_alloc&)
2871 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002872 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002873 }
2874}
2875
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00002876void __stdcall glGenQueriesEXT(GLsizei n, GLuint* ids)
2877{
2878 EVENT("(GLsizei n = %d, GLuint* ids = 0x%0.8p)", n, ids);
2879
2880 try
2881 {
2882 if (n < 0)
2883 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002884 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00002885 }
2886
2887 gl::Context *context = gl::getNonLostContext();
2888
2889 if (context)
2890 {
2891 for (int i = 0; i < n; i++)
2892 {
2893 ids[i] = context->createQuery();
2894 }
2895 }
2896 }
2897 catch(std::bad_alloc&)
2898 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002899 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00002900 }
2901}
2902
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002903void __stdcall glGenRenderbuffers(GLsizei n, GLuint* renderbuffers)
2904{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002905 EVENT("(GLsizei n = %d, GLuint* renderbuffers = 0x%0.8p)", n, renderbuffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002906
2907 try
2908 {
2909 if (n < 0)
2910 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002911 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002912 }
2913
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002914 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002915
2916 if (context)
2917 {
2918 for (int i = 0; i < n; i++)
2919 {
2920 renderbuffers[i] = context->createRenderbuffer();
2921 }
2922 }
2923 }
2924 catch(std::bad_alloc&)
2925 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002926 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002927 }
2928}
2929
2930void __stdcall glGenTextures(GLsizei n, GLuint* textures)
2931{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002932 EVENT("(GLsizei n = %d, GLuint* textures = 0x%0.8p)", n, textures);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002933
2934 try
2935 {
2936 if (n < 0)
2937 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002938 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002939 }
2940
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002941 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002942
2943 if (context)
2944 {
2945 for (int i = 0; i < n; i++)
2946 {
2947 textures[i] = context->createTexture();
2948 }
2949 }
2950 }
2951 catch(std::bad_alloc&)
2952 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002953 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002954 }
2955}
2956
daniel@transgaming.com85423182010-04-22 13:35:27 +00002957void __stdcall glGetActiveAttrib(GLuint program, GLuint index, GLsizei bufsize, GLsizei *length, GLint *size, GLenum *type, GLchar *name)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002958{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002959 EVENT("(GLuint program = %d, GLuint index = %d, GLsizei bufsize = %d, GLsizei *length = 0x%0.8p, "
daniel@transgaming.com85423182010-04-22 13:35:27 +00002960 "GLint *size = 0x%0.8p, GLenum *type = %0.8p, GLchar *name = %0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002961 program, index, bufsize, length, size, type, name);
2962
2963 try
2964 {
2965 if (bufsize < 0)
2966 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002967 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002968 }
2969
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002970 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com85423182010-04-22 13:35:27 +00002971
2972 if (context)
2973 {
2974 gl::Program *programObject = context->getProgram(program);
2975
2976 if (!programObject)
2977 {
2978 if (context->getShader(program))
2979 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002980 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com85423182010-04-22 13:35:27 +00002981 }
2982 else
2983 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002984 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com85423182010-04-22 13:35:27 +00002985 }
2986 }
2987
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00002988 if (index >= (GLuint)programObject->getActiveAttributeCount())
daniel@transgaming.com85423182010-04-22 13:35:27 +00002989 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002990 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com85423182010-04-22 13:35:27 +00002991 }
2992
2993 programObject->getActiveAttribute(index, bufsize, length, size, type, name);
2994 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002995 }
2996 catch(std::bad_alloc&)
2997 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002998 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002999 }
3000}
3001
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00003002void __stdcall glGetActiveUniform(GLuint program, GLuint index, GLsizei bufsize, GLsizei* length, GLint* size, GLenum* type, GLchar* name)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003003{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003004 EVENT("(GLuint program = %d, GLuint index = %d, GLsizei bufsize = %d, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00003005 "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 +00003006 program, index, bufsize, length, size, type, name);
3007
3008 try
3009 {
3010 if (bufsize < 0)
3011 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003012 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003013 }
3014
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003015 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00003016
3017 if (context)
3018 {
3019 gl::Program *programObject = context->getProgram(program);
3020
3021 if (!programObject)
3022 {
3023 if (context->getShader(program))
3024 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003025 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00003026 }
3027 else
3028 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003029 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00003030 }
3031 }
3032
3033 if (index >= (GLuint)programObject->getActiveUniformCount())
3034 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003035 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00003036 }
3037
3038 programObject->getActiveUniform(index, bufsize, length, size, type, name);
3039 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003040 }
3041 catch(std::bad_alloc&)
3042 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003043 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003044 }
3045}
3046
3047void __stdcall glGetAttachedShaders(GLuint program, GLsizei maxcount, GLsizei* count, GLuint* shaders)
3048{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003049 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 +00003050 program, maxcount, count, shaders);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003051
3052 try
3053 {
3054 if (maxcount < 0)
3055 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003056 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003057 }
3058
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003059 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com6c785212010-03-30 03:36:17 +00003060
3061 if (context)
3062 {
3063 gl::Program *programObject = context->getProgram(program);
3064
3065 if (!programObject)
3066 {
daniel@transgaming.com23953e32010-04-13 19:53:31 +00003067 if (context->getShader(program))
3068 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003069 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com23953e32010-04-13 19:53:31 +00003070 }
3071 else
3072 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003073 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com23953e32010-04-13 19:53:31 +00003074 }
daniel@transgaming.com6c785212010-03-30 03:36:17 +00003075 }
3076
3077 return programObject->getAttachedShaders(maxcount, count, shaders);
3078 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003079 }
3080 catch(std::bad_alloc&)
3081 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003082 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003083 }
3084}
3085
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00003086int __stdcall glGetAttribLocation(GLuint program, const GLchar* name)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003087{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003088 EVENT("(GLuint program = %d, const GLchar* name = %s)", program, name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003089
3090 try
3091 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003092 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003093
3094 if (context)
3095 {
daniel@transgaming.combb274c32010-04-13 03:26:21 +00003096
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003097 gl::Program *programObject = context->getProgram(program);
3098
3099 if (!programObject)
3100 {
daniel@transgaming.combb274c32010-04-13 03:26:21 +00003101 if (context->getShader(program))
3102 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003103 return gl::error(GL_INVALID_OPERATION, -1);
daniel@transgaming.combb274c32010-04-13 03:26:21 +00003104 }
3105 else
3106 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003107 return gl::error(GL_INVALID_VALUE, -1);
daniel@transgaming.combb274c32010-04-13 03:26:21 +00003108 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003109 }
3110
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003111 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
daniel@transgaming.com716056c2012-07-24 18:38:59 +00003112 if (!programObject->isLinked() || !programBinary)
daniel@transgaming.comcf4aa872010-04-13 03:26:27 +00003113 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003114 return gl::error(GL_INVALID_OPERATION, -1);
daniel@transgaming.comcf4aa872010-04-13 03:26:27 +00003115 }
3116
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003117 return programBinary->getAttributeLocation(name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003118 }
3119 }
3120 catch(std::bad_alloc&)
3121 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003122 return gl::error(GL_OUT_OF_MEMORY, -1);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003123 }
3124
3125 return -1;
3126}
3127
3128void __stdcall glGetBooleanv(GLenum pname, GLboolean* params)
3129{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003130 EVENT("(GLenum pname = 0x%X, GLboolean* params = 0x%0.8p)", pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003131
3132 try
3133 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003134 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003135
3136 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003137 {
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003138 if (!(context->getBooleanv(pname, params)))
3139 {
3140 GLenum nativeType;
3141 unsigned int numParams = 0;
3142 if (!context->getQueryParameterInfo(pname, &nativeType, &numParams))
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003143 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003144
3145 if (numParams == 0)
3146 return; // it is known that the pname is valid, but there are no parameters to return
3147
3148 if (nativeType == GL_FLOAT)
3149 {
3150 GLfloat *floatParams = NULL;
3151 floatParams = new GLfloat[numParams];
3152
3153 context->getFloatv(pname, floatParams);
3154
3155 for (unsigned int i = 0; i < numParams; ++i)
3156 {
3157 if (floatParams[i] == 0.0f)
3158 params[i] = GL_FALSE;
3159 else
3160 params[i] = GL_TRUE;
3161 }
3162
3163 delete [] floatParams;
3164 }
3165 else if (nativeType == GL_INT)
3166 {
3167 GLint *intParams = NULL;
3168 intParams = new GLint[numParams];
3169
3170 context->getIntegerv(pname, intParams);
3171
3172 for (unsigned int i = 0; i < numParams; ++i)
3173 {
3174 if (intParams[i] == 0)
3175 params[i] = GL_FALSE;
3176 else
3177 params[i] = GL_TRUE;
3178 }
3179
3180 delete [] intParams;
3181 }
3182 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003183 }
3184 }
3185 catch(std::bad_alloc&)
3186 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003187 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003188 }
3189}
3190
3191void __stdcall glGetBufferParameteriv(GLenum target, GLenum pname, GLint* params)
3192{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003193 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 +00003194
3195 try
3196 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003197 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comaa0ccbd2010-04-15 20:45:05 +00003198
3199 if (context)
3200 {
3201 gl::Buffer *buffer;
3202
3203 switch (target)
3204 {
3205 case GL_ARRAY_BUFFER:
3206 buffer = context->getArrayBuffer();
3207 break;
3208 case GL_ELEMENT_ARRAY_BUFFER:
3209 buffer = context->getElementArrayBuffer();
3210 break;
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003211 default: return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comaa0ccbd2010-04-15 20:45:05 +00003212 }
3213
3214 if (!buffer)
3215 {
3216 // A null buffer means that "0" is bound to the requested buffer target
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003217 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comaa0ccbd2010-04-15 20:45:05 +00003218 }
3219
3220 switch (pname)
3221 {
3222 case GL_BUFFER_USAGE:
3223 *params = buffer->usage();
3224 break;
3225 case GL_BUFFER_SIZE:
3226 *params = buffer->size();
3227 break;
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003228 default: return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comaa0ccbd2010-04-15 20:45:05 +00003229 }
3230 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003231 }
3232 catch(std::bad_alloc&)
3233 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003234 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003235 }
3236}
3237
3238GLenum __stdcall glGetError(void)
3239{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003240 EVENT("()");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003241
3242 gl::Context *context = gl::getContext();
3243
3244 if (context)
3245 {
daniel@transgaming.com82b28912011-12-12 21:01:35 +00003246 return context->getError();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003247 }
3248
3249 return GL_NO_ERROR;
3250}
3251
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00003252void __stdcall glGetFenceivNV(GLuint fence, GLenum pname, GLint *params)
3253{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003254 EVENT("(GLuint fence = %d, GLenum pname = 0x%X, GLint *params = 0x%0.8p)", fence, pname, params);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00003255
3256 try
3257 {
3258
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003259 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00003260
3261 if (context)
3262 {
3263 gl::Fence *fenceObject = context->getFence(fence);
3264
3265 if (fenceObject == NULL)
3266 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003267 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00003268 }
3269
3270 fenceObject->getFenceiv(pname, params);
3271 }
3272 }
3273 catch(std::bad_alloc&)
3274 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003275 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00003276 }
3277}
3278
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003279void __stdcall glGetFloatv(GLenum pname, GLfloat* params)
3280{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003281 EVENT("(GLenum pname = 0x%X, GLfloat* params = 0x%0.8p)", pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003282
3283 try
3284 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003285 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com32e58cd2010-03-24 09:44:10 +00003286
3287 if (context)
3288 {
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003289 if (!(context->getFloatv(pname, params)))
daniel@transgaming.com32e58cd2010-03-24 09:44:10 +00003290 {
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003291 GLenum nativeType;
3292 unsigned int numParams = 0;
3293 if (!context->getQueryParameterInfo(pname, &nativeType, &numParams))
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003294 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003295
3296 if (numParams == 0)
3297 return; // it is known that the pname is valid, but that there are no parameters to return.
3298
3299 if (nativeType == GL_BOOL)
3300 {
3301 GLboolean *boolParams = NULL;
3302 boolParams = new GLboolean[numParams];
3303
3304 context->getBooleanv(pname, boolParams);
3305
3306 for (unsigned int i = 0; i < numParams; ++i)
3307 {
3308 if (boolParams[i] == GL_FALSE)
3309 params[i] = 0.0f;
3310 else
3311 params[i] = 1.0f;
3312 }
3313
3314 delete [] boolParams;
3315 }
3316 else if (nativeType == GL_INT)
3317 {
3318 GLint *intParams = NULL;
3319 intParams = new GLint[numParams];
3320
3321 context->getIntegerv(pname, intParams);
3322
3323 for (unsigned int i = 0; i < numParams; ++i)
3324 {
3325 params[i] = (GLfloat)intParams[i];
3326 }
3327
3328 delete [] intParams;
3329 }
daniel@transgaming.com32e58cd2010-03-24 09:44:10 +00003330 }
3331 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003332 }
3333 catch(std::bad_alloc&)
3334 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003335 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003336 }
3337}
3338
3339void __stdcall glGetFramebufferAttachmentParameteriv(GLenum target, GLenum attachment, GLenum pname, GLint* params)
3340{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003341 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 +00003342 target, attachment, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003343
3344 try
3345 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003346 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003347
3348 if (context)
3349 {
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00003350 if (target != GL_FRAMEBUFFER && target != GL_DRAW_FRAMEBUFFER_ANGLE && target != GL_READ_FRAMEBUFFER_ANGLE)
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003351 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003352 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003353 }
3354
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00003355 gl::Framebuffer *framebuffer = NULL;
3356 if (target == GL_READ_FRAMEBUFFER_ANGLE)
3357 {
3358 if(context->getReadFramebufferHandle() == 0)
3359 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003360 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00003361 }
3362
3363 framebuffer = context->getReadFramebuffer();
3364 }
3365 else
3366 {
3367 if (context->getDrawFramebufferHandle() == 0)
3368 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003369 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00003370 }
3371
3372 framebuffer = context->getDrawFramebuffer();
3373 }
3374
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003375 GLenum attachmentType;
3376 GLuint attachmentHandle;
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00003377
3378 if (attachment >= GL_COLOR_ATTACHMENT0_EXT && attachment <= GL_COLOR_ATTACHMENT15_EXT)
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003379 {
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00003380 const unsigned int colorAttachment = (attachment - GL_COLOR_ATTACHMENT0_EXT);
3381
3382 if (colorAttachment >= context->getMaximumRenderTargets())
3383 {
3384 return gl::error(GL_INVALID_ENUM);
3385 }
3386
3387 attachmentType = framebuffer->getColorbufferType(colorAttachment);
3388 attachmentHandle = framebuffer->getColorbufferHandle(colorAttachment);
3389 }
3390 else
3391 {
3392 switch (attachment)
3393 {
3394 case GL_DEPTH_ATTACHMENT:
3395 attachmentType = framebuffer->getDepthbufferType();
3396 attachmentHandle = framebuffer->getDepthbufferHandle();
3397 break;
3398 case GL_STENCIL_ATTACHMENT:
3399 attachmentType = framebuffer->getStencilbufferType();
3400 attachmentHandle = framebuffer->getStencilbufferHandle();
3401 break;
3402 default: return gl::error(GL_INVALID_ENUM);
3403 }
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003404 }
3405
3406 GLenum attachmentObjectType; // Type category
daniel@transgaming.comfbc09532010-04-26 15:33:41 +00003407 if (attachmentType == GL_NONE || attachmentType == GL_RENDERBUFFER)
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003408 {
3409 attachmentObjectType = attachmentType;
3410 }
apatrick@chromium.org551022e2012-01-23 19:56:54 +00003411 else if (gl::IsInternalTextureTarget(attachmentType))
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003412 {
3413 attachmentObjectType = GL_TEXTURE;
3414 }
apatrick@chromium.orga1d80592012-01-25 21:52:10 +00003415 else
3416 {
3417 UNREACHABLE();
3418 return;
3419 }
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003420
3421 switch (pname)
3422 {
3423 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE:
3424 *params = attachmentObjectType;
3425 break;
3426 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME:
3427 if (attachmentObjectType == GL_RENDERBUFFER || attachmentObjectType == GL_TEXTURE)
3428 {
3429 *params = attachmentHandle;
3430 }
3431 else
3432 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003433 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003434 }
3435 break;
3436 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL:
3437 if (attachmentObjectType == GL_TEXTURE)
3438 {
3439 *params = 0; // FramebufferTexture2D will not allow level to be set to anything else in GL ES 2.0
3440 }
3441 else
3442 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003443 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003444 }
3445 break;
3446 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE:
3447 if (attachmentObjectType == GL_TEXTURE)
3448 {
daniel@transgaming.com19ffc242010-05-04 03:35:21 +00003449 if (gl::IsCubemapTextureTarget(attachmentType))
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003450 {
3451 *params = attachmentType;
3452 }
3453 else
3454 {
3455 *params = 0;
3456 }
3457 }
3458 else
3459 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003460 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003461 }
3462 break;
3463 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003464 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003465 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003466 }
3467 }
3468 catch(std::bad_alloc&)
3469 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003470 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003471 }
3472}
3473
daniel@transgaming.com17f548c2011-11-09 17:47:02 +00003474GLenum __stdcall glGetGraphicsResetStatusEXT(void)
3475{
3476 EVENT("()");
3477
3478 try
3479 {
3480 gl::Context *context = gl::getContext();
3481
3482 if (context)
3483 {
3484 return context->getResetStatus();
3485 }
3486
3487 return GL_NO_ERROR;
3488 }
3489 catch(std::bad_alloc&)
3490 {
3491 return GL_OUT_OF_MEMORY;
3492 }
3493}
3494
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003495void __stdcall glGetIntegerv(GLenum pname, GLint* params)
3496{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003497 EVENT("(GLenum pname = 0x%X, GLint* params = 0x%0.8p)", pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003498
3499 try
3500 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003501 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003502
3503 if (context)
3504 {
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003505 if (!(context->getIntegerv(pname, params)))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003506 {
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003507 GLenum nativeType;
3508 unsigned int numParams = 0;
3509 if (!context->getQueryParameterInfo(pname, &nativeType, &numParams))
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003510 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003511
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003512 if (numParams == 0)
3513 return; // it is known that pname is valid, but there are no parameters to return
3514
3515 if (nativeType == GL_BOOL)
3516 {
3517 GLboolean *boolParams = NULL;
3518 boolParams = new GLboolean[numParams];
3519
3520 context->getBooleanv(pname, boolParams);
3521
3522 for (unsigned int i = 0; i < numParams; ++i)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003523 {
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003524 if (boolParams[i] == GL_FALSE)
3525 params[i] = 0;
3526 else
3527 params[i] = 1;
3528 }
3529
3530 delete [] boolParams;
3531 }
3532 else if (nativeType == GL_FLOAT)
3533 {
3534 GLfloat *floatParams = NULL;
3535 floatParams = new GLfloat[numParams];
3536
3537 context->getFloatv(pname, floatParams);
3538
3539 for (unsigned int i = 0; i < numParams; ++i)
3540 {
daniel@transgaming.comc1641352010-04-26 15:33:36 +00003541 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 +00003542 {
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003543 params[i] = (GLint)(((GLfloat)(0xFFFFFFFF) * floatParams[i] - 1.0f) / 2.0f);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003544 }
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003545 else
3546 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 +00003547 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003548
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003549 delete [] floatParams;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003550 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003551 }
3552 }
3553 }
3554 catch(std::bad_alloc&)
3555 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003556 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003557 }
3558}
3559
3560void __stdcall glGetProgramiv(GLuint program, GLenum pname, GLint* params)
3561{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003562 EVENT("(GLuint program = %d, GLenum pname = %d, GLint* params = 0x%0.8p)", program, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003563
3564 try
3565 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003566 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003567
3568 if (context)
3569 {
3570 gl::Program *programObject = context->getProgram(program);
3571
3572 if (!programObject)
3573 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003574 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003575 }
3576
3577 switch (pname)
3578 {
3579 case GL_DELETE_STATUS:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003580 *params = programObject->isFlaggedForDeletion();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003581 return;
3582 case GL_LINK_STATUS:
daniel@transgaming.com716056c2012-07-24 18:38:59 +00003583 *params = programObject->isLinked();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003584 return;
3585 case GL_VALIDATE_STATUS:
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00003586 *params = programObject->isValidated();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003587 return;
3588 case GL_INFO_LOG_LENGTH:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003589 *params = programObject->getInfoLogLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003590 return;
3591 case GL_ATTACHED_SHADERS:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003592 *params = programObject->getAttachedShadersCount();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003593 return;
3594 case GL_ACTIVE_ATTRIBUTES:
daniel@transgaming.com85423182010-04-22 13:35:27 +00003595 *params = programObject->getActiveAttributeCount();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003596 return;
3597 case GL_ACTIVE_ATTRIBUTE_MAX_LENGTH:
daniel@transgaming.com85423182010-04-22 13:35:27 +00003598 *params = programObject->getActiveAttributeMaxLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003599 return;
3600 case GL_ACTIVE_UNIFORMS:
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00003601 *params = programObject->getActiveUniformCount();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003602 return;
3603 case GL_ACTIVE_UNIFORM_MAX_LENGTH:
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00003604 *params = programObject->getActiveUniformMaxLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003605 return;
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00003606 case GL_PROGRAM_BINARY_LENGTH_OES:
apatrick@chromium.org90080e32012-07-09 22:15:33 +00003607 *params = programObject->getProgramBinaryLength();
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00003608 return;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003609 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003610 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003611 }
3612 }
3613 }
3614 catch(std::bad_alloc&)
3615 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003616 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003617 }
3618}
3619
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00003620void __stdcall glGetProgramInfoLog(GLuint program, GLsizei bufsize, GLsizei* length, GLchar* infolog)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003621{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003622 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 +00003623 program, bufsize, length, infolog);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003624
3625 try
3626 {
3627 if (bufsize < 0)
3628 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003629 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003630 }
3631
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003632 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003633
3634 if (context)
3635 {
3636 gl::Program *programObject = context->getProgram(program);
3637
3638 if (!programObject)
3639 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003640 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003641 }
3642
3643 programObject->getInfoLog(bufsize, length, infolog);
3644 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003645 }
3646 catch(std::bad_alloc&)
3647 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003648 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003649 }
3650}
3651
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003652void __stdcall glGetQueryivEXT(GLenum target, GLenum pname, GLint *params)
3653{
3654 EVENT("GLenum target = 0x%X, GLenum pname = 0x%X, GLint *params = 0x%0.8p)", target, pname, params);
3655
3656 try
3657 {
3658 switch (pname)
3659 {
3660 case GL_CURRENT_QUERY_EXT:
3661 break;
3662 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003663 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003664 }
3665
3666 gl::Context *context = gl::getNonLostContext();
3667
3668 if (context)
3669 {
3670 params[0] = context->getActiveQuery(target);
3671 }
3672 }
3673 catch(std::bad_alloc&)
3674 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003675 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003676 }
3677}
3678
3679void __stdcall glGetQueryObjectuivEXT(GLuint id, GLenum pname, GLuint *params)
3680{
3681 EVENT("(GLuint id = %d, GLenum pname = 0x%X, GLuint *params = 0x%0.8p)", id, pname, params);
3682
3683 try
3684 {
3685 switch (pname)
3686 {
3687 case GL_QUERY_RESULT_EXT:
3688 case GL_QUERY_RESULT_AVAILABLE_EXT:
3689 break;
3690 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003691 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003692 }
3693 gl::Context *context = gl::getNonLostContext();
3694
3695 if (context)
3696 {
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003697 gl::Query *queryObject = context->getQuery(id, false, GL_NONE);
3698
3699 if (!queryObject)
3700 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003701 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003702 }
3703
3704 if (context->getActiveQuery(queryObject->getType()) == id)
3705 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003706 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003707 }
3708
3709 switch(pname)
3710 {
3711 case GL_QUERY_RESULT_EXT:
3712 params[0] = queryObject->getResult();
3713 break;
3714 case GL_QUERY_RESULT_AVAILABLE_EXT:
3715 params[0] = queryObject->isResultAvailable();
3716 break;
3717 default:
3718 ASSERT(false);
3719 }
3720 }
3721 }
3722 catch(std::bad_alloc&)
3723 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003724 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003725 }
3726}
3727
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003728void __stdcall glGetRenderbufferParameteriv(GLenum target, GLenum pname, GLint* params)
3729{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003730 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 +00003731
3732 try
3733 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003734 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003735
3736 if (context)
3737 {
3738 if (target != GL_RENDERBUFFER)
3739 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003740 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003741 }
3742
daniel@transgaming.com428d1582010-05-04 03:35:25 +00003743 if (context->getRenderbufferHandle() == 0)
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003744 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003745 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003746 }
3747
daniel@transgaming.com428d1582010-05-04 03:35:25 +00003748 gl::Renderbuffer *renderbuffer = context->getRenderbuffer(context->getRenderbufferHandle());
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003749
3750 switch (pname)
3751 {
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +00003752 case GL_RENDERBUFFER_WIDTH: *params = renderbuffer->getWidth(); break;
3753 case GL_RENDERBUFFER_HEIGHT: *params = renderbuffer->getHeight(); break;
3754 case GL_RENDERBUFFER_INTERNAL_FORMAT: *params = renderbuffer->getInternalFormat(); break;
3755 case GL_RENDERBUFFER_RED_SIZE: *params = renderbuffer->getRedSize(); break;
3756 case GL_RENDERBUFFER_GREEN_SIZE: *params = renderbuffer->getGreenSize(); break;
3757 case GL_RENDERBUFFER_BLUE_SIZE: *params = renderbuffer->getBlueSize(); break;
3758 case GL_RENDERBUFFER_ALPHA_SIZE: *params = renderbuffer->getAlphaSize(); break;
3759 case GL_RENDERBUFFER_DEPTH_SIZE: *params = renderbuffer->getDepthSize(); break;
3760 case GL_RENDERBUFFER_STENCIL_SIZE: *params = renderbuffer->getStencilSize(); break;
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00003761 case GL_RENDERBUFFER_SAMPLES_ANGLE:
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +00003762 if (context->getMaxSupportedSamples() != 0)
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00003763 {
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +00003764 *params = renderbuffer->getSamples();
3765 }
3766 else
3767 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003768 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00003769 }
3770 break;
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003771 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003772 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003773 }
3774 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003775 }
3776 catch(std::bad_alloc&)
3777 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003778 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003779 }
3780}
3781
3782void __stdcall glGetShaderiv(GLuint shader, GLenum pname, GLint* params)
3783{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003784 EVENT("(GLuint shader = %d, GLenum pname = %d, GLint* params = 0x%0.8p)", shader, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003785
3786 try
3787 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003788 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003789
3790 if (context)
3791 {
3792 gl::Shader *shaderObject = context->getShader(shader);
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00003793
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003794 if (!shaderObject)
3795 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003796 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003797 }
3798
3799 switch (pname)
3800 {
3801 case GL_SHADER_TYPE:
3802 *params = shaderObject->getType();
3803 return;
3804 case GL_DELETE_STATUS:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003805 *params = shaderObject->isFlaggedForDeletion();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003806 return;
3807 case GL_COMPILE_STATUS:
3808 *params = shaderObject->isCompiled() ? GL_TRUE : GL_FALSE;
3809 return;
3810 case GL_INFO_LOG_LENGTH:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003811 *params = shaderObject->getInfoLogLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003812 return;
3813 case GL_SHADER_SOURCE_LENGTH:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003814 *params = shaderObject->getSourceLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003815 return;
zmo@google.coma574f782011-10-03 21:45:23 +00003816 case GL_TRANSLATED_SHADER_SOURCE_LENGTH_ANGLE:
3817 *params = shaderObject->getTranslatedSourceLength();
3818 return;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003819 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003820 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003821 }
3822 }
3823 }
3824 catch(std::bad_alloc&)
3825 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003826 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003827 }
3828}
3829
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00003830void __stdcall glGetShaderInfoLog(GLuint shader, GLsizei bufsize, GLsizei* length, GLchar* infolog)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003831{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003832 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 +00003833 shader, bufsize, length, infolog);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003834
3835 try
3836 {
3837 if (bufsize < 0)
3838 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003839 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003840 }
3841
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003842 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003843
3844 if (context)
3845 {
3846 gl::Shader *shaderObject = context->getShader(shader);
3847
3848 if (!shaderObject)
3849 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003850 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003851 }
3852
3853 shaderObject->getInfoLog(bufsize, length, infolog);
3854 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003855 }
3856 catch(std::bad_alloc&)
3857 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003858 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003859 }
3860}
3861
3862void __stdcall glGetShaderPrecisionFormat(GLenum shadertype, GLenum precisiontype, GLint* range, GLint* precision)
3863{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003864 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 +00003865 shadertype, precisiontype, range, precision);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003866
3867 try
3868 {
daniel@transgaming.com6c785212010-03-30 03:36:17 +00003869 switch (shadertype)
3870 {
3871 case GL_VERTEX_SHADER:
3872 case GL_FRAGMENT_SHADER:
3873 break;
3874 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003875 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com6c785212010-03-30 03:36:17 +00003876 }
3877
3878 switch (precisiontype)
3879 {
3880 case GL_LOW_FLOAT:
3881 case GL_MEDIUM_FLOAT:
3882 case GL_HIGH_FLOAT:
3883 // Assume IEEE 754 precision
3884 range[0] = 127;
3885 range[1] = 127;
daniel@transgaming.comc5c15382010-04-23 18:34:49 +00003886 *precision = 23;
daniel@transgaming.com6c785212010-03-30 03:36:17 +00003887 break;
3888 case GL_LOW_INT:
3889 case GL_MEDIUM_INT:
3890 case GL_HIGH_INT:
3891 // Some (most) hardware only supports single-precision floating-point numbers,
3892 // which can accurately represent integers up to +/-16777216
3893 range[0] = 24;
3894 range[1] = 24;
daniel@transgaming.comc5c15382010-04-23 18:34:49 +00003895 *precision = 0;
daniel@transgaming.com6c785212010-03-30 03:36:17 +00003896 break;
3897 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003898 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com6c785212010-03-30 03:36:17 +00003899 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003900 }
3901 catch(std::bad_alloc&)
3902 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003903 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003904 }
3905}
3906
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00003907void __stdcall glGetShaderSource(GLuint shader, GLsizei bufsize, GLsizei* length, GLchar* source)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003908{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003909 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 +00003910 shader, bufsize, length, source);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003911
3912 try
3913 {
3914 if (bufsize < 0)
3915 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003916 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003917 }
3918
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003919 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003920
3921 if (context)
3922 {
3923 gl::Shader *shaderObject = context->getShader(shader);
3924
3925 if (!shaderObject)
3926 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003927 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003928 }
3929
3930 shaderObject->getSource(bufsize, length, source);
3931 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003932 }
3933 catch(std::bad_alloc&)
3934 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003935 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003936 }
3937}
3938
zmo@google.coma574f782011-10-03 21:45:23 +00003939void __stdcall glGetTranslatedShaderSourceANGLE(GLuint shader, GLsizei bufsize, GLsizei* length, GLchar* source)
3940{
3941 EVENT("(GLuint shader = %d, GLsizei bufsize = %d, GLsizei* length = 0x%0.8p, GLchar* source = 0x%0.8p)",
3942 shader, bufsize, length, source);
3943
3944 try
3945 {
3946 if (bufsize < 0)
3947 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003948 return gl::error(GL_INVALID_VALUE);
zmo@google.coma574f782011-10-03 21:45:23 +00003949 }
3950
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003951 gl::Context *context = gl::getNonLostContext();
zmo@google.coma574f782011-10-03 21:45:23 +00003952
3953 if (context)
3954 {
3955 gl::Shader *shaderObject = context->getShader(shader);
3956
3957 if (!shaderObject)
3958 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003959 return gl::error(GL_INVALID_OPERATION);
zmo@google.coma574f782011-10-03 21:45:23 +00003960 }
3961
3962 shaderObject->getTranslatedSource(bufsize, length, source);
3963 }
3964 }
3965 catch(std::bad_alloc&)
3966 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003967 return gl::error(GL_OUT_OF_MEMORY);
zmo@google.coma574f782011-10-03 21:45:23 +00003968 }
3969}
3970
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003971const GLubyte* __stdcall glGetString(GLenum name)
3972{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003973 EVENT("(GLenum name = 0x%X)", name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003974
3975 try
3976 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003977 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com3e4c6002010-05-05 18:50:13 +00003978
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003979 switch (name)
3980 {
3981 case GL_VENDOR:
daniel@transgaming.coma0ce7e62011-01-25 14:47:16 +00003982 return (GLubyte*)"Google Inc.";
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003983 case GL_RENDERER:
daniel@transgaming.comc23ff642011-08-16 20:28:45 +00003984 return (GLubyte*)((context != NULL) ? context->getRendererString() : "ANGLE");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003985 case GL_VERSION:
daniel@transgaming.com1825d8e2012-08-27 16:25:29 +00003986 return (GLubyte*)"OpenGL ES 2.0 (ANGLE " VERSION_STRING ")";
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003987 case GL_SHADING_LANGUAGE_VERSION:
daniel@transgaming.com1825d8e2012-08-27 16:25:29 +00003988 return (GLubyte*)"OpenGL ES GLSL ES 1.00 (ANGLE " VERSION_STRING ")";
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003989 case GL_EXTENSIONS:
daniel@transgaming.com3e4c6002010-05-05 18:50:13 +00003990 return (GLubyte*)((context != NULL) ? context->getExtensionString() : "");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003991 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003992 return gl::error(GL_INVALID_ENUM, (GLubyte*)NULL);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003993 }
3994 }
3995 catch(std::bad_alloc&)
3996 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003997 return gl::error(GL_OUT_OF_MEMORY, (GLubyte*)NULL);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003998 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003999}
4000
4001void __stdcall glGetTexParameterfv(GLenum target, GLenum pname, GLfloat* params)
4002{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004003 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 +00004004
4005 try
4006 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004007 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00004008
4009 if (context)
4010 {
4011 gl::Texture *texture;
4012
4013 switch (target)
4014 {
4015 case GL_TEXTURE_2D:
4016 texture = context->getTexture2D();
4017 break;
4018 case GL_TEXTURE_CUBE_MAP:
4019 texture = context->getTextureCubeMap();
4020 break;
shannon.woods%transgaming.com@gtempaccount.comc416e1c2013-04-13 03:45:05 +00004021 case GL_TEXTURE_3D:
4022 if (context->getClientVersion() < 3)
4023 {
4024 return gl::error(GL_INVALID_ENUM);
4025 }
4026 texture = context->getTexture3D();
4027 break;
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00004028 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004029 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00004030 }
4031
4032 switch (pname)
4033 {
4034 case GL_TEXTURE_MAG_FILTER:
4035 *params = (GLfloat)texture->getMagFilter();
4036 break;
4037 case GL_TEXTURE_MIN_FILTER:
4038 *params = (GLfloat)texture->getMinFilter();
4039 break;
4040 case GL_TEXTURE_WRAP_S:
4041 *params = (GLfloat)texture->getWrapS();
4042 break;
4043 case GL_TEXTURE_WRAP_T:
4044 *params = (GLfloat)texture->getWrapT();
4045 break;
shannon.woods%transgaming.com@gtempaccount.com0b3a8df2013-04-13 03:44:51 +00004046 case GL_TEXTURE_WRAP_R:
4047 if (context->getClientVersion() < 3)
4048 {
4049 return gl::error(GL_INVALID_ENUM);
4050 }
4051 *params = (GLfloat)texture->getWrapR();
4052 break;
daniel@transgaming.comd30bd0a2011-11-11 04:10:34 +00004053 case GL_TEXTURE_IMMUTABLE_FORMAT_EXT:
4054 *params = (GLfloat)(texture->isImmutable() ? GL_TRUE : GL_FALSE);
4055 break;
daniel@transgaming.com7d18c172011-11-11 04:18:21 +00004056 case GL_TEXTURE_USAGE_ANGLE:
4057 *params = (GLfloat)texture->getUsage();
4058 break;
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00004059 case GL_TEXTURE_MAX_ANISOTROPY_EXT:
4060 if (!context->supportsTextureFilterAnisotropy())
4061 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004062 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00004063 }
4064 *params = (GLfloat)texture->getMaxAnisotropy();
4065 break;
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00004066 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004067 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00004068 }
4069 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004070 }
4071 catch(std::bad_alloc&)
4072 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004073 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004074 }
4075}
4076
4077void __stdcall glGetTexParameteriv(GLenum target, GLenum pname, GLint* params)
4078{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004079 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 +00004080
4081 try
4082 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004083 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00004084
4085 if (context)
4086 {
4087 gl::Texture *texture;
4088
4089 switch (target)
4090 {
4091 case GL_TEXTURE_2D:
4092 texture = context->getTexture2D();
4093 break;
4094 case GL_TEXTURE_CUBE_MAP:
4095 texture = context->getTextureCubeMap();
4096 break;
shannon.woods%transgaming.com@gtempaccount.comc416e1c2013-04-13 03:45:05 +00004097 case GL_TEXTURE_3D:
4098 if (context->getClientVersion() < 3)
4099 {
4100 return gl::error(GL_INVALID_ENUM);
4101 }
4102 texture = context->getTexture3D();
4103 break;
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00004104 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004105 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00004106 }
4107
4108 switch (pname)
4109 {
4110 case GL_TEXTURE_MAG_FILTER:
4111 *params = texture->getMagFilter();
4112 break;
4113 case GL_TEXTURE_MIN_FILTER:
4114 *params = texture->getMinFilter();
4115 break;
4116 case GL_TEXTURE_WRAP_S:
4117 *params = texture->getWrapS();
4118 break;
4119 case GL_TEXTURE_WRAP_T:
4120 *params = texture->getWrapT();
4121 break;
shannon.woods%transgaming.com@gtempaccount.com0b3a8df2013-04-13 03:44:51 +00004122 case GL_TEXTURE_WRAP_R:
4123 if (context->getClientVersion() < 3)
4124 {
4125 return gl::error(GL_INVALID_ENUM);
4126 }
4127 *params = texture->getWrapR();
4128 break;
daniel@transgaming.comd30bd0a2011-11-11 04:10:34 +00004129 case GL_TEXTURE_IMMUTABLE_FORMAT_EXT:
4130 *params = texture->isImmutable() ? GL_TRUE : GL_FALSE;
4131 break;
daniel@transgaming.com7d18c172011-11-11 04:18:21 +00004132 case GL_TEXTURE_USAGE_ANGLE:
4133 *params = texture->getUsage();
4134 break;
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00004135 case GL_TEXTURE_MAX_ANISOTROPY_EXT:
4136 if (!context->supportsTextureFilterAnisotropy())
4137 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004138 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00004139 }
4140 *params = (GLint)texture->getMaxAnisotropy();
4141 break;
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00004142 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004143 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00004144 }
4145 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004146 }
4147 catch(std::bad_alloc&)
4148 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004149 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004150 }
4151}
4152
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004153void __stdcall glGetnUniformfvEXT(GLuint program, GLint location, GLsizei bufSize, GLfloat* params)
4154{
4155 EVENT("(GLuint program = %d, GLint location = %d, GLsizei bufSize = %d, GLfloat* params = 0x%0.8p)",
4156 program, location, bufSize, params);
4157
4158 try
4159 {
4160 if (bufSize < 0)
4161 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004162 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004163 }
4164
4165 gl::Context *context = gl::getNonLostContext();
4166
4167 if (context)
4168 {
4169 if (program == 0)
4170 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004171 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004172 }
4173
4174 gl::Program *programObject = context->getProgram(program);
4175
daniel@transgaming.com716056c2012-07-24 18:38:59 +00004176 if (!programObject || !programObject->isLinked())
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004177 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004178 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004179 }
4180
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00004181 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
4182 if (!programBinary)
4183 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004184 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00004185 }
4186
4187 if (!programBinary->getUniformfv(location, &bufSize, params))
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004188 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004189 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004190 }
4191 }
4192 }
4193 catch(std::bad_alloc&)
4194 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004195 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004196 }
4197}
4198
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004199void __stdcall glGetUniformfv(GLuint program, GLint location, GLfloat* params)
4200{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004201 EVENT("(GLuint program = %d, GLint location = %d, GLfloat* params = 0x%0.8p)", program, location, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004202
4203 try
4204 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004205 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004206
4207 if (context)
4208 {
4209 if (program == 0)
4210 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004211 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004212 }
4213
4214 gl::Program *programObject = context->getProgram(program);
4215
daniel@transgaming.com716056c2012-07-24 18:38:59 +00004216 if (!programObject || !programObject->isLinked())
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004217 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004218 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004219 }
4220
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00004221 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
4222 if (!programBinary)
4223 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004224 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00004225 }
4226
4227 if (!programBinary->getUniformfv(location, NULL, params))
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004228 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004229 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004230 }
4231 }
4232 }
4233 catch(std::bad_alloc&)
4234 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004235 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004236 }
4237}
4238
4239void __stdcall glGetnUniformivEXT(GLuint program, GLint location, GLsizei bufSize, GLint* params)
4240{
4241 EVENT("(GLuint program = %d, GLint location = %d, GLsizei bufSize = %d, GLint* params = 0x%0.8p)",
4242 program, location, bufSize, params);
4243
4244 try
4245 {
4246 if (bufSize < 0)
4247 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004248 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004249 }
4250
4251 gl::Context *context = gl::getNonLostContext();
4252
4253 if (context)
4254 {
4255 if (program == 0)
4256 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004257 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004258 }
4259
4260 gl::Program *programObject = context->getProgram(program);
4261
daniel@transgaming.com716056c2012-07-24 18:38:59 +00004262 if (!programObject || !programObject->isLinked())
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004263 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004264 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004265 }
4266
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00004267 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
4268 if (!programBinary)
4269 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004270 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00004271 }
4272
4273 if (!programBinary->getUniformiv(location, &bufSize, params))
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004274 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004275 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004276 }
4277 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004278 }
4279 catch(std::bad_alloc&)
4280 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004281 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004282 }
4283}
4284
4285void __stdcall glGetUniformiv(GLuint program, GLint location, GLint* params)
4286{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004287 EVENT("(GLuint program = %d, GLint location = %d, GLint* params = 0x%0.8p)", program, location, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004288
4289 try
4290 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004291 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004292
4293 if (context)
4294 {
4295 if (program == 0)
4296 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004297 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004298 }
4299
4300 gl::Program *programObject = context->getProgram(program);
4301
daniel@transgaming.com716056c2012-07-24 18:38:59 +00004302 if (!programObject || !programObject->isLinked())
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004303 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004304 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004305 }
4306
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00004307 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
4308 if (!programBinary)
4309 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004310 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00004311 }
4312
4313 if (!programBinary->getUniformiv(location, NULL, params))
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004314 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004315 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004316 }
4317 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004318 }
4319 catch(std::bad_alloc&)
4320 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004321 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004322 }
4323}
4324
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00004325int __stdcall glGetUniformLocation(GLuint program, const GLchar* name)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004326{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004327 EVENT("(GLuint program = %d, const GLchar* name = 0x%0.8p)", program, name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004328
4329 try
4330 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004331 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004332
4333 if (strstr(name, "gl_") == name)
4334 {
4335 return -1;
4336 }
4337
4338 if (context)
4339 {
4340 gl::Program *programObject = context->getProgram(program);
4341
4342 if (!programObject)
4343 {
daniel@transgaming.comd1abe5b2010-04-13 19:53:33 +00004344 if (context->getShader(program))
4345 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004346 return gl::error(GL_INVALID_OPERATION, -1);
daniel@transgaming.comd1abe5b2010-04-13 19:53:33 +00004347 }
4348 else
4349 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004350 return gl::error(GL_INVALID_VALUE, -1);
daniel@transgaming.comd1abe5b2010-04-13 19:53:33 +00004351 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004352 }
4353
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00004354 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
daniel@transgaming.com716056c2012-07-24 18:38:59 +00004355 if (!programObject->isLinked() || !programBinary)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004356 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004357 return gl::error(GL_INVALID_OPERATION, -1);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004358 }
4359
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00004360 return programBinary->getUniformLocation(name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004361 }
4362 }
4363 catch(std::bad_alloc&)
4364 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004365 return gl::error(GL_OUT_OF_MEMORY, -1);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004366 }
4367
4368 return -1;
4369}
4370
4371void __stdcall glGetVertexAttribfv(GLuint index, GLenum pname, GLfloat* params)
4372{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004373 EVENT("(GLuint index = %d, GLenum pname = 0x%X, GLfloat* params = 0x%0.8p)", index, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004374
4375 try
4376 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004377 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004378
daniel@transgaming.come0078962010-04-15 20:45:08 +00004379 if (context)
4380 {
4381 if (index >= gl::MAX_VERTEX_ATTRIBS)
4382 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004383 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004384 }
4385
daniel@transgaming.com83921382011-01-08 05:46:00 +00004386 const gl::VertexAttribute &attribState = context->getVertexAttribState(index);
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004387
daniel@transgaming.come0078962010-04-15 20:45:08 +00004388 switch (pname)
4389 {
4390 case GL_VERTEX_ATTRIB_ARRAY_ENABLED:
daniel@transgaming.com83921382011-01-08 05:46:00 +00004391 *params = (GLfloat)(attribState.mArrayEnabled ? GL_TRUE : GL_FALSE);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004392 break;
4393 case GL_VERTEX_ATTRIB_ARRAY_SIZE:
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004394 *params = (GLfloat)attribState.mSize;
daniel@transgaming.come0078962010-04-15 20:45:08 +00004395 break;
4396 case GL_VERTEX_ATTRIB_ARRAY_STRIDE:
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004397 *params = (GLfloat)attribState.mStride;
daniel@transgaming.come0078962010-04-15 20:45:08 +00004398 break;
4399 case GL_VERTEX_ATTRIB_ARRAY_TYPE:
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004400 *params = (GLfloat)attribState.mType;
daniel@transgaming.come0078962010-04-15 20:45:08 +00004401 break;
4402 case GL_VERTEX_ATTRIB_ARRAY_NORMALIZED:
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004403 *params = (GLfloat)(attribState.mNormalized ? GL_TRUE : GL_FALSE);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004404 break;
4405 case GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING:
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +00004406 *params = (GLfloat)attribState.mBoundBuffer.id();
daniel@transgaming.come0078962010-04-15 20:45:08 +00004407 break;
4408 case GL_CURRENT_VERTEX_ATTRIB:
4409 for (int i = 0; i < 4; ++i)
4410 {
shannon.woods%transgaming.com@gtempaccount.com3026dc72013-04-13 03:37:27 +00004411 params[i] = attribState.mCurrentValue.FloatValues[i];
daniel@transgaming.come0078962010-04-15 20:45:08 +00004412 }
4413 break;
shannon.woods%transgaming.com@gtempaccount.com14eb55e2013-04-13 03:35:06 +00004414 case GL_VERTEX_ATTRIB_ARRAY_DIVISOR:
4415 // Don't verify ES3 context because GL_VERTEX_ATTRIB_ARRAY_DIVISOR_ANGLE uses
4416 // the same constant.
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00004417 *params = (GLfloat)attribState.mDivisor;
4418 break;
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004419 default: return gl::error(GL_INVALID_ENUM);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004420 }
4421 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004422 }
4423 catch(std::bad_alloc&)
4424 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004425 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004426 }
4427}
4428
4429void __stdcall glGetVertexAttribiv(GLuint index, GLenum pname, GLint* params)
4430{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004431 EVENT("(GLuint index = %d, GLenum pname = 0x%X, GLint* params = 0x%0.8p)", index, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004432
4433 try
4434 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004435 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004436
daniel@transgaming.come0078962010-04-15 20:45:08 +00004437 if (context)
4438 {
4439 if (index >= gl::MAX_VERTEX_ATTRIBS)
4440 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004441 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004442 }
4443
daniel@transgaming.com83921382011-01-08 05:46:00 +00004444 const gl::VertexAttribute &attribState = context->getVertexAttribState(index);
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004445
daniel@transgaming.come0078962010-04-15 20:45:08 +00004446 switch (pname)
4447 {
4448 case GL_VERTEX_ATTRIB_ARRAY_ENABLED:
daniel@transgaming.com83921382011-01-08 05:46:00 +00004449 *params = (attribState.mArrayEnabled ? GL_TRUE : GL_FALSE);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004450 break;
4451 case GL_VERTEX_ATTRIB_ARRAY_SIZE:
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004452 *params = attribState.mSize;
daniel@transgaming.come0078962010-04-15 20:45:08 +00004453 break;
4454 case GL_VERTEX_ATTRIB_ARRAY_STRIDE:
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004455 *params = attribState.mStride;
daniel@transgaming.come0078962010-04-15 20:45:08 +00004456 break;
4457 case GL_VERTEX_ATTRIB_ARRAY_TYPE:
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004458 *params = attribState.mType;
daniel@transgaming.come0078962010-04-15 20:45:08 +00004459 break;
4460 case GL_VERTEX_ATTRIB_ARRAY_NORMALIZED:
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004461 *params = (attribState.mNormalized ? GL_TRUE : GL_FALSE);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004462 break;
4463 case GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING:
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +00004464 *params = attribState.mBoundBuffer.id();
daniel@transgaming.come0078962010-04-15 20:45:08 +00004465 break;
4466 case GL_CURRENT_VERTEX_ATTRIB:
4467 for (int i = 0; i < 4; ++i)
4468 {
shannon.woods%transgaming.com@gtempaccount.com3026dc72013-04-13 03:37:27 +00004469 float currentValue = attribState.mCurrentValue.FloatValues[i];
daniel@transgaming.come0078962010-04-15 20:45:08 +00004470 params[i] = (GLint)(currentValue > 0.0f ? floor(currentValue + 0.5f) : ceil(currentValue - 0.5f));
4471 }
4472 break;
shannon.woods%transgaming.com@gtempaccount.com14eb55e2013-04-13 03:35:06 +00004473 case GL_VERTEX_ATTRIB_ARRAY_DIVISOR:
4474 // Don't verify ES3 context because GL_VERTEX_ATTRIB_ARRAY_DIVISOR_ANGLE uses
4475 // the same constant.
4476 META_ASSERT(GL_VERTEX_ATTRIB_ARRAY_DIVISOR == GL_VERTEX_ATTRIB_ARRAY_DIVISOR_ANGLE);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00004477 *params = (GLint)attribState.mDivisor;
4478 break;
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004479 default: return gl::error(GL_INVALID_ENUM);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004480 }
4481 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004482 }
4483 catch(std::bad_alloc&)
4484 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004485 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004486 }
4487}
4488
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00004489void __stdcall glGetVertexAttribPointerv(GLuint index, GLenum pname, GLvoid** pointer)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004490{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004491 EVENT("(GLuint index = %d, GLenum pname = 0x%X, GLvoid** pointer = 0x%0.8p)", index, pname, pointer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004492
4493 try
4494 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004495 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004496
daniel@transgaming.come0078962010-04-15 20:45:08 +00004497 if (context)
4498 {
4499 if (index >= gl::MAX_VERTEX_ATTRIBS)
4500 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004501 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004502 }
4503
4504 if (pname != GL_VERTEX_ATTRIB_ARRAY_POINTER)
4505 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004506 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004507 }
4508
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004509 *pointer = const_cast<GLvoid*>(context->getVertexAttribPointer(index));
daniel@transgaming.come0078962010-04-15 20:45:08 +00004510 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004511 }
4512 catch(std::bad_alloc&)
4513 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004514 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004515 }
4516}
4517
4518void __stdcall glHint(GLenum target, GLenum mode)
4519{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004520 EVENT("(GLenum target = 0x%X, GLenum mode = 0x%X)", target, mode);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004521
4522 try
4523 {
alokp@chromium.orgd303ef92010-09-09 17:30:15 +00004524 switch (mode)
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00004525 {
alokp@chromium.orgd303ef92010-09-09 17:30:15 +00004526 case GL_FASTEST:
4527 case GL_NICEST:
4528 case GL_DONT_CARE:
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00004529 break;
4530 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004531 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00004532 }
4533
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004534 gl::Context *context = gl::getNonLostContext();
alokp@chromium.orgd303ef92010-09-09 17:30:15 +00004535 switch (target)
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00004536 {
alokp@chromium.orgd303ef92010-09-09 17:30:15 +00004537 case GL_GENERATE_MIPMAP_HINT:
4538 if (context) context->setGenerateMipmapHint(mode);
4539 break;
4540 case GL_FRAGMENT_SHADER_DERIVATIVE_HINT_OES:
4541 if (context) context->setFragmentShaderDerivativeHint(mode);
4542 break;
4543 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004544 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00004545 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004546 }
4547 catch(std::bad_alloc&)
4548 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004549 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004550 }
4551}
4552
4553GLboolean __stdcall glIsBuffer(GLuint buffer)
4554{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004555 EVENT("(GLuint buffer = %d)", buffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004556
4557 try
4558 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004559 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004560
4561 if (context && buffer)
4562 {
4563 gl::Buffer *bufferObject = context->getBuffer(buffer);
4564
4565 if (bufferObject)
4566 {
4567 return GL_TRUE;
4568 }
4569 }
4570 }
4571 catch(std::bad_alloc&)
4572 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004573 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004574 }
4575
4576 return GL_FALSE;
4577}
4578
4579GLboolean __stdcall glIsEnabled(GLenum cap)
4580{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004581 EVENT("(GLenum cap = 0x%X)", cap);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004582
4583 try
4584 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004585 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004586
4587 if (context)
4588 {
4589 switch (cap)
4590 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004591 case GL_CULL_FACE: return context->isCullFaceEnabled();
4592 case GL_POLYGON_OFFSET_FILL: return context->isPolygonOffsetFillEnabled();
4593 case GL_SAMPLE_ALPHA_TO_COVERAGE: return context->isSampleAlphaToCoverageEnabled();
4594 case GL_SAMPLE_COVERAGE: return context->isSampleCoverageEnabled();
4595 case GL_SCISSOR_TEST: return context->isScissorTestEnabled();
4596 case GL_STENCIL_TEST: return context->isStencilTestEnabled();
4597 case GL_DEPTH_TEST: return context->isDepthTestEnabled();
4598 case GL_BLEND: return context->isBlendEnabled();
4599 case GL_DITHER: return context->isDitherEnabled();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004600 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004601 return gl::error(GL_INVALID_ENUM, false);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004602 }
4603 }
4604 }
4605 catch(std::bad_alloc&)
4606 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004607 return gl::error(GL_OUT_OF_MEMORY, false);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004608 }
4609
4610 return false;
4611}
4612
daniel@transgaming.comfe208882010-09-01 15:47:57 +00004613GLboolean __stdcall glIsFenceNV(GLuint fence)
4614{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004615 EVENT("(GLuint fence = %d)", fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004616
4617 try
4618 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004619 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004620
4621 if (context)
4622 {
4623 gl::Fence *fenceObject = context->getFence(fence);
4624
4625 if (fenceObject == NULL)
4626 {
4627 return GL_FALSE;
4628 }
4629
4630 return fenceObject->isFence();
4631 }
4632 }
4633 catch(std::bad_alloc&)
4634 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004635 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004636 }
4637
4638 return GL_FALSE;
daniel@transgaming.comfe208882010-09-01 15:47:57 +00004639}
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004640
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004641GLboolean __stdcall glIsFramebuffer(GLuint framebuffer)
4642{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004643 EVENT("(GLuint framebuffer = %d)", framebuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004644
4645 try
4646 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004647 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004648
4649 if (context && framebuffer)
4650 {
4651 gl::Framebuffer *framebufferObject = context->getFramebuffer(framebuffer);
4652
4653 if (framebufferObject)
4654 {
4655 return GL_TRUE;
4656 }
4657 }
4658 }
4659 catch(std::bad_alloc&)
4660 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004661 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004662 }
4663
4664 return GL_FALSE;
4665}
4666
4667GLboolean __stdcall glIsProgram(GLuint program)
4668{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004669 EVENT("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004670
4671 try
4672 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004673 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004674
4675 if (context && program)
4676 {
4677 gl::Program *programObject = context->getProgram(program);
4678
4679 if (programObject)
4680 {
4681 return GL_TRUE;
4682 }
4683 }
4684 }
4685 catch(std::bad_alloc&)
4686 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004687 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004688 }
4689
4690 return GL_FALSE;
4691}
4692
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00004693GLboolean __stdcall glIsQueryEXT(GLuint id)
4694{
4695 EVENT("(GLuint id = %d)", id);
4696
4697 try
4698 {
4699 if (id == 0)
4700 {
4701 return GL_FALSE;
4702 }
4703
4704 gl::Context *context = gl::getNonLostContext();
4705
4706 if (context)
4707 {
4708 gl::Query *queryObject = context->getQuery(id, false, GL_NONE);
4709
4710 if (queryObject)
4711 {
4712 return GL_TRUE;
4713 }
4714 }
4715 }
4716 catch(std::bad_alloc&)
4717 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004718 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00004719 }
4720
4721 return GL_FALSE;
4722}
4723
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004724GLboolean __stdcall glIsRenderbuffer(GLuint renderbuffer)
4725{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004726 EVENT("(GLuint renderbuffer = %d)", renderbuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004727
4728 try
4729 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004730 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004731
4732 if (context && renderbuffer)
4733 {
4734 gl::Renderbuffer *renderbufferObject = context->getRenderbuffer(renderbuffer);
4735
4736 if (renderbufferObject)
4737 {
4738 return GL_TRUE;
4739 }
4740 }
4741 }
4742 catch(std::bad_alloc&)
4743 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004744 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004745 }
4746
4747 return GL_FALSE;
4748}
4749
4750GLboolean __stdcall glIsShader(GLuint shader)
4751{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004752 EVENT("(GLuint shader = %d)", shader);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004753
4754 try
4755 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004756 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004757
4758 if (context && shader)
4759 {
4760 gl::Shader *shaderObject = context->getShader(shader);
4761
4762 if (shaderObject)
4763 {
4764 return GL_TRUE;
4765 }
4766 }
4767 }
4768 catch(std::bad_alloc&)
4769 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004770 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004771 }
4772
4773 return GL_FALSE;
4774}
4775
4776GLboolean __stdcall glIsTexture(GLuint texture)
4777{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004778 EVENT("(GLuint texture = %d)", texture);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004779
4780 try
4781 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004782 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004783
4784 if (context && texture)
4785 {
4786 gl::Texture *textureObject = context->getTexture(texture);
4787
4788 if (textureObject)
4789 {
4790 return GL_TRUE;
4791 }
4792 }
4793 }
4794 catch(std::bad_alloc&)
4795 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004796 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004797 }
4798
4799 return GL_FALSE;
4800}
4801
4802void __stdcall glLineWidth(GLfloat width)
4803{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004804 EVENT("(GLfloat width = %f)", width);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004805
4806 try
4807 {
4808 if (width <= 0.0f)
4809 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004810 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004811 }
4812
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004813 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com32e58cd2010-03-24 09:44:10 +00004814
4815 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004816 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004817 context->setLineWidth(width);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004818 }
4819 }
4820 catch(std::bad_alloc&)
4821 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004822 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004823 }
4824}
4825
4826void __stdcall glLinkProgram(GLuint program)
4827{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004828 EVENT("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004829
4830 try
4831 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004832 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004833
4834 if (context)
4835 {
4836 gl::Program *programObject = context->getProgram(program);
4837
4838 if (!programObject)
4839 {
daniel@transgaming.com277b7142010-04-13 03:26:44 +00004840 if (context->getShader(program))
4841 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004842 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com277b7142010-04-13 03:26:44 +00004843 }
4844 else
4845 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004846 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com277b7142010-04-13 03:26:44 +00004847 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004848 }
4849
daniel@transgaming.com95d29422012-07-24 18:36:10 +00004850 context->linkProgram(program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004851 }
4852 }
4853 catch(std::bad_alloc&)
4854 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004855 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004856 }
4857}
4858
4859void __stdcall glPixelStorei(GLenum pname, GLint param)
4860{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004861 EVENT("(GLenum pname = 0x%X, GLint param = %d)", pname, param);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004862
4863 try
4864 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004865 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004866
4867 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004868 {
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004869 switch (pname)
4870 {
4871 case GL_UNPACK_ALIGNMENT:
4872 if (param != 1 && param != 2 && param != 4 && param != 8)
4873 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004874 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004875 }
4876
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004877 context->setUnpackAlignment(param);
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004878 break;
4879
4880 case GL_PACK_ALIGNMENT:
4881 if (param != 1 && param != 2 && param != 4 && param != 8)
4882 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004883 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004884 }
4885
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004886 context->setPackAlignment(param);
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004887 break;
4888
bsalomon@google.com56d46ab2011-11-23 14:53:10 +00004889 case GL_PACK_REVERSE_ROW_ORDER_ANGLE:
4890 context->setPackReverseRowOrder(param != 0);
4891 break;
4892
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004893 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004894 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004895 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004896 }
4897 }
4898 catch(std::bad_alloc&)
4899 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004900 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004901 }
4902}
4903
4904void __stdcall glPolygonOffset(GLfloat factor, GLfloat units)
4905{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004906 EVENT("(GLfloat factor = %f, GLfloat units = %f)", factor, units);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004907
4908 try
4909 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004910 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comaede6302010-04-29 03:35:48 +00004911
4912 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004913 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004914 context->setPolygonOffsetParams(factor, units);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004915 }
4916 }
4917 catch(std::bad_alloc&)
4918 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004919 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004920 }
4921}
4922
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00004923void __stdcall glReadnPixelsEXT(GLint x, GLint y, GLsizei width, GLsizei height,
4924 GLenum format, GLenum type, GLsizei bufSize,
4925 GLvoid *data)
4926{
4927 EVENT("(GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d, "
4928 "GLenum format = 0x%X, GLenum type = 0x%X, GLsizei bufSize = 0x%d, GLvoid *data = 0x%0.8p)",
4929 x, y, width, height, format, type, bufSize, data);
4930
4931 try
4932 {
4933 if (width < 0 || height < 0 || bufSize < 0)
4934 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004935 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00004936 }
4937
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00004938 gl::Context *context = gl::getNonLostContext();
4939
4940 if (context)
4941 {
daniel@transgaming.com42944b02012-09-27 17:45:57 +00004942 GLenum currentFormat, currentType;
4943
4944 // Failure in getCurrentReadFormatType indicates that no color attachment is currently bound,
4945 // and attempting to read back if that's the case is an error. The error will be registered
4946 // by getCurrentReadFormat.
4947 if (!context->getCurrentReadFormatType(&currentFormat, &currentType))
4948 return;
4949
4950 if (!(currentFormat == format && currentType == type) && !validReadFormatType(format, type))
4951 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004952 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com42944b02012-09-27 17:45:57 +00004953 }
4954
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00004955 context->readPixels(x, y, width, height, format, type, &bufSize, data);
4956 }
4957 }
4958 catch(std::bad_alloc&)
4959 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004960 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00004961 }
4962}
4963
4964void __stdcall glReadPixels(GLint x, GLint y, GLsizei width, GLsizei height,
4965 GLenum format, GLenum type, GLvoid* pixels)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004966{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004967 EVENT("(GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00004968 "GLenum format = 0x%X, GLenum type = 0x%X, GLvoid* pixels = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00004969 x, y, width, height, format, type, pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004970
4971 try
4972 {
4973 if (width < 0 || height < 0)
4974 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004975 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004976 }
4977
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004978 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004979
4980 if (context)
4981 {
daniel@transgaming.com42944b02012-09-27 17:45:57 +00004982 GLenum currentFormat, currentType;
4983
4984 // Failure in getCurrentReadFormatType indicates that no color attachment is currently bound,
4985 // and attempting to read back if that's the case is an error. The error will be registered
4986 // by getCurrentReadFormat.
4987 if (!context->getCurrentReadFormatType(&currentFormat, &currentType))
4988 return;
4989
4990 if (!(currentFormat == format && currentType == type) && !validReadFormatType(format, type))
4991 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004992 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com42944b02012-09-27 17:45:57 +00004993 }
4994
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00004995 context->readPixels(x, y, width, height, format, type, NULL, pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004996 }
4997 }
4998 catch(std::bad_alloc&)
4999 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005000 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005001 }
5002}
5003
5004void __stdcall glReleaseShaderCompiler(void)
5005{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005006 EVENT("()");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005007
5008 try
5009 {
5010 gl::Shader::releaseCompiler();
5011 }
5012 catch(std::bad_alloc&)
5013 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005014 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005015 }
5016}
5017
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00005018void __stdcall glRenderbufferStorageMultisampleANGLE(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005019{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005020 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 +00005021 target, samples, internalformat, width, height);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005022
5023 try
5024 {
5025 switch (target)
5026 {
5027 case GL_RENDERBUFFER:
5028 break;
5029 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005030 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005031 }
5032
daniel@transgaming.comedc19182010-10-15 17:57:55 +00005033 if (!gl::IsColorRenderable(internalformat) && !gl::IsDepthRenderable(internalformat) && !gl::IsStencilRenderable(internalformat))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005034 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005035 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005036 }
5037
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00005038 if (width < 0 || height < 0 || samples < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005039 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005040 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005041 }
5042
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005043 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005044
5045 if (context)
5046 {
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00005047 if (width > context->getMaximumRenderbufferDimension() ||
5048 height > context->getMaximumRenderbufferDimension() ||
5049 samples > context->getMaxSupportedSamples())
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00005050 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005051 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00005052 }
5053
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +00005054 GLuint handle = context->getRenderbufferHandle();
5055 if (handle == 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005056 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005057 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005058 }
5059
5060 switch (internalformat)
5061 {
5062 case GL_DEPTH_COMPONENT16:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005063 case GL_RGBA4:
5064 case GL_RGB5_A1:
5065 case GL_RGB565:
daniel@transgaming.com63977542010-08-24 19:21:02 +00005066 case GL_RGB8_OES:
5067 case GL_RGBA8_OES:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005068 case GL_STENCIL_INDEX8:
daniel@transgaming.comcdacc8e2010-07-28 19:20:50 +00005069 case GL_DEPTH24_STENCIL8_OES:
shannon.woods%transgaming.com@gtempaccount.com8dce6512013-04-13 03:42:19 +00005070 break;
5071 case GL_SRGB8_ALPHA8:
5072 case GL_RGB10_A2:
5073 case GL_RG8:
5074 case GL_R8:
5075 if (context->getClientVersion() < 3)
5076 {
5077 return gl::error(GL_INVALID_ENUM);
5078 }
daniel@transgaming.comcdacc8e2010-07-28 19:20:50 +00005079 break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005080 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005081 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005082 }
shannon.woods%transgaming.com@gtempaccount.com8dce6512013-04-13 03:42:19 +00005083
5084 context->setRenderbufferStorage(width, height, internalformat, samples);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005085 }
5086 }
5087 catch(std::bad_alloc&)
5088 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005089 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005090 }
5091}
5092
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00005093void __stdcall glRenderbufferStorage(GLenum target, GLenum internalformat, GLsizei width, GLsizei height)
5094{
5095 glRenderbufferStorageMultisampleANGLE(target, 0, internalformat, width, height);
5096}
5097
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005098void __stdcall glSampleCoverage(GLclampf value, GLboolean invert)
5099{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005100 EVENT("(GLclampf value = %f, GLboolean invert = %u)", value, invert);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005101
5102 try
5103 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005104 gl::Context* context = gl::getNonLostContext();
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00005105
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005106 if (context)
5107 {
daniel@transgaming.coma36f98e2010-05-18 18:51:09 +00005108 context->setSampleCoverageParams(gl::clamp01(value), invert == GL_TRUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005109 }
5110 }
5111 catch(std::bad_alloc&)
5112 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005113 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005114 }
5115}
5116
daniel@transgaming.comfe208882010-09-01 15:47:57 +00005117void __stdcall glSetFenceNV(GLuint fence, GLenum condition)
5118{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005119 EVENT("(GLuint fence = %d, GLenum condition = 0x%X)", fence, condition);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005120
5121 try
5122 {
5123 if (condition != GL_ALL_COMPLETED_NV)
5124 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005125 return gl::error(GL_INVALID_ENUM);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005126 }
5127
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005128 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005129
5130 if (context)
5131 {
5132 gl::Fence *fenceObject = context->getFence(fence);
5133
5134 if (fenceObject == NULL)
5135 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005136 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005137 }
5138
5139 fenceObject->setFence(condition);
5140 }
5141 }
5142 catch(std::bad_alloc&)
5143 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005144 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005145 }
daniel@transgaming.comfe208882010-09-01 15:47:57 +00005146}
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005147
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005148void __stdcall glScissor(GLint x, GLint y, GLsizei width, GLsizei height)
5149{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005150 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 +00005151
5152 try
5153 {
5154 if (width < 0 || height < 0)
5155 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005156 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005157 }
5158
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005159 gl::Context* context = gl::getNonLostContext();
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00005160
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005161 if (context)
5162 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00005163 context->setScissorParams(x, y, width, height);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005164 }
5165 }
5166 catch(std::bad_alloc&)
5167 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005168 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005169 }
5170}
5171
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00005172void __stdcall glShaderBinary(GLsizei n, const GLuint* shaders, GLenum binaryformat, const GLvoid* binary, GLsizei length)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005173{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005174 EVENT("(GLsizei n = %d, const GLuint* shaders = 0x%0.8p, GLenum binaryformat = 0x%X, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00005175 "const GLvoid* binary = 0x%0.8p, GLsizei length = %d)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00005176 n, shaders, binaryformat, binary, length);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005177
5178 try
5179 {
daniel@transgaming.comd1f667f2010-04-29 03:38:52 +00005180 // No binary shader formats are supported.
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005181 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005182 }
5183 catch(std::bad_alloc&)
5184 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005185 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005186 }
5187}
5188
shannon.woods%transgaming.com@gtempaccount.com5f339332013-04-13 03:29:02 +00005189void __stdcall glShaderSource(GLuint shader, GLsizei count, const GLchar* const* string, const GLint* length)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005190{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005191 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 +00005192 shader, count, string, length);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005193
5194 try
5195 {
daniel@transgaming.com8e6a6be2010-04-13 03:26:41 +00005196 if (count < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005197 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005198 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005199 }
5200
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005201 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005202
5203 if (context)
5204 {
5205 gl::Shader *shaderObject = context->getShader(shader);
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00005206
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005207 if (!shaderObject)
5208 {
daniel@transgaming.com8e6a6be2010-04-13 03:26:41 +00005209 if (context->getProgram(shader))
5210 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005211 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com8e6a6be2010-04-13 03:26:41 +00005212 }
5213 else
5214 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005215 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com8e6a6be2010-04-13 03:26:41 +00005216 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005217 }
5218
5219 shaderObject->setSource(count, string, length);
5220 }
5221 }
5222 catch(std::bad_alloc&)
5223 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005224 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005225 }
5226}
5227
5228void __stdcall glStencilFunc(GLenum func, GLint ref, GLuint mask)
5229{
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00005230 glStencilFuncSeparate(GL_FRONT_AND_BACK, func, ref, mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005231}
5232
5233void __stdcall glStencilFuncSeparate(GLenum face, GLenum func, GLint ref, GLuint mask)
5234{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005235 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 +00005236
5237 try
5238 {
5239 switch (face)
5240 {
5241 case GL_FRONT:
5242 case GL_BACK:
5243 case GL_FRONT_AND_BACK:
5244 break;
5245 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005246 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005247 }
5248
5249 switch (func)
5250 {
5251 case GL_NEVER:
5252 case GL_ALWAYS:
5253 case GL_LESS:
5254 case GL_LEQUAL:
5255 case GL_EQUAL:
5256 case GL_GEQUAL:
5257 case GL_GREATER:
5258 case GL_NOTEQUAL:
5259 break;
5260 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005261 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005262 }
5263
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005264 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005265
5266 if (context)
5267 {
5268 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
5269 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00005270 context->setStencilParams(func, ref, mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005271 }
5272
5273 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
5274 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00005275 context->setStencilBackParams(func, ref, mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005276 }
5277 }
5278 }
5279 catch(std::bad_alloc&)
5280 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005281 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005282 }
5283}
5284
5285void __stdcall glStencilMask(GLuint mask)
5286{
5287 glStencilMaskSeparate(GL_FRONT_AND_BACK, mask);
5288}
5289
5290void __stdcall glStencilMaskSeparate(GLenum face, GLuint mask)
5291{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005292 EVENT("(GLenum face = 0x%X, GLuint mask = %d)", face, mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005293
5294 try
5295 {
5296 switch (face)
5297 {
5298 case GL_FRONT:
5299 case GL_BACK:
5300 case GL_FRONT_AND_BACK:
5301 break;
5302 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005303 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005304 }
5305
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005306 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005307
5308 if (context)
5309 {
5310 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
5311 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00005312 context->setStencilWritemask(mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005313 }
5314
5315 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
5316 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00005317 context->setStencilBackWritemask(mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005318 }
5319 }
5320 }
5321 catch(std::bad_alloc&)
5322 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005323 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005324 }
5325}
5326
5327void __stdcall glStencilOp(GLenum fail, GLenum zfail, GLenum zpass)
5328{
5329 glStencilOpSeparate(GL_FRONT_AND_BACK, fail, zfail, zpass);
5330}
5331
5332void __stdcall glStencilOpSeparate(GLenum face, GLenum fail, GLenum zfail, GLenum zpass)
5333{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005334 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 +00005335 face, fail, zfail, zpass);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005336
5337 try
5338 {
5339 switch (face)
5340 {
5341 case GL_FRONT:
5342 case GL_BACK:
5343 case GL_FRONT_AND_BACK:
5344 break;
5345 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005346 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005347 }
5348
5349 switch (fail)
5350 {
5351 case GL_ZERO:
5352 case GL_KEEP:
5353 case GL_REPLACE:
5354 case GL_INCR:
5355 case GL_DECR:
5356 case GL_INVERT:
5357 case GL_INCR_WRAP:
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00005358 case GL_DECR_WRAP:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005359 break;
5360 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005361 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005362 }
5363
5364 switch (zfail)
5365 {
5366 case GL_ZERO:
5367 case GL_KEEP:
5368 case GL_REPLACE:
5369 case GL_INCR:
5370 case GL_DECR:
5371 case GL_INVERT:
5372 case GL_INCR_WRAP:
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00005373 case GL_DECR_WRAP:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005374 break;
5375 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005376 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005377 }
5378
5379 switch (zpass)
5380 {
5381 case GL_ZERO:
5382 case GL_KEEP:
5383 case GL_REPLACE:
5384 case GL_INCR:
5385 case GL_DECR:
5386 case GL_INVERT:
5387 case GL_INCR_WRAP:
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00005388 case GL_DECR_WRAP:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005389 break;
5390 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005391 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005392 }
5393
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005394 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005395
5396 if (context)
5397 {
5398 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
5399 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00005400 context->setStencilOperations(fail, zfail, zpass);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005401 }
5402
5403 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
5404 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00005405 context->setStencilBackOperations(fail, zfail, zpass);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005406 }
5407 }
5408 }
5409 catch(std::bad_alloc&)
5410 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005411 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005412 }
5413}
5414
daniel@transgaming.comfe208882010-09-01 15:47:57 +00005415GLboolean __stdcall glTestFenceNV(GLuint fence)
5416{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005417 EVENT("(GLuint fence = %d)", fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005418
5419 try
5420 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005421 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005422
5423 if (context)
5424 {
5425 gl::Fence *fenceObject = context->getFence(fence);
5426
5427 if (fenceObject == NULL)
5428 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005429 return gl::error(GL_INVALID_OPERATION, GL_TRUE);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005430 }
5431
5432 return fenceObject->testFence();
5433 }
5434 }
5435 catch(std::bad_alloc&)
5436 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005437 gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005438 }
5439
5440 return GL_TRUE;
daniel@transgaming.comfe208882010-09-01 15:47:57 +00005441}
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005442
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00005443void __stdcall glTexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height,
5444 GLint border, GLenum format, GLenum type, const GLvoid* pixels)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005445{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005446 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 +00005447 "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 +00005448 target, level, internalformat, width, height, border, format, type, pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005449
5450 try
5451 {
daniel@transgaming.com4f9ef0d2011-05-30 23:51:19 +00005452 if (!validImageSize(level, width, height))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005453 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005454 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005455 }
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00005456
apatrick@chromium.orge057c5d2012-01-26 19:18:24 +00005457 if (internalformat != GLint(format))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005458 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005459 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005460 }
5461
daniel@transgaming.com6377e362012-06-05 19:49:55 +00005462 // validate <type> by itself (used as secondary key below)
5463 switch (type)
5464 {
5465 case GL_UNSIGNED_BYTE:
5466 case GL_UNSIGNED_SHORT_5_6_5:
5467 case GL_UNSIGNED_SHORT_4_4_4_4:
5468 case GL_UNSIGNED_SHORT_5_5_5_1:
5469 case GL_UNSIGNED_SHORT:
5470 case GL_UNSIGNED_INT:
5471 case GL_UNSIGNED_INT_24_8_OES:
5472 case GL_HALF_FLOAT_OES:
5473 case GL_FLOAT:
5474 break;
5475 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005476 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com6377e362012-06-05 19:49:55 +00005477 }
5478
5479 // validate <format> + <type> combinations
5480 // - invalid <format> -> sets INVALID_ENUM
5481 // - invalid <format>+<type> combination -> sets INVALID_OPERATION
daniel@transgaming.com8a0a2db2011-03-21 16:38:20 +00005482 switch (format)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005483 {
5484 case GL_ALPHA:
5485 case GL_LUMINANCE:
5486 case GL_LUMINANCE_ALPHA:
5487 switch (type)
5488 {
5489 case GL_UNSIGNED_BYTE:
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00005490 case GL_FLOAT:
5491 case GL_HALF_FLOAT_OES:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005492 break;
5493 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005494 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005495 }
5496 break;
5497 case GL_RGB:
5498 switch (type)
5499 {
5500 case GL_UNSIGNED_BYTE:
5501 case GL_UNSIGNED_SHORT_5_6_5:
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00005502 case GL_FLOAT:
5503 case GL_HALF_FLOAT_OES:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005504 break;
5505 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005506 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005507 }
5508 break;
5509 case GL_RGBA:
5510 switch (type)
5511 {
5512 case GL_UNSIGNED_BYTE:
5513 case GL_UNSIGNED_SHORT_4_4_4_4:
5514 case GL_UNSIGNED_SHORT_5_5_5_1:
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00005515 case GL_FLOAT:
5516 case GL_HALF_FLOAT_OES:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005517 break;
5518 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005519 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005520 }
5521 break;
daniel@transgaming.coma9198d92010-08-08 04:49:56 +00005522 case GL_BGRA_EXT:
5523 switch (type)
5524 {
5525 case GL_UNSIGNED_BYTE:
5526 break;
5527 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005528 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.coma9198d92010-08-08 04:49:56 +00005529 }
5530 break;
daniel@transgaming.com01868132010-08-24 19:21:17 +00005531 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT: // error cases for compressed textures are handled below
5532 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
gman@chromium.org50c526d2011-08-10 05:19:44 +00005533 case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
5534 case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
daniel@transgaming.com01868132010-08-24 19:21:17 +00005535 break;
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00005536 case GL_DEPTH_COMPONENT:
5537 switch (type)
5538 {
5539 case GL_UNSIGNED_SHORT:
5540 case GL_UNSIGNED_INT:
5541 break;
5542 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005543 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00005544 }
5545 break;
5546 case GL_DEPTH_STENCIL_OES:
5547 switch (type)
5548 {
5549 case GL_UNSIGNED_INT_24_8_OES:
5550 break;
5551 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005552 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00005553 }
5554 break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005555 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005556 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005557 }
5558
5559 if (border != 0)
5560 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005561 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005562 }
5563
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005564 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005565
5566 if (context)
5567 {
daniel@transgaming.com32b11442011-11-19 02:42:48 +00005568 if (level > context->getMaximumTextureLevel())
5569 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005570 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com32b11442011-11-19 02:42:48 +00005571 }
5572
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00005573 switch (target)
5574 {
5575 case GL_TEXTURE_2D:
shannon.woods%transgaming.com@gtempaccount.comc1fdf6b2013-04-13 03:44:41 +00005576 if (width > (context->getMaximum2DTextureDimension() >> level) ||
5577 height > (context->getMaximum2DTextureDimension() >> level))
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00005578 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005579 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00005580 }
5581 break;
5582 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
5583 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
5584 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
5585 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
5586 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
5587 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
5588 if (width != height)
5589 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005590 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00005591 }
5592
5593 if (width > (context->getMaximumCubeTextureDimension() >> level) ||
5594 height > (context->getMaximumCubeTextureDimension() >> level))
5595 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005596 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00005597 }
5598 break;
5599 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005600 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00005601 }
5602
gman@chromium.org50c526d2011-08-10 05:19:44 +00005603 switch (format) {
5604 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
5605 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
5606 if (context->supportsDXT1Textures())
daniel@transgaming.com01868132010-08-24 19:21:17 +00005607 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005608 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com01868132010-08-24 19:21:17 +00005609 }
5610 else
5611 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005612 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com01868132010-08-24 19:21:17 +00005613 }
gman@chromium.org50c526d2011-08-10 05:19:44 +00005614 break;
5615 case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
5616 if (context->supportsDXT3Textures())
5617 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005618 return gl::error(GL_INVALID_OPERATION);
gman@chromium.org50c526d2011-08-10 05:19:44 +00005619 }
5620 else
5621 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005622 return gl::error(GL_INVALID_ENUM);
gman@chromium.org50c526d2011-08-10 05:19:44 +00005623 }
5624 break;
5625 case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
5626 if (context->supportsDXT5Textures())
5627 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005628 return gl::error(GL_INVALID_OPERATION);
gman@chromium.org50c526d2011-08-10 05:19:44 +00005629 }
5630 else
5631 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005632 return gl::error(GL_INVALID_ENUM);
gman@chromium.org50c526d2011-08-10 05:19:44 +00005633 }
5634 break;
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00005635 case GL_DEPTH_COMPONENT:
5636 case GL_DEPTH_STENCIL_OES:
5637 if (!context->supportsDepthTextures())
5638 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005639 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00005640 }
daniel@transgaming.com0c854682012-05-31 01:14:11 +00005641 if (target != GL_TEXTURE_2D)
5642 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005643 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com0c854682012-05-31 01:14:11 +00005644 }
daniel@transgaming.com797924b2012-06-05 19:50:01 +00005645 // OES_depth_texture supports loading depth data and multiple levels,
5646 // but ANGLE_depth_texture does not
5647 if (pixels != NULL || level != 0)
daniel@transgaming.com0c854682012-05-31 01:14:11 +00005648 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005649 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com0c854682012-05-31 01:14:11 +00005650 }
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00005651 break;
gman@chromium.org50c526d2011-08-10 05:19:44 +00005652 default:
5653 break;
daniel@transgaming.com01868132010-08-24 19:21:17 +00005654 }
5655
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00005656 if (type == GL_FLOAT)
5657 {
daniel@transgaming.combbeffbb2011-11-09 17:46:11 +00005658 if (!context->supportsFloat32Textures())
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00005659 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005660 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00005661 }
5662 }
5663 else if (type == GL_HALF_FLOAT_OES)
5664 {
daniel@transgaming.combbeffbb2011-11-09 17:46:11 +00005665 if (!context->supportsFloat16Textures())
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00005666 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005667 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00005668 }
5669 }
5670
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005671 if (target == GL_TEXTURE_2D)
5672 {
5673 gl::Texture2D *texture = context->getTexture2D();
5674
5675 if (!texture)
5676 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005677 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005678 }
5679
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005680 if (texture->isImmutable())
5681 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005682 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005683 }
5684
daniel@transgaming.com8a0a2db2011-03-21 16:38:20 +00005685 texture->setImage(level, width, height, format, type, context->getUnpackAlignment(), pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005686 }
5687 else
5688 {
5689 gl::TextureCubeMap *texture = context->getTextureCubeMap();
5690
5691 if (!texture)
5692 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005693 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005694 }
5695
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005696 if (texture->isImmutable())
5697 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005698 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005699 }
5700
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005701 switch (target)
5702 {
5703 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
daniel@transgaming.com8a0a2db2011-03-21 16:38:20 +00005704 texture->setImagePosX(level, width, height, format, type, context->getUnpackAlignment(), pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005705 break;
5706 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
daniel@transgaming.com8a0a2db2011-03-21 16:38:20 +00005707 texture->setImageNegX(level, width, height, format, type, context->getUnpackAlignment(), pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005708 break;
5709 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
daniel@transgaming.com8a0a2db2011-03-21 16:38:20 +00005710 texture->setImagePosY(level, width, height, format, type, context->getUnpackAlignment(), pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005711 break;
5712 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
daniel@transgaming.com8a0a2db2011-03-21 16:38:20 +00005713 texture->setImageNegY(level, width, height, format, type, context->getUnpackAlignment(), pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005714 break;
5715 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
daniel@transgaming.com8a0a2db2011-03-21 16:38:20 +00005716 texture->setImagePosZ(level, width, height, format, type, context->getUnpackAlignment(), pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005717 break;
5718 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
daniel@transgaming.com8a0a2db2011-03-21 16:38:20 +00005719 texture->setImageNegZ(level, width, height, format, type, context->getUnpackAlignment(), pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005720 break;
5721 default: UNREACHABLE();
5722 }
5723 }
5724 }
5725 }
5726 catch(std::bad_alloc&)
5727 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005728 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005729 }
5730}
5731
5732void __stdcall glTexParameterf(GLenum target, GLenum pname, GLfloat param)
5733{
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005734 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLint param = %f)", target, pname, param);
5735
5736 try
5737 {
5738 gl::Context *context = gl::getNonLostContext();
5739
5740 if (context)
5741 {
5742 gl::Texture *texture;
5743
5744 switch (target)
5745 {
5746 case GL_TEXTURE_2D:
5747 texture = context->getTexture2D();
5748 break;
5749 case GL_TEXTURE_CUBE_MAP:
5750 texture = context->getTextureCubeMap();
5751 break;
shannon.woods%transgaming.com@gtempaccount.comc416e1c2013-04-13 03:45:05 +00005752 case GL_TEXTURE_3D:
5753 if (context->getClientVersion() < 3)
5754 {
5755 return gl::error(GL_INVALID_ENUM);
5756 }
5757 texture = context->getTexture3D();
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005758 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005759 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005760 }
5761
5762 switch (pname)
5763 {
5764 case GL_TEXTURE_WRAP_S:
5765 if (!texture->setWrapS((GLenum)param))
5766 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005767 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005768 }
5769 break;
5770 case GL_TEXTURE_WRAP_T:
5771 if (!texture->setWrapT((GLenum)param))
5772 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005773 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005774 }
5775 break;
shannon.woods%transgaming.com@gtempaccount.com0b3a8df2013-04-13 03:44:51 +00005776 case GL_TEXTURE_WRAP_R:
5777 if (context->getClientVersion() < 3 || !texture->setWrapR((GLenum)param))
5778 {
5779 return gl::error(GL_INVALID_ENUM);
5780 }
5781 break;
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005782 case GL_TEXTURE_MIN_FILTER:
5783 if (!texture->setMinFilter((GLenum)param))
5784 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005785 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005786 }
5787 break;
5788 case GL_TEXTURE_MAG_FILTER:
5789 if (!texture->setMagFilter((GLenum)param))
5790 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005791 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005792 }
5793 break;
5794 case GL_TEXTURE_USAGE_ANGLE:
5795 if (!texture->setUsage((GLenum)param))
5796 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005797 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005798 }
5799 break;
5800 case GL_TEXTURE_MAX_ANISOTROPY_EXT:
5801 if (!context->supportsTextureFilterAnisotropy())
5802 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005803 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005804 }
5805 if (!texture->setMaxAnisotropy((float)param, context->getTextureMaxAnisotropy()))
5806 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005807 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005808 }
5809 break;
5810 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005811 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005812 }
5813 }
5814 }
5815 catch(std::bad_alloc&)
5816 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005817 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005818 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005819}
5820
5821void __stdcall glTexParameterfv(GLenum target, GLenum pname, const GLfloat* params)
5822{
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005823 glTexParameterf(target, pname, (GLfloat)*params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005824}
5825
5826void __stdcall glTexParameteri(GLenum target, GLenum pname, GLint param)
5827{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005828 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLint param = %d)", target, pname, param);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005829
5830 try
5831 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005832 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005833
5834 if (context)
5835 {
5836 gl::Texture *texture;
5837
5838 switch (target)
5839 {
5840 case GL_TEXTURE_2D:
5841 texture = context->getTexture2D();
5842 break;
5843 case GL_TEXTURE_CUBE_MAP:
5844 texture = context->getTextureCubeMap();
5845 break;
shannon.woods%transgaming.com@gtempaccount.comc416e1c2013-04-13 03:45:05 +00005846 case GL_TEXTURE_3D:
5847 if (context->getClientVersion() < 3)
5848 {
5849 return gl::error(GL_INVALID_ENUM);
5850 }
5851 texture = context->getTexture3D();
5852 break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005853 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005854 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005855 }
5856
5857 switch (pname)
5858 {
5859 case GL_TEXTURE_WRAP_S:
5860 if (!texture->setWrapS((GLenum)param))
5861 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005862 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005863 }
5864 break;
5865 case GL_TEXTURE_WRAP_T:
5866 if (!texture->setWrapT((GLenum)param))
5867 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005868 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005869 }
5870 break;
shannon.woods%transgaming.com@gtempaccount.com0b3a8df2013-04-13 03:44:51 +00005871 case GL_TEXTURE_WRAP_R:
5872 if (context->getClientVersion() < 3 || !texture->setWrapR((GLenum)param))
5873 {
5874 return gl::error(GL_INVALID_ENUM);
5875 }
5876 break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005877 case GL_TEXTURE_MIN_FILTER:
5878 if (!texture->setMinFilter((GLenum)param))
5879 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005880 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005881 }
5882 break;
5883 case GL_TEXTURE_MAG_FILTER:
5884 if (!texture->setMagFilter((GLenum)param))
5885 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005886 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005887 }
5888 break;
daniel@transgaming.com7d18c172011-11-11 04:18:21 +00005889 case GL_TEXTURE_USAGE_ANGLE:
5890 if (!texture->setUsage((GLenum)param))
5891 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005892 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com7d18c172011-11-11 04:18:21 +00005893 }
5894 break;
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005895 case GL_TEXTURE_MAX_ANISOTROPY_EXT:
5896 if (!context->supportsTextureFilterAnisotropy())
5897 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005898 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005899 }
5900 if (!texture->setMaxAnisotropy((float)param, context->getTextureMaxAnisotropy()))
5901 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005902 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005903 }
5904 break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005905 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005906 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005907 }
5908 }
5909 }
5910 catch(std::bad_alloc&)
5911 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005912 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005913 }
5914}
5915
5916void __stdcall glTexParameteriv(GLenum target, GLenum pname, const GLint* params)
5917{
5918 glTexParameteri(target, pname, *params);
5919}
5920
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005921void __stdcall glTexStorage2DEXT(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height)
5922{
5923 EVENT("(GLenum target = 0x%X, GLsizei levels = %d, GLenum internalformat = 0x%X, GLsizei width = %d, GLsizei height = %d)",
5924 target, levels, internalformat, width, height);
5925
5926 try
5927 {
5928 if (target != GL_TEXTURE_2D && target != GL_TEXTURE_CUBE_MAP)
5929 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005930 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005931 }
5932
5933 if (width < 1 || height < 1 || levels < 1)
5934 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005935 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005936 }
5937
5938 if (target == GL_TEXTURE_CUBE_MAP && width != height)
5939 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005940 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005941 }
5942
daniel@transgaming.com45b888a2011-11-16 03:56:39 +00005943 if (levels != 1 && levels != gl::log2(std::max(width, height)) + 1)
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005944 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005945 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005946 }
5947
5948 GLenum format = gl::ExtractFormat(internalformat);
5949 GLenum type = gl::ExtractType(internalformat);
5950
5951 if (format == GL_NONE || type == GL_NONE)
5952 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005953 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005954 }
5955
5956 gl::Context *context = gl::getNonLostContext();
5957
5958 if (context)
5959 {
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00005960 switch (target)
5961 {
5962 case GL_TEXTURE_2D:
shannon.woods%transgaming.com@gtempaccount.comc1fdf6b2013-04-13 03:44:41 +00005963 if (width > context->getMaximum2DTextureDimension() ||
5964 height > context->getMaximum2DTextureDimension())
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00005965 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005966 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00005967 }
5968 break;
5969 case GL_TEXTURE_CUBE_MAP:
5970 if (width > context->getMaximumCubeTextureDimension() ||
5971 height > context->getMaximumCubeTextureDimension())
5972 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005973 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00005974 }
5975 break;
5976 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005977 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00005978 }
5979
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005980 if (levels != 1 && !context->supportsNonPower2Texture())
5981 {
5982 if (!gl::isPow2(width) || !gl::isPow2(height))
5983 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005984 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005985 }
5986 }
5987
daniel@transgaming.come1077362011-11-11 04:16:50 +00005988 switch (internalformat)
5989 {
5990 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
5991 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
5992 if (!context->supportsDXT1Textures())
5993 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005994 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.come1077362011-11-11 04:16:50 +00005995 }
5996 break;
5997 case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
5998 if (!context->supportsDXT3Textures())
5999 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006000 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.come1077362011-11-11 04:16:50 +00006001 }
6002 break;
6003 case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
6004 if (!context->supportsDXT5Textures())
6005 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006006 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.come1077362011-11-11 04:16:50 +00006007 }
6008 break;
daniel@transgaming.comff941aa2011-11-11 04:17:09 +00006009 case GL_RGBA32F_EXT:
6010 case GL_RGB32F_EXT:
6011 case GL_ALPHA32F_EXT:
6012 case GL_LUMINANCE32F_EXT:
6013 case GL_LUMINANCE_ALPHA32F_EXT:
6014 if (!context->supportsFloat32Textures())
6015 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006016 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comff941aa2011-11-11 04:17:09 +00006017 }
6018 break;
6019 case GL_RGBA16F_EXT:
6020 case GL_RGB16F_EXT:
6021 case GL_ALPHA16F_EXT:
6022 case GL_LUMINANCE16F_EXT:
6023 case GL_LUMINANCE_ALPHA16F_EXT:
6024 if (!context->supportsFloat16Textures())
6025 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006026 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comff941aa2011-11-11 04:17:09 +00006027 }
6028 break;
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00006029 case GL_DEPTH_COMPONENT16:
6030 case GL_DEPTH_COMPONENT32_OES:
6031 case GL_DEPTH24_STENCIL8_OES:
6032 if (!context->supportsDepthTextures())
6033 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006034 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00006035 }
daniel@transgaming.com0c854682012-05-31 01:14:11 +00006036 if (target != GL_TEXTURE_2D)
6037 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006038 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com0c854682012-05-31 01:14:11 +00006039 }
daniel@transgaming.com797924b2012-06-05 19:50:01 +00006040 // ANGLE_depth_texture only supports 1-level textures
6041 if (levels != 1)
6042 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006043 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com797924b2012-06-05 19:50:01 +00006044 }
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00006045 break;
6046 default:
6047 break;
daniel@transgaming.come1077362011-11-11 04:16:50 +00006048 }
6049
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00006050 if (target == GL_TEXTURE_2D)
6051 {
6052 gl::Texture2D *texture = context->getTexture2D();
6053
6054 if (!texture || texture->id() == 0)
6055 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006056 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00006057 }
6058
6059 if (texture->isImmutable())
6060 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006061 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00006062 }
6063
6064 texture->storage(levels, internalformat, width, height);
6065 }
6066 else if (target == GL_TEXTURE_CUBE_MAP)
6067 {
6068 gl::TextureCubeMap *texture = context->getTextureCubeMap();
6069
6070 if (!texture || texture->id() == 0)
6071 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006072 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00006073 }
6074
6075 if (texture->isImmutable())
6076 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006077 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00006078 }
6079
6080 texture->storage(levels, internalformat, width);
6081 }
6082 else UNREACHABLE();
6083 }
6084 }
6085 catch(std::bad_alloc&)
6086 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006087 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00006088 }
6089}
6090
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00006091void __stdcall glTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height,
6092 GLenum format, GLenum type, const GLvoid* pixels)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006093{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006094 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00006095 "GLsizei width = %d, GLsizei height = %d, GLenum format = 0x%X, GLenum type = 0x%X, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00006096 "const GLvoid* pixels = 0x%0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006097 target, level, xoffset, yoffset, width, height, format, type, pixels);
6098
6099 try
6100 {
apatrick@chromium.org551022e2012-01-23 19:56:54 +00006101 if (!gl::IsInternalTextureTarget(target))
daniel@transgaming.com00c75962010-03-11 20:36:15 +00006102 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006103 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com00c75962010-03-11 20:36:15 +00006104 }
6105
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00006106 if (level < 0 || xoffset < 0 || yoffset < 0 || width < 0 || height < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006107 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006108 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006109 }
6110
daniel@transgaming.com00c75962010-03-11 20:36:15 +00006111 if (std::numeric_limits<GLsizei>::max() - xoffset < width || std::numeric_limits<GLsizei>::max() - yoffset < height)
6112 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006113 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com00c75962010-03-11 20:36:15 +00006114 }
6115
daniel@transgaming.com8833dd22012-06-05 19:49:58 +00006116 if (!checkTextureFormatType(format, type))
daniel@transgaming.com00c75962010-03-11 20:36:15 +00006117 {
daniel@transgaming.com8833dd22012-06-05 19:49:58 +00006118 return; // error is set by helper function
daniel@transgaming.com00c75962010-03-11 20:36:15 +00006119 }
6120
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006121 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com00c75962010-03-11 20:36:15 +00006122
6123 if (context)
6124 {
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00006125 if (level > context->getMaximumTextureLevel())
6126 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006127 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00006128 }
6129
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00006130 if (format == GL_FLOAT)
6131 {
daniel@transgaming.combbeffbb2011-11-09 17:46:11 +00006132 if (!context->supportsFloat32Textures())
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00006133 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006134 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00006135 }
6136 }
6137 else if (format == GL_HALF_FLOAT_OES)
6138 {
daniel@transgaming.combbeffbb2011-11-09 17:46:11 +00006139 if (!context->supportsFloat16Textures())
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00006140 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006141 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00006142 }
6143 }
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00006144 else if (gl::IsDepthTexture(format))
6145 {
6146 if (!context->supportsDepthTextures())
6147 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006148 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00006149 }
daniel@transgaming.com0c854682012-05-31 01:14:11 +00006150 if (target != GL_TEXTURE_2D)
6151 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006152 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com0c854682012-05-31 01:14:11 +00006153 }
6154 // OES_depth_texture supports loading depth data, but ANGLE_depth_texture does not
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006155 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00006156 }
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00006157
daniel@transgaming.com1d2d3c42012-05-31 01:14:15 +00006158 if (width == 0 || height == 0 || pixels == NULL)
6159 {
6160 return;
6161 }
6162
daniel@transgaming.com00c75962010-03-11 20:36:15 +00006163 if (target == GL_TEXTURE_2D)
6164 {
6165 gl::Texture2D *texture = context->getTexture2D();
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00006166 if (validateSubImageParams2D(false, width, height, xoffset, yoffset, level, format, type, texture))
daniel@transgaming.com00c75962010-03-11 20:36:15 +00006167 {
daniel@transgaming.com343373a2011-11-29 19:42:32 +00006168 texture->subImage(level, xoffset, yoffset, width, height, format, type, context->getUnpackAlignment(), pixels);
daniel@transgaming.com00c75962010-03-11 20:36:15 +00006169 }
daniel@transgaming.com00c75962010-03-11 20:36:15 +00006170 }
daniel@transgaming.com19ffc242010-05-04 03:35:21 +00006171 else if (gl::IsCubemapTextureTarget(target))
daniel@transgaming.com00c75962010-03-11 20:36:15 +00006172 {
6173 gl::TextureCubeMap *texture = context->getTextureCubeMap();
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00006174 if (validateSubImageParamsCube(false, width, height, xoffset, yoffset, target, level, format, type, texture))
daniel@transgaming.com00c75962010-03-11 20:36:15 +00006175 {
daniel@transgaming.com343373a2011-11-29 19:42:32 +00006176 texture->subImage(target, level, xoffset, yoffset, width, height, format, type, context->getUnpackAlignment(), pixels);
daniel@transgaming.com00c75962010-03-11 20:36:15 +00006177 }
daniel@transgaming.com00c75962010-03-11 20:36:15 +00006178 }
6179 else
6180 {
6181 UNREACHABLE();
6182 }
6183 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006184 }
6185 catch(std::bad_alloc&)
6186 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006187 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006188 }
6189}
6190
6191void __stdcall glUniform1f(GLint location, GLfloat x)
6192{
6193 glUniform1fv(location, 1, &x);
6194}
6195
6196void __stdcall glUniform1fv(GLint location, GLsizei count, const GLfloat* v)
6197{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006198 EVENT("(GLint location = %d, GLsizei count = %d, const GLfloat* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006199
6200 try
6201 {
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006202 if (count < 0)
6203 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006204 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006205 }
6206
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006207 if (location == -1)
6208 {
6209 return;
6210 }
6211
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006212 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006213
6214 if (context)
6215 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00006216 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006217 if (!programBinary)
6218 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006219 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006220 }
6221
6222 if (!programBinary->setUniform1fv(location, count, v))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006223 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006224 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006225 }
6226 }
6227 }
6228 catch(std::bad_alloc&)
6229 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006230 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006231 }
6232}
6233
6234void __stdcall glUniform1i(GLint location, GLint x)
6235{
6236 glUniform1iv(location, 1, &x);
6237}
6238
6239void __stdcall glUniform1iv(GLint location, GLsizei count, const GLint* v)
6240{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006241 EVENT("(GLint location = %d, GLsizei count = %d, const GLint* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006242
6243 try
6244 {
6245 if (count < 0)
6246 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006247 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006248 }
6249
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006250 if (location == -1)
6251 {
6252 return;
6253 }
6254
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006255 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006256
6257 if (context)
6258 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00006259 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006260 if (!programBinary)
6261 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006262 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006263 }
6264
6265 if (!programBinary->setUniform1iv(location, count, v))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006266 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006267 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006268 }
6269 }
6270 }
6271 catch(std::bad_alloc&)
6272 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006273 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006274 }
6275}
6276
6277void __stdcall glUniform2f(GLint location, GLfloat x, GLfloat y)
6278{
6279 GLfloat xy[2] = {x, y};
6280
6281 glUniform2fv(location, 1, (GLfloat*)&xy);
6282}
6283
6284void __stdcall glUniform2fv(GLint location, GLsizei count, const GLfloat* v)
6285{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006286 EVENT("(GLint location = %d, GLsizei count = %d, const GLfloat* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006287
6288 try
6289 {
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006290 if (count < 0)
6291 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006292 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006293 }
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006294
6295 if (location == -1)
6296 {
6297 return;
6298 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006299
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006300 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006301
6302 if (context)
6303 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00006304 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006305 if (!programBinary)
6306 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006307 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006308 }
6309
6310 if (!programBinary->setUniform2fv(location, count, v))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006311 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006312 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006313 }
6314 }
6315 }
6316 catch(std::bad_alloc&)
6317 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006318 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006319 }
6320}
6321
6322void __stdcall glUniform2i(GLint location, GLint x, GLint y)
6323{
6324 GLint xy[4] = {x, y};
6325
6326 glUniform2iv(location, 1, (GLint*)&xy);
6327}
6328
6329void __stdcall glUniform2iv(GLint location, GLsizei count, const GLint* v)
6330{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006331 EVENT("(GLint location = %d, GLsizei count = %d, const GLint* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006332
6333 try
6334 {
6335 if (count < 0)
6336 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006337 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006338 }
6339
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006340 if (location == -1)
6341 {
6342 return;
6343 }
6344
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006345 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006346
6347 if (context)
6348 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00006349 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006350 if (!programBinary)
6351 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006352 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006353 }
6354
6355 if (!programBinary->setUniform2iv(location, count, v))
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006356 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006357 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006358 }
6359 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006360 }
6361 catch(std::bad_alloc&)
6362 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006363 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006364 }
6365}
6366
6367void __stdcall glUniform3f(GLint location, GLfloat x, GLfloat y, GLfloat z)
6368{
6369 GLfloat xyz[3] = {x, y, z};
6370
6371 glUniform3fv(location, 1, (GLfloat*)&xyz);
6372}
6373
6374void __stdcall glUniform3fv(GLint location, GLsizei count, const GLfloat* v)
6375{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006376 EVENT("(GLint location = %d, GLsizei count = %d, const GLfloat* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006377
6378 try
6379 {
6380 if (count < 0)
6381 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006382 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006383 }
6384
6385 if (location == -1)
6386 {
6387 return;
6388 }
6389
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006390 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006391
6392 if (context)
6393 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00006394 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006395 if (!programBinary)
6396 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006397 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006398 }
6399
6400 if (!programBinary->setUniform3fv(location, count, v))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006401 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006402 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006403 }
6404 }
6405 }
6406 catch(std::bad_alloc&)
6407 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006408 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006409 }
6410}
6411
6412void __stdcall glUniform3i(GLint location, GLint x, GLint y, GLint z)
6413{
6414 GLint xyz[3] = {x, y, z};
6415
6416 glUniform3iv(location, 1, (GLint*)&xyz);
6417}
6418
6419void __stdcall glUniform3iv(GLint location, GLsizei count, const GLint* v)
6420{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006421 EVENT("(GLint location = %d, GLsizei count = %d, const GLint* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006422
6423 try
6424 {
6425 if (count < 0)
6426 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006427 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006428 }
6429
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006430 if (location == -1)
6431 {
6432 return;
6433 }
6434
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006435 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006436
6437 if (context)
6438 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00006439 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006440 if (!programBinary)
6441 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006442 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006443 }
6444
6445 if (!programBinary->setUniform3iv(location, count, v))
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006446 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006447 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006448 }
6449 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006450 }
6451 catch(std::bad_alloc&)
6452 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006453 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006454 }
6455}
6456
6457void __stdcall glUniform4f(GLint location, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
6458{
6459 GLfloat xyzw[4] = {x, y, z, w};
6460
6461 glUniform4fv(location, 1, (GLfloat*)&xyzw);
6462}
6463
6464void __stdcall glUniform4fv(GLint location, GLsizei count, const GLfloat* v)
6465{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006466 EVENT("(GLint location = %d, GLsizei count = %d, const GLfloat* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006467
6468 try
6469 {
6470 if (count < 0)
6471 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006472 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006473 }
6474
6475 if (location == -1)
6476 {
6477 return;
6478 }
6479
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006480 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006481
6482 if (context)
6483 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00006484 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006485 if (!programBinary)
6486 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006487 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006488 }
6489
6490 if (!programBinary->setUniform4fv(location, count, v))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006491 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006492 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006493 }
6494 }
6495 }
6496 catch(std::bad_alloc&)
6497 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006498 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006499 }
6500}
6501
6502void __stdcall glUniform4i(GLint location, GLint x, GLint y, GLint z, GLint w)
6503{
6504 GLint xyzw[4] = {x, y, z, w};
6505
6506 glUniform4iv(location, 1, (GLint*)&xyzw);
6507}
6508
6509void __stdcall glUniform4iv(GLint location, GLsizei count, const GLint* v)
6510{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006511 EVENT("(GLint location = %d, GLsizei count = %d, const GLint* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006512
6513 try
6514 {
6515 if (count < 0)
6516 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006517 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006518 }
6519
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006520 if (location == -1)
6521 {
6522 return;
6523 }
6524
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006525 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006526
6527 if (context)
6528 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00006529 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006530 if (!programBinary)
6531 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006532 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006533 }
6534
6535 if (!programBinary->setUniform4iv(location, count, v))
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006536 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006537 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006538 }
6539 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006540 }
6541 catch(std::bad_alloc&)
6542 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006543 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006544 }
6545}
6546
6547void __stdcall glUniformMatrix2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
6548{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006549 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00006550 location, count, transpose, value);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006551
6552 try
6553 {
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00006554 if (count < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006555 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006556 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006557 }
6558
6559 if (location == -1)
6560 {
6561 return;
6562 }
6563
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006564 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006565
6566 if (context)
6567 {
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00006568 if (transpose != GL_FALSE && context->getClientVersion() < 3)
6569 {
6570 return gl::error(GL_INVALID_VALUE);
6571 }
6572
daniel@transgaming.com62a28462012-07-24 18:33:59 +00006573 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006574 if (!programBinary)
6575 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006576 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006577 }
6578
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00006579 if (!programBinary->setUniformMatrix2fv(location, count, transpose, value))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006580 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006581 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006582 }
6583 }
6584 }
6585 catch(std::bad_alloc&)
6586 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006587 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006588 }
6589}
6590
6591void __stdcall glUniformMatrix3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
6592{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006593 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00006594 location, count, transpose, value);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006595
6596 try
6597 {
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00006598 if (count < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006599 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006600 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006601 }
6602
6603 if (location == -1)
6604 {
6605 return;
6606 }
6607
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006608 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006609
6610 if (context)
6611 {
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00006612 if (transpose != GL_FALSE && context->getClientVersion() < 3)
6613 {
6614 return gl::error(GL_INVALID_VALUE);
6615 }
6616
daniel@transgaming.com62a28462012-07-24 18:33:59 +00006617 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006618 if (!programBinary)
6619 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006620 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006621 }
6622
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00006623 if (!programBinary->setUniformMatrix3fv(location, count, transpose, value))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006624 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006625 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006626 }
6627 }
6628 }
6629 catch(std::bad_alloc&)
6630 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006631 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006632 }
6633}
6634
6635void __stdcall glUniformMatrix4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
6636{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006637 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00006638 location, count, transpose, value);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006639
6640 try
6641 {
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00006642 if (count < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006643 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006644 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006645 }
6646
6647 if (location == -1)
6648 {
6649 return;
6650 }
6651
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006652 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006653
6654 if (context)
6655 {
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00006656 if (transpose != GL_FALSE && context->getClientVersion() < 3)
6657 {
6658 return gl::error(GL_INVALID_VALUE);
6659 }
6660
daniel@transgaming.com62a28462012-07-24 18:33:59 +00006661 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006662 if (!programBinary)
6663 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006664 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006665 }
6666
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00006667 if (!programBinary->setUniformMatrix4fv(location, count, transpose, value))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006668 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006669 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006670 }
6671 }
6672 }
6673 catch(std::bad_alloc&)
6674 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006675 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006676 }
6677}
6678
6679void __stdcall glUseProgram(GLuint program)
6680{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006681 EVENT("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006682
6683 try
6684 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006685 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006686
6687 if (context)
6688 {
6689 gl::Program *programObject = context->getProgram(program);
6690
daniel@transgaming.comc8478202010-04-13 19:53:35 +00006691 if (!programObject && program != 0)
6692 {
6693 if (context->getShader(program))
6694 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006695 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comc8478202010-04-13 19:53:35 +00006696 }
6697 else
6698 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006699 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comc8478202010-04-13 19:53:35 +00006700 }
6701 }
6702
daniel@transgaming.com716056c2012-07-24 18:38:59 +00006703 if (program != 0 && !programObject->isLinked())
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006704 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006705 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006706 }
6707
6708 context->useProgram(program);
6709 }
6710 }
6711 catch(std::bad_alloc&)
6712 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006713 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006714 }
6715}
6716
6717void __stdcall glValidateProgram(GLuint program)
6718{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006719 EVENT("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006720
6721 try
6722 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006723 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00006724
6725 if (context)
6726 {
6727 gl::Program *programObject = context->getProgram(program);
6728
6729 if (!programObject)
6730 {
6731 if (context->getShader(program))
6732 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006733 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00006734 }
6735 else
6736 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006737 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00006738 }
6739 }
6740
apatrick@chromium.org253b8d22012-06-22 19:27:21 +00006741 programObject->validate();
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00006742 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006743 }
6744 catch(std::bad_alloc&)
6745 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006746 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006747 }
6748}
6749
6750void __stdcall glVertexAttrib1f(GLuint index, GLfloat x)
6751{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006752 EVENT("(GLuint index = %d, GLfloat x = %f)", index, x);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006753
6754 try
6755 {
6756 if (index >= gl::MAX_VERTEX_ATTRIBS)
6757 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006758 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006759 }
6760
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006761 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006762
6763 if (context)
6764 {
6765 GLfloat vals[4] = { x, 0, 0, 1 };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00006766 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006767 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006768 }
6769 catch(std::bad_alloc&)
6770 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006771 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006772 }
6773}
6774
6775void __stdcall glVertexAttrib1fv(GLuint index, const GLfloat* values)
6776{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006777 EVENT("(GLuint index = %d, const GLfloat* values = 0x%0.8p)", index, values);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006778
6779 try
6780 {
6781 if (index >= gl::MAX_VERTEX_ATTRIBS)
6782 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006783 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006784 }
6785
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006786 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006787
6788 if (context)
6789 {
6790 GLfloat vals[4] = { values[0], 0, 0, 1 };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00006791 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006792 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006793 }
6794 catch(std::bad_alloc&)
6795 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006796 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006797 }
6798}
6799
6800void __stdcall glVertexAttrib2f(GLuint index, GLfloat x, GLfloat y)
6801{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006802 EVENT("(GLuint index = %d, GLfloat x = %f, GLfloat y = %f)", index, x, y);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006803
6804 try
6805 {
6806 if (index >= gl::MAX_VERTEX_ATTRIBS)
6807 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006808 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006809 }
6810
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006811 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006812
6813 if (context)
6814 {
6815 GLfloat vals[4] = { x, y, 0, 1 };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00006816 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006817 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006818 }
6819 catch(std::bad_alloc&)
6820 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006821 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006822 }
6823}
6824
6825void __stdcall glVertexAttrib2fv(GLuint index, const GLfloat* values)
6826{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006827 EVENT("(GLuint index = %d, const GLfloat* values = 0x%0.8p)", index, values);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006828
6829 try
6830 {
6831 if (index >= gl::MAX_VERTEX_ATTRIBS)
6832 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006833 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006834 }
6835
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006836 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006837
6838 if (context)
6839 {
6840 GLfloat vals[4] = { values[0], values[1], 0, 1 };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00006841 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006842 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006843 }
6844 catch(std::bad_alloc&)
6845 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006846 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006847 }
6848}
6849
6850void __stdcall glVertexAttrib3f(GLuint index, GLfloat x, GLfloat y, GLfloat z)
6851{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006852 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 +00006853
6854 try
6855 {
6856 if (index >= gl::MAX_VERTEX_ATTRIBS)
6857 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006858 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006859 }
6860
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006861 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006862
6863 if (context)
6864 {
6865 GLfloat vals[4] = { x, y, z, 1 };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00006866 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006867 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006868 }
6869 catch(std::bad_alloc&)
6870 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006871 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006872 }
6873}
6874
6875void __stdcall glVertexAttrib3fv(GLuint index, const GLfloat* values)
6876{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006877 EVENT("(GLuint index = %d, const GLfloat* values = 0x%0.8p)", index, values);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006878
6879 try
6880 {
6881 if (index >= gl::MAX_VERTEX_ATTRIBS)
6882 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006883 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006884 }
6885
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006886 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006887
6888 if (context)
6889 {
6890 GLfloat vals[4] = { values[0], values[1], values[2], 1 };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00006891 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006892 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006893 }
6894 catch(std::bad_alloc&)
6895 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006896 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006897 }
6898}
6899
6900void __stdcall glVertexAttrib4f(GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
6901{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006902 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 +00006903
6904 try
6905 {
6906 if (index >= gl::MAX_VERTEX_ATTRIBS)
6907 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006908 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006909 }
6910
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006911 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006912
6913 if (context)
6914 {
6915 GLfloat vals[4] = { x, y, z, w };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00006916 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006917 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006918 }
6919 catch(std::bad_alloc&)
6920 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006921 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006922 }
6923}
6924
6925void __stdcall glVertexAttrib4fv(GLuint index, const GLfloat* values)
6926{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006927 EVENT("(GLuint index = %d, const GLfloat* values = 0x%0.8p)", index, values);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006928
6929 try
6930 {
6931 if (index >= gl::MAX_VERTEX_ATTRIBS)
6932 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006933 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006934 }
6935
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006936 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006937
6938 if (context)
6939 {
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00006940 context->setVertexAttribf(index, values);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006941 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006942 }
6943 catch(std::bad_alloc&)
6944 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006945 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006946 }
6947}
6948
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00006949void __stdcall glVertexAttribDivisorANGLE(GLuint index, GLuint divisor)
6950{
6951 EVENT("(GLuint index = %d, GLuint divisor = %d)", index, divisor);
6952
6953 try
6954 {
6955 if (index >= gl::MAX_VERTEX_ATTRIBS)
6956 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006957 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00006958 }
6959
6960 gl::Context *context = gl::getNonLostContext();
6961
6962 if (context)
6963 {
6964 context->setVertexAttribDivisor(index, divisor);
6965 }
6966 }
6967 catch(std::bad_alloc&)
6968 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006969 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00006970 }
6971}
6972
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00006973void __stdcall glVertexAttribPointer(GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid* ptr)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006974{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006975 EVENT("(GLuint index = %d, GLint size = %d, GLenum type = 0x%X, "
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006976 "GLboolean normalized = %u, GLsizei stride = %d, const GLvoid* ptr = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00006977 index, size, type, normalized, stride, ptr);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006978
6979 try
6980 {
6981 if (index >= gl::MAX_VERTEX_ATTRIBS)
6982 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006983 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006984 }
6985
6986 if (size < 1 || size > 4)
6987 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006988 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006989 }
6990
shannon.woods%transgaming.com@gtempaccount.com1a4e09a2013-04-13 03:33:30 +00006991 gl::Context *context = gl::getNonLostContext();
6992
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006993 switch (type)
6994 {
6995 case GL_BYTE:
6996 case GL_UNSIGNED_BYTE:
6997 case GL_SHORT:
6998 case GL_UNSIGNED_SHORT:
6999 case GL_FIXED:
7000 case GL_FLOAT:
7001 break;
shannon.woods%transgaming.com@gtempaccount.com1a4e09a2013-04-13 03:33:30 +00007002 case GL_HALF_FLOAT:
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007003 case GL_INT:
7004 case GL_UNSIGNED_INT:
shannon.woods%transgaming.com@gtempaccount.com1ab57be2013-04-13 03:38:39 +00007005 case GL_INT_2_10_10_10_REV:
7006 case GL_UNSIGNED_INT_2_10_10_10_REV:
shannon.woods%transgaming.com@gtempaccount.com1a4e09a2013-04-13 03:33:30 +00007007 if (context && context->getClientVersion() < 3)
7008 {
7009 return gl::error(GL_INVALID_ENUM);
7010 }
7011 else
7012 {
7013 break;
7014 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007015 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007016 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007017 }
7018
7019 if (stride < 0)
7020 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007021 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007022 }
7023
shannon.woods%transgaming.com@gtempaccount.com1ab57be2013-04-13 03:38:39 +00007024 if ((type == GL_INT_2_10_10_10_REV || type == GL_UNSIGNED_INT_2_10_10_10_REV) && size != 4)
7025 {
7026 return gl::error(GL_INVALID_OPERATION);
7027 }
7028
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007029 if (context)
7030 {
shannon.woods%transgaming.com@gtempaccount.com8de4e6a2013-04-13 03:37:44 +00007031 context->setVertexAttribState(index, context->getArrayBuffer(), size, type,
7032 normalized == GL_TRUE, false, stride, ptr);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007033 }
7034 }
7035 catch(std::bad_alloc&)
7036 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007037 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007038 }
7039}
7040
7041void __stdcall glViewport(GLint x, GLint y, GLsizei width, GLsizei height)
7042{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00007043 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 +00007044
7045 try
7046 {
7047 if (width < 0 || height < 0)
7048 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007049 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007050 }
7051
daniel@transgaming.com9d788502011-11-09 17:46:55 +00007052 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007053
7054 if (context)
7055 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00007056 context->setViewportParams(x, y, width, height);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007057 }
7058 }
7059 catch(std::bad_alloc&)
7060 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007061 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007062 }
7063}
7064
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007065// OpenGL ES 3.0 functions
7066
7067void __stdcall glReadBuffer(GLenum mode)
7068{
7069 EVENT("(GLenum mode = 0x%X)", mode);
7070
7071 try
7072 {
7073 gl::Context *context = gl::getNonLostContext();
7074
7075 if (context)
7076 {
7077 if (context->getClientVersion() < 3)
7078 {
7079 return gl::error(GL_INVALID_OPERATION);
7080 }
7081 }
7082
7083 UNIMPLEMENTED();
7084 }
7085 catch(std::bad_alloc&)
7086 {
7087 return gl::error(GL_OUT_OF_MEMORY);
7088 }
7089}
7090
7091void __stdcall glDrawRangeElements(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid* indices)
7092{
7093 EVENT("(GLenum mode = 0x%X, GLuint start = %u, GLuint end = %u, GLsizei count = %d, GLenum type = 0x%X, "
7094 "const GLvoid* indices = 0x%0.8p)", mode, start, end, count, type, indices);
7095
7096 try
7097 {
7098 gl::Context *context = gl::getNonLostContext();
7099
7100 if (context)
7101 {
7102 if (context->getClientVersion() < 3)
7103 {
7104 return gl::error(GL_INVALID_OPERATION);
7105 }
7106 }
7107
7108 UNIMPLEMENTED();
7109 }
7110 catch(std::bad_alloc&)
7111 {
7112 return gl::error(GL_OUT_OF_MEMORY);
7113 }
7114}
7115
7116void __stdcall glTexImage3D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid* pixels)
7117{
7118 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint internalformat = %d, GLsizei width = %d, "
7119 "GLsizei height = %d, GLsizei depth = %d, GLint border = %d, GLenum format = 0x%X, "
7120 "GLenum type = 0x%X, const GLvoid* pixels = 0x%0.8p)",
7121 target, level, internalformat, width, height, depth, border, format, type, pixels);
7122
7123 try
7124 {
7125 gl::Context *context = gl::getNonLostContext();
7126
7127 if (context)
7128 {
7129 if (context->getClientVersion() < 3)
7130 {
7131 return gl::error(GL_INVALID_OPERATION);
7132 }
7133 }
7134
7135 UNIMPLEMENTED();
7136 }
7137 catch(std::bad_alloc&)
7138 {
7139 return gl::error(GL_OUT_OF_MEMORY);
7140 }
7141}
7142
7143void __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)
7144{
7145 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
7146 "GLint zoffset = %d, GLsizei width = %d, GLsizei height = %d, GLsizei depth = %d, "
7147 "GLenum format = 0x%X, GLenum type = 0x%X, const GLvoid* pixels = 0x%0.8p)",
7148 target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels);
7149
7150 try
7151 {
7152 gl::Context *context = gl::getNonLostContext();
7153
7154 if (context)
7155 {
7156 if (context->getClientVersion() < 3)
7157 {
7158 return gl::error(GL_INVALID_OPERATION);
7159 }
7160 }
7161
7162 UNIMPLEMENTED();
7163 }
7164 catch(std::bad_alloc&)
7165 {
7166 return gl::error(GL_OUT_OF_MEMORY);
7167 }
7168}
7169
7170void __stdcall glCopyTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height)
7171{
7172 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
7173 "GLint zoffset = %d, GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d)",
7174 target, level, xoffset, yoffset, zoffset, x, y, width, height);
7175
7176 try
7177 {
7178 gl::Context *context = gl::getNonLostContext();
7179
7180 if (context)
7181 {
7182 if (context->getClientVersion() < 3)
7183 {
7184 return gl::error(GL_INVALID_OPERATION);
7185 }
7186 }
7187
7188 UNIMPLEMENTED();
7189 }
7190 catch(std::bad_alloc&)
7191 {
7192 return gl::error(GL_OUT_OF_MEMORY);
7193 }
7194}
7195
7196void __stdcall glCompressedTexImage3D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid* data)
7197{
7198 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint internalformat = %d, GLsizei width = %d, "
7199 "GLsizei height = %d, GLsizei depth = %d, GLint border = %d, GLsizei imageSize = %d, "
7200 "const GLvoid* data = 0x%0.8p)",
7201 target, level, internalformat, width, height, depth, border, imageSize, data);
7202
7203 try
7204 {
7205 gl::Context *context = gl::getNonLostContext();
7206
7207 if (context)
7208 {
7209 if (context->getClientVersion() < 3)
7210 {
7211 return gl::error(GL_INVALID_OPERATION);
7212 }
7213 }
7214
7215 UNIMPLEMENTED();
7216 }
7217 catch(std::bad_alloc&)
7218 {
7219 return gl::error(GL_OUT_OF_MEMORY);
7220 }
7221}
7222
7223void __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)
7224{
7225 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
7226 "GLint zoffset = %d, GLsizei width = %d, GLsizei height = %d, GLsizei depth = %d, "
7227 "GLenum format = 0x%X, GLsizei imageSize = %d, const GLvoid* data = 0x%0.8p)",
7228 target, level, xoffset, yoffset, zoffset, width, height, depth, format, imageSize, data);
7229
7230 try
7231 {
7232 gl::Context *context = gl::getNonLostContext();
7233
7234 if (context)
7235 {
7236 if (context->getClientVersion() < 3)
7237 {
7238 return gl::error(GL_INVALID_OPERATION);
7239 }
7240 }
7241
7242 UNIMPLEMENTED();
7243 }
7244 catch(std::bad_alloc&)
7245 {
7246 return gl::error(GL_OUT_OF_MEMORY);
7247 }
7248}
7249
7250void __stdcall glGenQueries(GLsizei n, GLuint* ids)
7251{
7252 EVENT("(GLsizei n = %d, GLuint* ids = 0x%0.8p)", n, ids);
7253
7254 try
7255 {
7256 gl::Context *context = gl::getNonLostContext();
7257
7258 if (context)
7259 {
7260 if (context->getClientVersion() < 3)
7261 {
7262 return gl::error(GL_INVALID_OPERATION);
7263 }
7264 }
7265
7266 UNIMPLEMENTED();
7267 }
7268 catch(std::bad_alloc&)
7269 {
7270 return gl::error(GL_OUT_OF_MEMORY);
7271 }
7272}
7273
7274void __stdcall glDeleteQueries(GLsizei n, const GLuint* ids)
7275{
7276 EVENT("(GLsizei n = %d, GLuint* ids = 0x%0.8p)", n, ids);
7277
7278 try
7279 {
7280 gl::Context *context = gl::getNonLostContext();
7281
7282 if (context)
7283 {
7284 if (context->getClientVersion() < 3)
7285 {
7286 return gl::error(GL_INVALID_OPERATION);
7287 }
7288 }
7289
7290 UNIMPLEMENTED();
7291 }
7292 catch(std::bad_alloc&)
7293 {
7294 return gl::error(GL_OUT_OF_MEMORY);
7295 }
7296}
7297
7298GLboolean __stdcall glIsQuery(GLuint id)
7299{
7300 EVENT("(GLuint id = %u)", id);
7301
7302 try
7303 {
7304 gl::Context *context = gl::getNonLostContext();
7305
7306 if (context)
7307 {
7308 if (context->getClientVersion() < 3)
7309 {
7310 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
7311 }
7312 }
7313
7314 UNIMPLEMENTED();
7315 }
7316 catch(std::bad_alloc&)
7317 {
7318 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
7319 }
7320
7321 return GL_FALSE;
7322}
7323
7324void __stdcall glBeginQuery(GLenum target, GLuint id)
7325{
7326 EVENT("(GLenum target = 0x%X, GLuint id = %u)", target, id);
7327
7328 try
7329 {
7330 gl::Context *context = gl::getNonLostContext();
7331
7332 if (context)
7333 {
7334 if (context->getClientVersion() < 3)
7335 {
7336 return gl::error(GL_INVALID_OPERATION);
7337 }
7338 }
7339
7340 UNIMPLEMENTED();
7341 }
7342 catch(std::bad_alloc&)
7343 {
7344 return gl::error(GL_OUT_OF_MEMORY);
7345 }
7346}
7347
7348void __stdcall glEndQuery(GLenum target)
7349{
7350 EVENT("(GLenum target = 0x%X)", target);
7351
7352 try
7353 {
7354 gl::Context *context = gl::getNonLostContext();
7355
7356 if (context)
7357 {
7358 if (context->getClientVersion() < 3)
7359 {
7360 return gl::error(GL_INVALID_OPERATION);
7361 }
7362 }
7363
7364 UNIMPLEMENTED();
7365 }
7366 catch(std::bad_alloc&)
7367 {
7368 return gl::error(GL_OUT_OF_MEMORY);
7369 }
7370}
7371
7372void __stdcall glGetQueryiv(GLenum target, GLenum pname, GLint* params)
7373{
7374 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLint* params = 0x%0.8p)", target, pname, params);
7375
7376 try
7377 {
7378 gl::Context *context = gl::getNonLostContext();
7379
7380 if (context)
7381 {
7382 if (context->getClientVersion() < 3)
7383 {
7384 return gl::error(GL_INVALID_OPERATION);
7385 }
7386 }
7387
7388 UNIMPLEMENTED();
7389 }
7390 catch(std::bad_alloc&)
7391 {
7392 return gl::error(GL_OUT_OF_MEMORY);
7393 }
7394}
7395
7396void __stdcall glGetQueryObjectuiv(GLuint id, GLenum pname, GLuint* params)
7397{
7398 EVENT("(GLuint id = %u, GLenum pname = 0x%X, GLint* params = 0x%0.8p)", id, pname, params);
7399
7400 try
7401 {
7402 gl::Context *context = gl::getNonLostContext();
7403
7404 if (context)
7405 {
7406 if (context->getClientVersion() < 3)
7407 {
7408 return gl::error(GL_INVALID_OPERATION);
7409 }
7410 }
7411
7412 UNIMPLEMENTED();
7413 }
7414 catch(std::bad_alloc&)
7415 {
7416 return gl::error(GL_OUT_OF_MEMORY);
7417 }
7418}
7419
7420GLboolean __stdcall glUnmapBuffer(GLenum target)
7421{
7422 EVENT("(GLenum target = 0x%X)", target);
7423
7424 try
7425 {
7426 gl::Context *context = gl::getNonLostContext();
7427
7428 if (context)
7429 {
7430 if (context->getClientVersion() < 3)
7431 {
7432 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
7433 }
7434 }
7435
7436 UNIMPLEMENTED();
7437 }
7438 catch(std::bad_alloc&)
7439 {
7440 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
7441 }
7442
7443 return GL_FALSE;
7444}
7445
7446void __stdcall glGetBufferPointerv(GLenum target, GLenum pname, GLvoid** params)
7447{
7448 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLvoid** params = 0x%0.8p)", target, pname, params);
7449
7450 try
7451 {
7452 gl::Context *context = gl::getNonLostContext();
7453
7454 if (context)
7455 {
7456 if (context->getClientVersion() < 3)
7457 {
7458 return gl::error(GL_INVALID_OPERATION);
7459 }
7460 }
7461
7462 UNIMPLEMENTED();
7463 }
7464 catch(std::bad_alloc&)
7465 {
7466 return gl::error(GL_OUT_OF_MEMORY);
7467 }
7468}
7469
7470void __stdcall glDrawBuffers(GLsizei n, const GLenum* bufs)
7471{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007472 try
7473 {
7474 gl::Context *context = gl::getNonLostContext();
7475
7476 if (context)
7477 {
7478 if (context->getClientVersion() < 3)
7479 {
7480 return gl::error(GL_INVALID_OPERATION);
7481 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007482
shannon.woods%transgaming.com@gtempaccount.com7948c5f2013-04-13 03:38:58 +00007483 glDrawBuffersEXT(n, bufs);
7484 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007485 }
7486 catch(std::bad_alloc&)
7487 {
7488 return gl::error(GL_OUT_OF_MEMORY);
7489 }
7490}
7491
7492void __stdcall glUniformMatrix2x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
7493{
7494 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
7495 location, count, transpose, value);
7496
7497 try
7498 {
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00007499 if (count < 0)
7500 {
7501 return gl::error(GL_INVALID_VALUE);
7502 }
7503
7504 if (location == -1)
7505 {
7506 return;
7507 }
7508
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007509 gl::Context *context = gl::getNonLostContext();
7510
7511 if (context)
7512 {
7513 if (context->getClientVersion() < 3)
7514 {
7515 return gl::error(GL_INVALID_OPERATION);
7516 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007517
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00007518 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
7519 if (!programBinary)
7520 {
7521 return gl::error(GL_INVALID_OPERATION);
7522 }
7523
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00007524 if (!programBinary->setUniformMatrix2x3fv(location, count, transpose, value))
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00007525 {
7526 return gl::error(GL_INVALID_OPERATION);
7527 }
7528 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007529 }
7530 catch(std::bad_alloc&)
7531 {
7532 return gl::error(GL_OUT_OF_MEMORY);
7533 }
7534}
7535
7536void __stdcall glUniformMatrix3x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
7537{
7538 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
7539 location, count, transpose, value);
7540
7541 try
7542 {
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00007543 if (count < 0)
7544 {
7545 return gl::error(GL_INVALID_VALUE);
7546 }
7547
7548 if (location == -1)
7549 {
7550 return;
7551 }
7552
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007553 gl::Context *context = gl::getNonLostContext();
7554
7555 if (context)
7556 {
7557 if (context->getClientVersion() < 3)
7558 {
7559 return gl::error(GL_INVALID_OPERATION);
7560 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007561
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00007562 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
7563 if (!programBinary)
7564 {
7565 return gl::error(GL_INVALID_OPERATION);
7566 }
7567
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00007568 if (!programBinary->setUniformMatrix3x2fv(location, count, transpose, value))
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00007569 {
7570 return gl::error(GL_INVALID_OPERATION);
7571 }
7572 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007573 }
7574 catch(std::bad_alloc&)
7575 {
7576 return gl::error(GL_OUT_OF_MEMORY);
7577 }
7578}
7579
7580void __stdcall glUniformMatrix2x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
7581{
7582 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
7583 location, count, transpose, value);
7584
7585 try
7586 {
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00007587 if (count < 0)
7588 {
7589 return gl::error(GL_INVALID_VALUE);
7590 }
7591
7592 if (location == -1)
7593 {
7594 return;
7595 }
7596
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007597 gl::Context *context = gl::getNonLostContext();
7598
7599 if (context)
7600 {
7601 if (context->getClientVersion() < 3)
7602 {
7603 return gl::error(GL_INVALID_OPERATION);
7604 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007605
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00007606 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
7607 if (!programBinary)
7608 {
7609 return gl::error(GL_INVALID_OPERATION);
7610 }
7611
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00007612 if (!programBinary->setUniformMatrix2x4fv(location, count, transpose, value))
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00007613 {
7614 return gl::error(GL_INVALID_OPERATION);
7615 }
7616 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007617 }
7618 catch(std::bad_alloc&)
7619 {
7620 return gl::error(GL_OUT_OF_MEMORY);
7621 }
7622}
7623
7624void __stdcall glUniformMatrix4x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
7625{
7626 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
7627 location, count, transpose, value);
7628
7629 try
7630 {
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00007631 if (count < 0)
7632 {
7633 return gl::error(GL_INVALID_VALUE);
7634 }
7635
7636 if (location == -1)
7637 {
7638 return;
7639 }
7640
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007641 gl::Context *context = gl::getNonLostContext();
7642
7643 if (context)
7644 {
7645 if (context->getClientVersion() < 3)
7646 {
7647 return gl::error(GL_INVALID_OPERATION);
7648 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007649
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00007650 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
7651 if (!programBinary)
7652 {
7653 return gl::error(GL_INVALID_OPERATION);
7654 }
7655
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00007656 if (!programBinary->setUniformMatrix4x2fv(location, count, transpose, value))
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00007657 {
7658 return gl::error(GL_INVALID_OPERATION);
7659 }
7660 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007661 }
7662 catch(std::bad_alloc&)
7663 {
7664 return gl::error(GL_OUT_OF_MEMORY);
7665 }
7666}
7667
7668void __stdcall glUniformMatrix3x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
7669{
7670 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
7671 location, count, transpose, value);
7672
7673 try
7674 {
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00007675 if (count < 0)
7676 {
7677 return gl::error(GL_INVALID_VALUE);
7678 }
7679
7680 if (location == -1)
7681 {
7682 return;
7683 }
7684
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007685 gl::Context *context = gl::getNonLostContext();
7686
7687 if (context)
7688 {
7689 if (context->getClientVersion() < 3)
7690 {
7691 return gl::error(GL_INVALID_OPERATION);
7692 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007693
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00007694 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
7695 if (!programBinary)
7696 {
7697 return gl::error(GL_INVALID_OPERATION);
7698 }
7699
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00007700 if (!programBinary->setUniformMatrix3x4fv(location, count, transpose, value))
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00007701 {
7702 return gl::error(GL_INVALID_OPERATION);
7703 }
7704 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007705 }
7706 catch(std::bad_alloc&)
7707 {
7708 return gl::error(GL_OUT_OF_MEMORY);
7709 }
7710}
7711
7712void __stdcall glUniformMatrix4x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
7713{
7714 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
7715 location, count, transpose, value);
7716
7717 try
7718 {
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00007719 if (count < 0)
7720 {
7721 return gl::error(GL_INVALID_VALUE);
7722 }
7723
7724 if (location == -1)
7725 {
7726 return;
7727 }
7728
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007729 gl::Context *context = gl::getNonLostContext();
7730
7731 if (context)
7732 {
7733 if (context->getClientVersion() < 3)
7734 {
7735 return gl::error(GL_INVALID_OPERATION);
7736 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007737
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00007738 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
7739 if (!programBinary)
7740 {
7741 return gl::error(GL_INVALID_OPERATION);
7742 }
7743
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00007744 if (!programBinary->setUniformMatrix4x3fv(location, count, transpose, value))
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00007745 {
7746 return gl::error(GL_INVALID_OPERATION);
7747 }
7748 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007749 }
7750 catch(std::bad_alloc&)
7751 {
7752 return gl::error(GL_OUT_OF_MEMORY);
7753 }
7754}
7755
7756void __stdcall glBlitFramebuffer(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter)
7757{
7758 EVENT("(GLint srcX0 = %d, GLint srcY0 = %d, GLint srcX1 = %d, GLint srcY1 = %d, GLint dstX0 = %d, "
7759 "GLint dstY0 = %d, GLint dstX1 = %d, GLint dstY1 = %d, GLbitfield mask = 0x%X, GLenum filter = 0x%X)",
7760 srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter);
7761
7762 try
7763 {
7764 gl::Context *context = gl::getNonLostContext();
7765
7766 if (context)
7767 {
7768 if (context->getClientVersion() < 3)
7769 {
7770 return gl::error(GL_INVALID_OPERATION);
7771 }
7772 }
7773
7774 UNIMPLEMENTED();
7775 }
7776 catch(std::bad_alloc&)
7777 {
7778 return gl::error(GL_OUT_OF_MEMORY);
7779 }
7780}
7781
7782void __stdcall glRenderbufferStorageMultisample(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height)
7783{
7784 EVENT("(GLenum target = 0x%X, GLsizei samples = %d, GLenum internalformat = 0x%X, GLsizei width = %d, GLsizei height = %d)",
7785 target, samples, internalformat, width, height);
7786
7787 try
7788 {
7789 gl::Context *context = gl::getNonLostContext();
7790
7791 if (context)
7792 {
7793 if (context->getClientVersion() < 3)
7794 {
7795 return gl::error(GL_INVALID_OPERATION);
7796 }
7797 }
7798
7799 UNIMPLEMENTED();
7800 }
7801 catch(std::bad_alloc&)
7802 {
7803 return gl::error(GL_OUT_OF_MEMORY);
7804 }
7805}
7806
7807void __stdcall glFramebufferTextureLayer(GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer)
7808{
7809 EVENT("(GLenum target = 0x%X, GLenum attachment = 0x%X, GLuint texture = %u, GLint level = %d, GLint layer = %d)",
7810 target, attachment, texture, level, layer);
7811
7812 try
7813 {
7814 gl::Context *context = gl::getNonLostContext();
7815
7816 if (context)
7817 {
7818 if (context->getClientVersion() < 3)
7819 {
7820 return gl::error(GL_INVALID_OPERATION);
7821 }
7822 }
7823
7824 UNIMPLEMENTED();
7825 }
7826 catch(std::bad_alloc&)
7827 {
7828 return gl::error(GL_OUT_OF_MEMORY);
7829 }
7830}
7831
7832GLvoid* __stdcall glMapBufferRange(GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access)
7833{
7834 EVENT("(GLenum target = 0x%X, GLintptr offset = %d, GLsizeiptr length = %d, GLbitfield access = 0x%X)",
7835 target, offset, length, access);
7836
7837 try
7838 {
7839 gl::Context *context = gl::getNonLostContext();
7840
7841 if (context)
7842 {
7843 if (context->getClientVersion() < 3)
7844 {
7845 return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLvoid*>(NULL));
7846 }
7847 }
7848
7849 UNIMPLEMENTED();
7850 }
7851 catch(std::bad_alloc&)
7852 {
7853 return gl::error(GL_OUT_OF_MEMORY, reinterpret_cast<GLvoid*>(NULL));
7854 }
7855
7856 return NULL;
7857}
7858
7859void __stdcall glFlushMappedBufferRange(GLenum target, GLintptr offset, GLsizeiptr length)
7860{
7861 EVENT("(GLenum target = 0x%X, GLintptr offset = %d, GLsizeiptr length = %d)", target, offset, length);
7862
7863 try
7864 {
7865 gl::Context *context = gl::getNonLostContext();
7866
7867 if (context)
7868 {
7869 if (context->getClientVersion() < 3)
7870 {
7871 return gl::error(GL_INVALID_OPERATION);
7872 }
7873 }
7874
7875 UNIMPLEMENTED();
7876 }
7877 catch(std::bad_alloc&)
7878 {
7879 return gl::error(GL_OUT_OF_MEMORY);
7880 }
7881}
7882
7883void __stdcall glBindVertexArray(GLuint array)
7884{
7885 EVENT("(GLuint array = %u)", array);
7886
7887 try
7888 {
7889 gl::Context *context = gl::getNonLostContext();
7890
7891 if (context)
7892 {
7893 if (context->getClientVersion() < 3)
7894 {
7895 return gl::error(GL_INVALID_OPERATION);
7896 }
7897 }
7898
7899 UNIMPLEMENTED();
7900 }
7901 catch(std::bad_alloc&)
7902 {
7903 return gl::error(GL_OUT_OF_MEMORY);
7904 }
7905}
7906
7907void __stdcall glDeleteVertexArrays(GLsizei n, const GLuint* arrays)
7908{
7909 EVENT("(GLsizei n = %d, const GLuint* arrays = 0x%0.8p)", n, arrays);
7910
7911 try
7912 {
7913 gl::Context *context = gl::getNonLostContext();
7914
7915 if (context)
7916 {
7917 if (context->getClientVersion() < 3)
7918 {
7919 return gl::error(GL_INVALID_OPERATION);
7920 }
7921 }
7922
7923 UNIMPLEMENTED();
7924 }
7925 catch(std::bad_alloc&)
7926 {
7927 return gl::error(GL_OUT_OF_MEMORY);
7928 }
7929}
7930
7931void __stdcall glGenVertexArrays(GLsizei n, GLuint* arrays)
7932{
7933 EVENT("(GLsizei n = %d, GLuint* arrays = 0x%0.8p)", n, arrays);
7934
7935 try
7936 {
7937 gl::Context *context = gl::getNonLostContext();
7938
7939 if (context)
7940 {
7941 if (context->getClientVersion() < 3)
7942 {
7943 return gl::error(GL_INVALID_OPERATION);
7944 }
7945 }
7946
7947 UNIMPLEMENTED();
7948 }
7949 catch(std::bad_alloc&)
7950 {
7951 return gl::error(GL_OUT_OF_MEMORY);
7952 }
7953}
7954
7955GLboolean __stdcall glIsVertexArray(GLuint array)
7956{
7957 EVENT("(GLuint array = %u)", array);
7958
7959 try
7960 {
7961 gl::Context *context = gl::getNonLostContext();
7962
7963 if (context)
7964 {
7965 if (context->getClientVersion() < 3)
7966 {
7967 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
7968 }
7969 }
7970
7971 UNIMPLEMENTED();
7972 }
7973 catch(std::bad_alloc&)
7974 {
7975 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
7976 }
7977
7978 return GL_FALSE;
7979}
7980
7981void __stdcall glGetIntegeri_v(GLenum target, GLuint index, GLint* data)
7982{
7983 EVENT("(GLenum target = 0x%X, GLuint index = %u, GLint* data = 0x%0.8p)",
7984 target, index, data);
7985
7986 try
7987 {
7988 gl::Context *context = gl::getNonLostContext();
7989
7990 if (context)
7991 {
7992 if (context->getClientVersion() < 3)
7993 {
7994 return gl::error(GL_INVALID_OPERATION);
7995 }
7996 }
7997
7998 UNIMPLEMENTED();
7999 }
8000 catch(std::bad_alloc&)
8001 {
8002 return gl::error(GL_OUT_OF_MEMORY);
8003 }
8004}
8005
8006void __stdcall glBeginTransformFeedback(GLenum primitiveMode)
8007{
8008 EVENT("(GLenum primitiveMode = 0x%X)", primitiveMode);
8009
8010 try
8011 {
8012 gl::Context *context = gl::getNonLostContext();
8013
8014 if (context)
8015 {
8016 if (context->getClientVersion() < 3)
8017 {
8018 return gl::error(GL_INVALID_OPERATION);
8019 }
8020 }
8021
8022 UNIMPLEMENTED();
8023 }
8024 catch(std::bad_alloc&)
8025 {
8026 return gl::error(GL_OUT_OF_MEMORY);
8027 }
8028}
8029
8030void __stdcall glEndTransformFeedback(void)
8031{
8032 EVENT("(void)");
8033
8034 try
8035 {
8036 gl::Context *context = gl::getNonLostContext();
8037
8038 if (context)
8039 {
8040 if (context->getClientVersion() < 3)
8041 {
8042 return gl::error(GL_INVALID_OPERATION);
8043 }
8044 }
8045
8046 UNIMPLEMENTED();
8047 }
8048 catch(std::bad_alloc&)
8049 {
8050 return gl::error(GL_OUT_OF_MEMORY);
8051 }
8052}
8053
8054void __stdcall glBindBufferRange(GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size)
8055{
8056 EVENT("(GLenum target = 0x%X, GLuint index = %u, GLuint buffer = %u, GLintptr offset = %d, GLsizeiptr size = %d)",
8057 target, index, buffer, offset, size);
8058
8059 try
8060 {
8061 gl::Context *context = gl::getNonLostContext();
8062
8063 if (context)
8064 {
8065 if (context->getClientVersion() < 3)
8066 {
8067 return gl::error(GL_INVALID_OPERATION);
8068 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008069
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00008070 switch (target)
8071 {
8072 case GL_TRANSFORM_FEEDBACK_BUFFER:
8073 if (index > context->getMaxTransformFeedbackBufferBindings())
8074 {
8075 return gl::error(GL_INVALID_VALUE);
8076 }
8077 break;
8078
8079 case GL_UNIFORM_BUFFER:
8080 if (index >= context->getMaximumCombinedUniformBufferBindings())
8081 {
8082 return gl::error(GL_INVALID_VALUE);
8083 }
8084 break;
8085
8086 default:
8087 return gl::error(GL_INVALID_ENUM);
8088 }
8089
8090 gl::Buffer *bufferObject = context->getBuffer(buffer);
8091 if (!bufferObject)
8092 {
8093 // Buffer index must not have been valid
8094 return gl::error(GL_INVALID_VALUE);
8095 }
8096
8097 if (size <= 0 || static_cast<unsigned int>(offset + size) > bufferObject->size())
8098 {
8099 return gl::error(GL_INVALID_VALUE);
8100 }
8101
8102 switch (target)
8103 {
8104 case GL_TRANSFORM_FEEDBACK_BUFFER:
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +00008105 context->bindIndexedTransformFeedbackBuffer(buffer, index, offset, size);
8106 context->bindGenericTransformFeedbackBuffer(buffer);
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00008107 break;
8108
8109 case GL_UNIFORM_BUFFER:
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +00008110 context->bindIndexedUniformBuffer(buffer, index, offset, size);
8111 context->bindGenericUniformBuffer(buffer);
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00008112 break;
8113
8114 default:
8115 UNREACHABLE();
8116 }
8117 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008118 }
8119 catch(std::bad_alloc&)
8120 {
8121 return gl::error(GL_OUT_OF_MEMORY);
8122 }
8123}
8124
8125void __stdcall glBindBufferBase(GLenum target, GLuint index, GLuint buffer)
8126{
8127 EVENT("(GLenum target = 0x%X, GLuint index = %u, GLuint buffer = %u)",
8128 target, index, buffer);
8129
8130 try
8131 {
8132 gl::Context *context = gl::getNonLostContext();
8133
8134 if (context)
8135 {
8136 if (context->getClientVersion() < 3)
8137 {
8138 return gl::error(GL_INVALID_OPERATION);
8139 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008140
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00008141 switch (target)
8142 {
8143 case GL_TRANSFORM_FEEDBACK_BUFFER:
8144 if (index > context->getMaxTransformFeedbackBufferBindings())
8145 {
8146 return gl::error(GL_INVALID_VALUE);
8147 }
8148 break;
8149
8150 case GL_UNIFORM_BUFFER:
8151 if (index > context->getMaximumCombinedUniformBufferBindings())
8152 {
8153 return gl::error(GL_INVALID_VALUE);
8154 }
8155 break;
8156
8157 default:
8158 return gl::error(GL_INVALID_ENUM);
8159 }
8160
8161 gl::Buffer *bufferObject = context->getBuffer(buffer);
8162 if (!bufferObject)
8163 {
8164 // Buffer index must not have been valid
8165 return gl::error(GL_INVALID_VALUE);
8166 }
8167
8168 switch (target)
8169 {
8170 case GL_TRANSFORM_FEEDBACK_BUFFER:
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +00008171 context->bindIndexedTransformFeedbackBuffer(buffer, index, 0, -1);
8172 context->bindGenericTransformFeedbackBuffer(buffer);
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00008173 break;
8174
8175 case GL_UNIFORM_BUFFER:
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +00008176 context->bindIndexedUniformBuffer(buffer, index, 0, -1);
8177 context->bindGenericUniformBuffer(buffer);
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00008178 break;
8179
8180 default:
8181 UNREACHABLE();
8182 }
8183 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008184 }
8185 catch(std::bad_alloc&)
8186 {
8187 return gl::error(GL_OUT_OF_MEMORY);
8188 }
8189}
8190
8191void __stdcall glTransformFeedbackVaryings(GLuint program, GLsizei count, const GLchar* const* varyings, GLenum bufferMode)
8192{
8193 EVENT("(GLuint program = %u, GLsizei count = %d, const GLchar* const* varyings = 0x%0.8p, GLenum bufferMode = 0x%X)",
8194 program, count, varyings, bufferMode);
8195
8196 try
8197 {
8198 gl::Context *context = gl::getNonLostContext();
8199
8200 if (context)
8201 {
8202 if (context->getClientVersion() < 3)
8203 {
8204 return gl::error(GL_INVALID_OPERATION);
8205 }
8206 }
8207
8208 UNIMPLEMENTED();
8209 }
8210 catch(std::bad_alloc&)
8211 {
8212 return gl::error(GL_OUT_OF_MEMORY);
8213 }
8214}
8215
8216void __stdcall glGetTransformFeedbackVarying(GLuint program, GLuint index, GLsizei bufSize, GLsizei* length, GLsizei* size, GLenum* type, GLchar* name)
8217{
8218 EVENT("(GLuint program = %u, GLuint index = %u, GLsizei bufSize = %d, GLsizei* length = 0x%0.8p, "
8219 "GLsizei* size = 0x%0.8p, GLenum* type = 0x%0.8p, GLchar* name = 0x%0.8p)",
8220 program, index, bufSize, length, size, type, name);
8221
8222 try
8223 {
8224 gl::Context *context = gl::getNonLostContext();
8225
8226 if (context)
8227 {
8228 if (context->getClientVersion() < 3)
8229 {
8230 return gl::error(GL_INVALID_OPERATION);
8231 }
8232 }
8233
8234 UNIMPLEMENTED();
8235 }
8236 catch(std::bad_alloc&)
8237 {
8238 return gl::error(GL_OUT_OF_MEMORY);
8239 }
8240}
8241
8242void __stdcall glVertexAttribIPointer(GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid* pointer)
8243{
8244 EVENT("(GLuint index = %u, GLint size = %d, GLenum type = 0x%X, GLsizei stride = %d, const GLvoid* pointer = 0x%0.8p)",
8245 index, size, type, stride, pointer);
8246
8247 try
8248 {
8249 gl::Context *context = gl::getNonLostContext();
8250
8251 if (context)
8252 {
8253 if (context->getClientVersion() < 3)
8254 {
8255 return gl::error(GL_INVALID_OPERATION);
8256 }
8257 }
8258
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00008259 if (index >= gl::MAX_VERTEX_ATTRIBS)
8260 {
8261 return gl::error(GL_INVALID_VALUE);
8262 }
8263
8264 if (size < 1 || size > 4)
8265 {
8266 return gl::error(GL_INVALID_VALUE);
8267 }
8268
8269 switch (type)
8270 {
8271 case GL_BYTE:
8272 case GL_UNSIGNED_BYTE:
8273 case GL_SHORT:
8274 case GL_UNSIGNED_SHORT:
8275 case GL_INT:
8276 case GL_UNSIGNED_INT:
shannon.woods%transgaming.com@gtempaccount.com1ab57be2013-04-13 03:38:39 +00008277 case GL_INT_2_10_10_10_REV:
8278 case GL_UNSIGNED_INT_2_10_10_10_REV:
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00008279 break;
8280 default:
8281 return gl::error(GL_INVALID_ENUM);
8282 }
8283
8284 if (stride < 0)
8285 {
8286 return gl::error(GL_INVALID_VALUE);
8287 }
8288
shannon.woods%transgaming.com@gtempaccount.com1ab57be2013-04-13 03:38:39 +00008289 if ((type == GL_INT_2_10_10_10_REV || type == GL_UNSIGNED_INT_2_10_10_10_REV) && size != 4)
8290 {
8291 return gl::error(GL_INVALID_OPERATION);
8292 }
8293
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00008294 if (context)
8295 {
8296 context->setVertexAttribState(index, context->getArrayBuffer(), size, type, false, true,
8297 stride, pointer);
8298 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008299 }
8300 catch(std::bad_alloc&)
8301 {
8302 return gl::error(GL_OUT_OF_MEMORY);
8303 }
8304}
8305
8306void __stdcall glGetVertexAttribIiv(GLuint index, GLenum pname, GLint* params)
8307{
8308 EVENT("(GLuint index = %u, GLenum pname = 0x%X, GLint* params = 0x%0.8p)",
8309 index, pname, params);
8310
8311 try
8312 {
8313 gl::Context *context = gl::getNonLostContext();
8314
8315 if (context)
8316 {
8317 if (context->getClientVersion() < 3)
8318 {
8319 return gl::error(GL_INVALID_OPERATION);
8320 }
8321 }
8322
8323 UNIMPLEMENTED();
8324 }
8325 catch(std::bad_alloc&)
8326 {
8327 return gl::error(GL_OUT_OF_MEMORY);
8328 }
8329}
8330
8331void __stdcall glGetVertexAttribIuiv(GLuint index, GLenum pname, GLuint* params)
8332{
8333 EVENT("(GLuint index = %u, GLenum pname = 0x%X, GLuint* params = 0x%0.8p)",
8334 index, pname, params);
8335
8336 try
8337 {
8338 gl::Context *context = gl::getNonLostContext();
8339
8340 if (context)
8341 {
8342 if (context->getClientVersion() < 3)
8343 {
8344 return gl::error(GL_INVALID_OPERATION);
8345 }
8346 }
8347
8348 UNIMPLEMENTED();
8349 }
8350 catch(std::bad_alloc&)
8351 {
8352 return gl::error(GL_OUT_OF_MEMORY);
8353 }
8354}
8355
8356void __stdcall glVertexAttribI4i(GLuint index, GLint x, GLint y, GLint z, GLint w)
8357{
8358 EVENT("(GLuint index = %u, GLint x = %d, GLint y = %d, GLint z = %d, GLint w = %d)",
8359 index, x, y, z, w);
8360
8361 try
8362 {
8363 gl::Context *context = gl::getNonLostContext();
8364
8365 if (context)
8366 {
8367 if (context->getClientVersion() < 3)
8368 {
8369 return gl::error(GL_INVALID_OPERATION);
8370 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008371
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00008372 if (index >= gl::MAX_VERTEX_ATTRIBS)
8373 {
8374 return gl::error(GL_INVALID_VALUE);
8375 }
8376
8377 GLint vals[4] = { x, y, z, w };
8378 context->setVertexAttribi(index, vals);
8379 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008380 }
8381 catch(std::bad_alloc&)
8382 {
8383 return gl::error(GL_OUT_OF_MEMORY);
8384 }
8385}
8386
8387void __stdcall glVertexAttribI4ui(GLuint index, GLuint x, GLuint y, GLuint z, GLuint w)
8388{
8389 EVENT("(GLuint index = %u, GLuint x = %u, GLuint y = %u, GLuint z = %u, GLuint w = %u)",
8390 index, x, y, z, w);
8391
8392 try
8393 {
8394 gl::Context *context = gl::getNonLostContext();
8395
8396 if (context)
8397 {
8398 if (context->getClientVersion() < 3)
8399 {
8400 return gl::error(GL_INVALID_OPERATION);
8401 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008402
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00008403 if (index >= gl::MAX_VERTEX_ATTRIBS)
8404 {
8405 return gl::error(GL_INVALID_VALUE);
8406 }
8407
8408 GLuint vals[4] = { x, y, z, w };
8409 context->setVertexAttribu(index, vals);
8410 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008411 }
8412 catch(std::bad_alloc&)
8413 {
8414 return gl::error(GL_OUT_OF_MEMORY);
8415 }
8416}
8417
8418void __stdcall glVertexAttribI4iv(GLuint index, const GLint* v)
8419{
8420 EVENT("(GLuint index = %u, const GLint* v = 0x%0.8p)", index, v);
8421
8422 try
8423 {
8424 gl::Context *context = gl::getNonLostContext();
8425
8426 if (context)
8427 {
8428 if (context->getClientVersion() < 3)
8429 {
8430 return gl::error(GL_INVALID_OPERATION);
8431 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008432
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00008433 if (index >= gl::MAX_VERTEX_ATTRIBS)
8434 {
8435 return gl::error(GL_INVALID_VALUE);
8436 }
8437
8438 context->setVertexAttribi(index, v);
8439 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008440 }
8441 catch(std::bad_alloc&)
8442 {
8443 return gl::error(GL_OUT_OF_MEMORY);
8444 }
8445}
8446
8447void __stdcall glVertexAttribI4uiv(GLuint index, const GLuint* v)
8448{
8449 EVENT("(GLuint index = %u, const GLuint* v = 0x%0.8p)", index, v);
8450
8451 try
8452 {
8453 gl::Context *context = gl::getNonLostContext();
8454
8455 if (context)
8456 {
8457 if (context->getClientVersion() < 3)
8458 {
8459 return gl::error(GL_INVALID_OPERATION);
8460 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008461
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00008462 if (index >= gl::MAX_VERTEX_ATTRIBS)
8463 {
8464 return gl::error(GL_INVALID_VALUE);
8465 }
8466
8467 context->setVertexAttribu(index, v);
8468 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008469 }
8470 catch(std::bad_alloc&)
8471 {
8472 return gl::error(GL_OUT_OF_MEMORY);
8473 }
8474}
8475
8476void __stdcall glGetUniformuiv(GLuint program, GLint location, GLuint* params)
8477{
8478 EVENT("(GLuint program = %u, GLint location = %d, GLuint* params = 0x%0.8p)",
8479 program, location, params);
8480
8481 try
8482 {
8483 gl::Context *context = gl::getNonLostContext();
8484
8485 if (context)
8486 {
8487 if (context->getClientVersion() < 3)
8488 {
8489 return gl::error(GL_INVALID_OPERATION);
8490 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008491
shannon.woods%transgaming.com@gtempaccount.come2290122013-04-13 03:41:07 +00008492 if (program == 0)
8493 {
8494 return gl::error(GL_INVALID_VALUE);
8495 }
8496
8497 gl::Program *programObject = context->getProgram(program);
8498
8499 if (!programObject || !programObject->isLinked())
8500 {
8501 return gl::error(GL_INVALID_OPERATION);
8502 }
8503
8504 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
8505 if (!programBinary)
8506 {
8507 return gl::error(GL_INVALID_OPERATION);
8508 }
8509
8510 if (!programBinary->getUniformuiv(location, NULL, params))
8511 {
8512 return gl::error(GL_INVALID_OPERATION);
8513 }
8514 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008515 }
8516 catch(std::bad_alloc&)
8517 {
8518 return gl::error(GL_OUT_OF_MEMORY);
8519 }
8520}
8521
8522GLint __stdcall glGetFragDataLocation(GLuint program, const GLchar *name)
8523{
8524 EVENT("(GLuint program = %u, const GLchar *name = 0x%0.8p)",
8525 program, name);
8526
8527 try
8528 {
8529 gl::Context *context = gl::getNonLostContext();
8530
8531 if (context)
8532 {
8533 if (context->getClientVersion() < 3)
8534 {
8535 return gl::error(GL_INVALID_OPERATION, 0);
8536 }
8537 }
8538
8539 UNIMPLEMENTED();
8540 }
8541 catch(std::bad_alloc&)
8542 {
8543 return gl::error(GL_OUT_OF_MEMORY, 0);
8544 }
8545
8546 return 0;
8547}
8548
8549void __stdcall glUniform1ui(GLint location, GLuint v0)
8550{
shannon.woods%transgaming.com@gtempaccount.com8431b9c2013-04-13 03:40:17 +00008551 glUniform1uiv(location, 1, &v0);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008552}
8553
8554void __stdcall glUniform2ui(GLint location, GLuint v0, GLuint v1)
8555{
shannon.woods%transgaming.com@gtempaccount.com8431b9c2013-04-13 03:40:17 +00008556 const GLuint xy[] = { v0, v1 };
8557 glUniform2uiv(location, 1, xy);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008558}
8559
8560void __stdcall glUniform3ui(GLint location, GLuint v0, GLuint v1, GLuint v2)
8561{
shannon.woods%transgaming.com@gtempaccount.com8431b9c2013-04-13 03:40:17 +00008562 const GLuint xyz[] = { v0, v1, v2 };
8563 glUniform3uiv(location, 1, xyz);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008564}
8565
8566void __stdcall glUniform4ui(GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3)
8567{
shannon.woods%transgaming.com@gtempaccount.com8431b9c2013-04-13 03:40:17 +00008568 const GLuint xyzw[] = { v0, v1, v2, v3 };
8569 glUniform4uiv(location, 1, xyzw);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008570}
8571
8572void __stdcall glUniform1uiv(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->setUniform1uiv(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 glUniform2uiv(GLint location, GLsizei count, const GLuint* value)
8607{
8608 EVENT("(GLint location = %d, GLsizei count = %d, const GLuint* value = 0x%0.8p)",
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->setUniform2uiv(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 glUniform3uiv(GLint location, GLsizei count, const GLuint* value)
8641{
8642 EVENT("(GLint location = %d, GLsizei count = %d, const GLuint* value)",
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->setUniform3uiv(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 glUniform4uiv(GLint location, GLsizei count, const GLuint* value)
8675{
8676 EVENT("(GLint location = %d, GLsizei count = %d, const GLuint* value = 0x%0.8p)",
8677 location, count, 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 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008689
shannon.woods%transgaming.com@gtempaccount.com50ea4ab2013-04-13 03:40:36 +00008690 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
8691 if (!programBinary)
8692 {
8693 return gl::error(GL_INVALID_OPERATION);
8694 }
8695
8696 if (!programBinary->setUniform4uiv(location, count, value))
8697 {
8698 return gl::error(GL_INVALID_OPERATION);
8699 }
8700 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008701 }
8702 catch(std::bad_alloc&)
8703 {
8704 return gl::error(GL_OUT_OF_MEMORY);
8705 }
8706}
8707
8708void __stdcall glClearBufferiv(GLenum buffer, GLint drawbuffer, const GLint* value)
8709{
8710 EVENT("(GLenum buffer = 0x%X, GLint drawbuffer = %d, const GLint* value = 0x%0.8p)",
8711 buffer, drawbuffer, value);
8712
8713 try
8714 {
8715 gl::Context *context = gl::getNonLostContext();
8716
8717 if (context)
8718 {
8719 if (context->getClientVersion() < 3)
8720 {
8721 return gl::error(GL_INVALID_OPERATION);
8722 }
8723 }
8724
8725 UNIMPLEMENTED();
8726 }
8727 catch(std::bad_alloc&)
8728 {
8729 return gl::error(GL_OUT_OF_MEMORY);
8730 }
8731}
8732
8733void __stdcall glClearBufferuiv(GLenum buffer, GLint drawbuffer, const GLuint* value)
8734{
8735 EVENT("(GLenum buffer = 0x%X, GLint drawbuffer = %d, const GLuint* value = 0x%0.8p)",
8736 buffer, drawbuffer, value);
8737
8738 try
8739 {
8740 gl::Context *context = gl::getNonLostContext();
8741
8742 if (context)
8743 {
8744 if (context->getClientVersion() < 3)
8745 {
8746 return gl::error(GL_INVALID_OPERATION);
8747 }
8748 }
8749
8750 UNIMPLEMENTED();
8751 }
8752 catch(std::bad_alloc&)
8753 {
8754 return gl::error(GL_OUT_OF_MEMORY);
8755 }
8756}
8757
8758void __stdcall glClearBufferfv(GLenum buffer, GLint drawbuffer, const GLfloat* value)
8759{
8760 EVENT("(GLenum buffer = 0x%X, GLint drawbuffer = %d, const GLfloat* value = 0x%0.8p)",
8761 buffer, drawbuffer, value);
8762
8763 try
8764 {
8765 gl::Context *context = gl::getNonLostContext();
8766
8767 if (context)
8768 {
8769 if (context->getClientVersion() < 3)
8770 {
8771 return gl::error(GL_INVALID_OPERATION);
8772 }
8773 }
8774
8775 UNIMPLEMENTED();
8776 }
8777 catch(std::bad_alloc&)
8778 {
8779 return gl::error(GL_OUT_OF_MEMORY);
8780 }
8781}
8782
8783void __stdcall glClearBufferfi(GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil)
8784{
8785 EVENT("(GLenum buffer = 0x%X, GLint drawbuffer = %d, GLfloat depth, GLint stencil = %d)",
8786 buffer, drawbuffer, depth, stencil);
8787
8788 try
8789 {
8790 gl::Context *context = gl::getNonLostContext();
8791
8792 if (context)
8793 {
8794 if (context->getClientVersion() < 3)
8795 {
8796 return gl::error(GL_INVALID_OPERATION);
8797 }
8798 }
8799
8800 UNIMPLEMENTED();
8801 }
8802 catch(std::bad_alloc&)
8803 {
8804 return gl::error(GL_OUT_OF_MEMORY);
8805 }
8806}
8807
8808const GLubyte* __stdcall glGetStringi(GLenum name, GLuint index)
8809{
8810 EVENT("(GLenum name = 0x%X, GLuint index = %u)", name, index);
8811
8812 try
8813 {
8814 gl::Context *context = gl::getNonLostContext();
8815
8816 if (context)
8817 {
8818 if (context->getClientVersion() < 3)
8819 {
8820 return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLubyte*>(NULL));
8821 }
8822 }
8823
8824 UNIMPLEMENTED();
8825 }
8826 catch(std::bad_alloc&)
8827 {
8828 return gl::error(GL_OUT_OF_MEMORY, reinterpret_cast<GLubyte*>(NULL));
8829 }
8830
8831 return NULL;
8832}
8833
8834void __stdcall glCopyBufferSubData(GLenum readTarget, GLenum writeTarget, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size)
8835{
8836 EVENT("(GLenum readTarget = 0x%X, GLenum writeTarget = 0x%X, GLintptr readOffset = %d, GLintptr writeOffset = %d, GLsizeiptr size = %d)",
8837 readTarget, writeTarget, readOffset, writeOffset, size);
8838
8839 try
8840 {
8841 gl::Context *context = gl::getNonLostContext();
8842
8843 if (context)
8844 {
8845 if (context->getClientVersion() < 3)
8846 {
8847 return gl::error(GL_INVALID_OPERATION);
8848 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008849
shannon.woods%transgaming.com@gtempaccount.com296c3f22013-04-13 03:39:39 +00008850 gl::Buffer *readBuffer = NULL;
8851 switch (readTarget)
8852 {
8853 case GL_ARRAY_BUFFER:
8854 readBuffer = context->getArrayBuffer();
8855 break;
8856 case GL_COPY_READ_BUFFER:
8857 readBuffer = context->getCopyReadBuffer();
8858 break;
8859 case GL_COPY_WRITE_BUFFER:
8860 readBuffer = context->getCopyWriteBuffer();
8861 break;
8862 case GL_ELEMENT_ARRAY_BUFFER:
8863 readBuffer = context->getElementArrayBuffer();
8864 break;
8865 case GL_PIXEL_PACK_BUFFER:
8866 readBuffer = context->getPixelPackBuffer();
8867 break;
8868 case GL_PIXEL_UNPACK_BUFFER:
8869 readBuffer = context->getPixelUnpackBuffer();
8870 break;
8871 case GL_TRANSFORM_FEEDBACK_BUFFER:
8872 readBuffer = context->getGenericTransformFeedbackBuffer();
8873 break;
8874 case GL_UNIFORM_BUFFER:
8875 readBuffer = context->getGenericUniformBuffer();
8876 break;
8877 default:
8878 return gl::error(GL_INVALID_ENUM);
8879 }
8880
8881 gl::Buffer *writeBuffer = NULL;
8882 switch (writeTarget)
8883 {
8884 case GL_ARRAY_BUFFER:
8885 writeBuffer = context->getArrayBuffer();
8886 break;
8887 case GL_COPY_READ_BUFFER:
8888 writeBuffer = context->getCopyReadBuffer();
8889 break;
8890 case GL_COPY_WRITE_BUFFER:
8891 writeBuffer = context->getCopyWriteBuffer();
8892 break;
8893 case GL_ELEMENT_ARRAY_BUFFER:
8894 writeBuffer = context->getElementArrayBuffer();
8895 break;
8896 case GL_PIXEL_PACK_BUFFER:
8897 writeBuffer = context->getPixelPackBuffer();
8898 break;
8899 case GL_PIXEL_UNPACK_BUFFER:
8900 writeBuffer = context->getPixelUnpackBuffer();
8901 break;
8902 case GL_TRANSFORM_FEEDBACK_BUFFER:
8903 writeBuffer = context->getGenericTransformFeedbackBuffer();
8904 break;
8905 case GL_UNIFORM_BUFFER:
8906 writeBuffer = context->getGenericUniformBuffer();
8907 break;
8908 default:
8909 return gl::error(GL_INVALID_ENUM);
8910 }
8911
8912 if (!readBuffer || !writeBuffer)
8913 {
8914 return gl::error(GL_INVALID_OPERATION);
8915 }
8916
8917 if (readOffset < 0 || writeOffset < 0 || size < 0 ||
8918 static_cast<unsigned int>(readOffset + size) > readBuffer->size() ||
8919 static_cast<unsigned int>(writeOffset + size) > writeBuffer->size())
8920 {
8921 return gl::error(GL_INVALID_VALUE);
8922 }
8923
8924 if (readBuffer == writeBuffer && abs(readOffset - writeOffset) < size)
8925 {
8926 return gl::error(GL_INVALID_VALUE);
8927 }
8928
8929 // TODO: Verify that readBuffer and writeBuffer are not currently mapped (GL_INVALID_OPERATION)
8930
shannon.woods%transgaming.com@gtempaccount.comc53376a2013-04-13 03:41:23 +00008931 // if size is zero, the copy is a successful no-op
8932 if (size > 0)
8933 {
8934 writeBuffer->copyBufferSubData(readBuffer, readOffset, writeOffset, size);
8935 }
shannon.woods%transgaming.com@gtempaccount.com296c3f22013-04-13 03:39:39 +00008936 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008937 }
8938 catch(std::bad_alloc&)
8939 {
8940 return gl::error(GL_OUT_OF_MEMORY);
8941 }
8942}
8943
8944void __stdcall glGetUniformIndices(GLuint program, GLsizei uniformCount, const GLchar* const* uniformNames, GLuint* uniformIndices)
8945{
8946 EVENT("(GLuint program = %u, GLsizei uniformCount = %d, const GLchar* const* uniformNames = 0x%0.8p, GLuint* uniformIndices = 0x%0.8p)",
8947 program, uniformCount, uniformNames, uniformIndices);
8948
8949 try
8950 {
8951 gl::Context *context = gl::getNonLostContext();
8952
8953 if (context)
8954 {
8955 if (context->getClientVersion() < 3)
8956 {
8957 return gl::error(GL_INVALID_OPERATION);
8958 }
8959 }
8960
8961 UNIMPLEMENTED();
8962 }
8963 catch(std::bad_alloc&)
8964 {
8965 return gl::error(GL_OUT_OF_MEMORY);
8966 }
8967}
8968
8969void __stdcall glGetActiveUniformsiv(GLuint program, GLsizei uniformCount, const GLuint* uniformIndices, GLenum pname, GLint* params)
8970{
8971 EVENT("(GLuint program = %u, GLsizei uniformCount = %d, const GLuint* uniformIndices = 0x%0.8p, GLenum pname = 0x%X, GLint* params = 0x%0.8p)",
8972 program, uniformCount, uniformIndices, pname, params);
8973
8974 try
8975 {
8976 gl::Context *context = gl::getNonLostContext();
8977
8978 if (context)
8979 {
8980 if (context->getClientVersion() < 3)
8981 {
8982 return gl::error(GL_INVALID_OPERATION);
8983 }
8984 }
8985
8986 UNIMPLEMENTED();
8987 }
8988 catch(std::bad_alloc&)
8989 {
8990 return gl::error(GL_OUT_OF_MEMORY);
8991 }
8992}
8993
8994GLuint __stdcall glGetUniformBlockIndex(GLuint program, const GLchar* uniformBlockName)
8995{
8996 EVENT("(GLuint program = %u, const GLchar* uniformBlockName = 0x%0.8p)", program, uniformBlockName);
8997
8998 try
8999 {
9000 gl::Context *context = gl::getNonLostContext();
9001
9002 if (context)
9003 {
9004 if (context->getClientVersion() < 3)
9005 {
9006 return gl::error(GL_INVALID_OPERATION, 0);
9007 }
9008 }
9009
9010 UNIMPLEMENTED();
9011 }
9012 catch(std::bad_alloc&)
9013 {
9014 return gl::error(GL_OUT_OF_MEMORY, 0);
9015 }
9016
9017 return 0;
9018}
9019
9020void __stdcall glGetActiveUniformBlockiv(GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint* params)
9021{
9022 EVENT("(GLuint program = %u, GLuint uniformBlockIndex = %u, GLenum pname = 0x%X, GLint* params = 0x%0.8p)",
9023 program, uniformBlockIndex, pname, params);
9024
9025 try
9026 {
9027 gl::Context *context = gl::getNonLostContext();
9028
9029 if (context)
9030 {
9031 if (context->getClientVersion() < 3)
9032 {
9033 return gl::error(GL_INVALID_OPERATION);
9034 }
9035 }
9036
9037 UNIMPLEMENTED();
9038 }
9039 catch(std::bad_alloc&)
9040 {
9041 return gl::error(GL_OUT_OF_MEMORY);
9042 }
9043}
9044
9045void __stdcall glGetActiveUniformBlockName(GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei* length, GLchar* uniformBlockName)
9046{
9047 EVENT("(GLuint program = %u, GLuint uniformBlockIndex = %u, GLsizei bufSize = %d, GLsizei* length = 0x%0.8p, GLchar* uniformBlockName = 0x%0.8p)",
9048 program, uniformBlockIndex, bufSize, length, uniformBlockName);
9049
9050 try
9051 {
9052 gl::Context *context = gl::getNonLostContext();
9053
9054 if (context)
9055 {
9056 if (context->getClientVersion() < 3)
9057 {
9058 return gl::error(GL_INVALID_OPERATION);
9059 }
9060 }
9061
9062 UNIMPLEMENTED();
9063 }
9064 catch(std::bad_alloc&)
9065 {
9066 return gl::error(GL_OUT_OF_MEMORY);
9067 }
9068}
9069
9070void __stdcall glUniformBlockBinding(GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding)
9071{
9072 EVENT("(GLuint program = %u, GLuint uniformBlockIndex = %u, GLuint uniformBlockBinding = %u)",
9073 program, uniformBlockIndex, uniformBlockBinding);
9074
9075 try
9076 {
9077 gl::Context *context = gl::getNonLostContext();
9078
9079 if (context)
9080 {
9081 if (context->getClientVersion() < 3)
9082 {
9083 return gl::error(GL_INVALID_OPERATION);
9084 }
9085 }
9086
9087 UNIMPLEMENTED();
9088 }
9089 catch(std::bad_alloc&)
9090 {
9091 return gl::error(GL_OUT_OF_MEMORY);
9092 }
9093}
9094
9095void __stdcall glDrawArraysInstanced(GLenum mode, GLint first, GLsizei count, GLsizei instanceCount)
9096{
9097 EVENT("(GLenum mode = 0x%X, GLint first = %d, GLsizei count = %d, GLsizei instanceCount = %d)",
9098 mode, first, count, instanceCount);
9099
9100 try
9101 {
9102 gl::Context *context = gl::getNonLostContext();
9103
9104 if (context)
9105 {
9106 if (context->getClientVersion() < 3)
9107 {
9108 return gl::error(GL_INVALID_OPERATION);
9109 }
9110 }
9111
9112 UNIMPLEMENTED();
9113 }
9114 catch(std::bad_alloc&)
9115 {
9116 return gl::error(GL_OUT_OF_MEMORY);
9117 }
9118}
9119
9120void __stdcall glDrawElementsInstanced(GLenum mode, GLsizei count, GLenum type, const GLvoid* indices, GLsizei instanceCount)
9121{
9122 EVENT("(GLenum mode = 0x%X, GLsizei count = %d, GLenum type = 0x%X, const GLvoid* indices = 0x%0.8p, GLsizei instanceCount = %d)",
9123 mode, count, type, indices, instanceCount);
9124
9125 try
9126 {
9127 gl::Context *context = gl::getNonLostContext();
9128
9129 if (context)
9130 {
9131 if (context->getClientVersion() < 3)
9132 {
9133 return gl::error(GL_INVALID_OPERATION);
9134 }
9135 }
9136
9137 UNIMPLEMENTED();
9138 }
9139 catch(std::bad_alloc&)
9140 {
9141 return gl::error(GL_OUT_OF_MEMORY);
9142 }
9143}
9144
9145GLsync __stdcall glFenceSync(GLenum condition, GLbitfield flags)
9146{
9147 EVENT("(GLenum condition = 0x%X, GLbitfield flags = 0x%X)", condition, flags);
9148
9149 try
9150 {
9151 gl::Context *context = gl::getNonLostContext();
9152
9153 if (context)
9154 {
9155 if (context->getClientVersion() < 3)
9156 {
9157 return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLsync>(NULL));
9158 }
9159 }
9160
9161 UNIMPLEMENTED();
9162 }
9163 catch(std::bad_alloc&)
9164 {
9165 return gl::error(GL_OUT_OF_MEMORY, reinterpret_cast<GLsync>(NULL));
9166 }
9167
9168 return NULL;
9169}
9170
9171GLboolean __stdcall glIsSync(GLsync sync)
9172{
9173 EVENT("(GLsync sync = 0x%0.8p)", sync);
9174
9175 try
9176 {
9177 gl::Context *context = gl::getNonLostContext();
9178
9179 if (context)
9180 {
9181 if (context->getClientVersion() < 3)
9182 {
9183 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
9184 }
9185 }
9186
9187 UNIMPLEMENTED();
9188 }
9189 catch(std::bad_alloc&)
9190 {
9191 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
9192 }
9193
9194 return GL_FALSE;
9195}
9196
9197void __stdcall glDeleteSync(GLsync sync)
9198{
9199 EVENT("(GLsync sync = 0x%0.8p)", sync);
9200
9201 try
9202 {
9203 gl::Context *context = gl::getNonLostContext();
9204
9205 if (context)
9206 {
9207 if (context->getClientVersion() < 3)
9208 {
9209 return gl::error(GL_INVALID_OPERATION);
9210 }
9211 }
9212
9213 UNIMPLEMENTED();
9214 }
9215 catch(std::bad_alloc&)
9216 {
9217 return gl::error(GL_OUT_OF_MEMORY);
9218 }
9219}
9220
9221GLenum __stdcall glClientWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout)
9222{
9223 EVENT("(GLsync sync = 0x%0.8p, GLbitfield flags = 0x%X, GLuint64 timeout = %llu)",
9224 sync, flags, timeout);
9225
9226 try
9227 {
9228 gl::Context *context = gl::getNonLostContext();
9229
9230 if (context)
9231 {
9232 if (context->getClientVersion() < 3)
9233 {
9234 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
9235 }
9236 }
9237
9238 UNIMPLEMENTED();
9239 }
9240 catch(std::bad_alloc&)
9241 {
9242 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
9243 }
9244
9245 return GL_FALSE;
9246}
9247
9248void __stdcall glWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout)
9249{
9250 EVENT("(GLsync sync = 0x%0.8p, GLbitfield flags = 0x%X, GLuint64 timeout = %llu)",
9251 sync, flags, timeout);
9252
9253 try
9254 {
9255 gl::Context *context = gl::getNonLostContext();
9256
9257 if (context)
9258 {
9259 if (context->getClientVersion() < 3)
9260 {
9261 return gl::error(GL_INVALID_OPERATION);
9262 }
9263 }
9264
9265 UNIMPLEMENTED();
9266 }
9267 catch(std::bad_alloc&)
9268 {
9269 return gl::error(GL_OUT_OF_MEMORY);
9270 }
9271}
9272
9273void __stdcall glGetInteger64v(GLenum pname, GLint64* params)
9274{
9275 EVENT("(GLenum pname = 0x%X, GLint64* params = 0x%0.8p)",
9276 pname, params);
9277
9278 try
9279 {
9280 gl::Context *context = gl::getNonLostContext();
9281
9282 if (context)
9283 {
9284 if (context->getClientVersion() < 3)
9285 {
9286 return gl::error(GL_INVALID_OPERATION);
9287 }
9288 }
9289
9290 UNIMPLEMENTED();
9291 }
9292 catch(std::bad_alloc&)
9293 {
9294 return gl::error(GL_OUT_OF_MEMORY);
9295 }
9296}
9297
9298void __stdcall glGetSynciv(GLsync sync, GLenum pname, GLsizei bufSize, GLsizei* length, GLint* values)
9299{
9300 EVENT("(GLsync sync = 0x%0.8p, GLenum pname = 0x%X, GLsizei bufSize = %d, GLsizei* length = 0x%0.8p, GLint* values = 0x%0.8p)",
9301 sync, pname, bufSize, length, values);
9302
9303 try
9304 {
9305 gl::Context *context = gl::getNonLostContext();
9306
9307 if (context)
9308 {
9309 if (context->getClientVersion() < 3)
9310 {
9311 return gl::error(GL_INVALID_OPERATION);
9312 }
9313 }
9314
9315 UNIMPLEMENTED();
9316 }
9317 catch(std::bad_alloc&)
9318 {
9319 return gl::error(GL_OUT_OF_MEMORY);
9320 }
9321}
9322
9323void __stdcall glGetInteger64i_v(GLenum target, GLuint index, GLint64* data)
9324{
9325 EVENT("(GLenum target = 0x%X, GLuint index = %u, GLint64* data = 0x%0.8p)",
9326 target, index, data);
9327
9328 try
9329 {
9330 gl::Context *context = gl::getNonLostContext();
9331
9332 if (context)
9333 {
9334 if (context->getClientVersion() < 3)
9335 {
9336 return gl::error(GL_INVALID_OPERATION);
9337 }
9338 }
9339
9340 UNIMPLEMENTED();
9341 }
9342 catch(std::bad_alloc&)
9343 {
9344 return gl::error(GL_OUT_OF_MEMORY);
9345 }
9346}
9347
9348void __stdcall glGetBufferParameteri64v(GLenum target, GLenum pname, GLint64* params)
9349{
9350 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLint64* params = 0x%0.8p)",
9351 target, pname, params);
9352
9353 try
9354 {
9355 gl::Context *context = gl::getNonLostContext();
9356
9357 if (context)
9358 {
9359 if (context->getClientVersion() < 3)
9360 {
9361 return gl::error(GL_INVALID_OPERATION);
9362 }
9363 }
9364
9365 UNIMPLEMENTED();
9366 }
9367 catch(std::bad_alloc&)
9368 {
9369 return gl::error(GL_OUT_OF_MEMORY);
9370 }
9371}
9372
9373void __stdcall glGenSamplers(GLsizei count, GLuint* samplers)
9374{
9375 EVENT("(GLsizei count = %d, GLuint* samplers = 0x%0.8p)", count, samplers);
9376
9377 try
9378 {
9379 gl::Context *context = gl::getNonLostContext();
9380
9381 if (context)
9382 {
9383 if (context->getClientVersion() < 3)
9384 {
9385 return gl::error(GL_INVALID_OPERATION);
9386 }
9387 }
9388
9389 UNIMPLEMENTED();
9390 }
9391 catch(std::bad_alloc&)
9392 {
9393 return gl::error(GL_OUT_OF_MEMORY);
9394 }
9395}
9396
9397void __stdcall glDeleteSamplers(GLsizei count, const GLuint* samplers)
9398{
9399 EVENT("(GLsizei count = %d, const GLuint* samplers = 0x%0.8p)", count, samplers);
9400
9401 try
9402 {
9403 gl::Context *context = gl::getNonLostContext();
9404
9405 if (context)
9406 {
9407 if (context->getClientVersion() < 3)
9408 {
9409 return gl::error(GL_INVALID_OPERATION);
9410 }
9411 }
9412
9413 UNIMPLEMENTED();
9414 }
9415 catch(std::bad_alloc&)
9416 {
9417 return gl::error(GL_OUT_OF_MEMORY);
9418 }
9419}
9420
9421GLboolean __stdcall glIsSampler(GLuint sampler)
9422{
9423 EVENT("(GLuint sampler = %u)", sampler);
9424
9425 try
9426 {
9427 gl::Context *context = gl::getNonLostContext();
9428
9429 if (context)
9430 {
9431 if (context->getClientVersion() < 3)
9432 {
9433 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
9434 }
9435 }
9436
9437 UNIMPLEMENTED();
9438 }
9439 catch(std::bad_alloc&)
9440 {
9441 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
9442 }
9443
9444 return GL_FALSE;
9445}
9446
9447void __stdcall glBindSampler(GLuint unit, GLuint sampler)
9448{
9449 EVENT("(GLuint unit = %u, GLuint sampler = %u)", unit, sampler);
9450
9451 try
9452 {
9453 gl::Context *context = gl::getNonLostContext();
9454
9455 if (context)
9456 {
9457 if (context->getClientVersion() < 3)
9458 {
9459 return gl::error(GL_INVALID_OPERATION);
9460 }
9461 }
9462
9463 UNIMPLEMENTED();
9464 }
9465 catch(std::bad_alloc&)
9466 {
9467 return gl::error(GL_OUT_OF_MEMORY);
9468 }
9469}
9470
9471void __stdcall glSamplerParameteri(GLuint sampler, GLenum pname, GLint param)
9472{
9473 EVENT("(GLuint sampler = %u, GLenum pname = 0x%X, GLint param = %d)", sampler, pname, param);
9474
9475 try
9476 {
9477 gl::Context *context = gl::getNonLostContext();
9478
9479 if (context)
9480 {
9481 if (context->getClientVersion() < 3)
9482 {
9483 return gl::error(GL_INVALID_OPERATION);
9484 }
9485 }
9486
9487 UNIMPLEMENTED();
9488 }
9489 catch(std::bad_alloc&)
9490 {
9491 return gl::error(GL_OUT_OF_MEMORY);
9492 }
9493}
9494
9495void __stdcall glSamplerParameteriv(GLuint sampler, GLenum pname, const GLint* param)
9496{
9497 EVENT("(GLuint sampler = %u, GLenum pname = 0x%X, const GLint* param = 0x%0.8p)",
9498 sampler, pname, param);
9499
9500 try
9501 {
9502 gl::Context *context = gl::getNonLostContext();
9503
9504 if (context)
9505 {
9506 if (context->getClientVersion() < 3)
9507 {
9508 return gl::error(GL_INVALID_OPERATION);
9509 }
9510 }
9511
9512 UNIMPLEMENTED();
9513 }
9514 catch(std::bad_alloc&)
9515 {
9516 return gl::error(GL_OUT_OF_MEMORY);
9517 }
9518}
9519
9520void __stdcall glSamplerParameterf(GLuint sampler, GLenum pname, GLfloat param)
9521{
9522 EVENT("(GLuint sampler = %u, GLenum pname = 0x%X, GLfloat param = %g)", sampler, pname, param);
9523
9524 try
9525 {
9526 gl::Context *context = gl::getNonLostContext();
9527
9528 if (context)
9529 {
9530 if (context->getClientVersion() < 3)
9531 {
9532 return gl::error(GL_INVALID_OPERATION);
9533 }
9534 }
9535
9536 UNIMPLEMENTED();
9537 }
9538 catch(std::bad_alloc&)
9539 {
9540 return gl::error(GL_OUT_OF_MEMORY);
9541 }
9542}
9543
9544void __stdcall glSamplerParameterfv(GLuint sampler, GLenum pname, const GLfloat* param)
9545{
9546 EVENT("(GLuint sampler = %u, GLenum pname = 0x%X, const GLfloat* param = 0x%0.8p)", sampler, pname, param);
9547
9548 try
9549 {
9550 gl::Context *context = gl::getNonLostContext();
9551
9552 if (context)
9553 {
9554 if (context->getClientVersion() < 3)
9555 {
9556 return gl::error(GL_INVALID_OPERATION);
9557 }
9558 }
9559
9560 UNIMPLEMENTED();
9561 }
9562 catch(std::bad_alloc&)
9563 {
9564 return gl::error(GL_OUT_OF_MEMORY);
9565 }
9566}
9567
9568void __stdcall glGetSamplerParameteriv(GLuint sampler, GLenum pname, GLint* params)
9569{
9570 EVENT("(GLuint sampler = %u, GLenum pname = 0x%X, GLint* params = 0x%0.8p)", sampler, pname, params);
9571
9572 try
9573 {
9574 gl::Context *context = gl::getNonLostContext();
9575
9576 if (context)
9577 {
9578 if (context->getClientVersion() < 3)
9579 {
9580 return gl::error(GL_INVALID_OPERATION);
9581 }
9582 }
9583
9584 UNIMPLEMENTED();
9585 }
9586 catch(std::bad_alloc&)
9587 {
9588 return gl::error(GL_OUT_OF_MEMORY);
9589 }
9590}
9591
9592void __stdcall glGetSamplerParameterfv(GLuint sampler, GLenum pname, GLfloat* params)
9593{
9594 EVENT("(GLuint sample = %ur, GLenum pname = 0x%X, GLfloat* params = 0x%0.8p)", sampler, pname, params);
9595
9596 try
9597 {
9598 gl::Context *context = gl::getNonLostContext();
9599
9600 if (context)
9601 {
9602 if (context->getClientVersion() < 3)
9603 {
9604 return gl::error(GL_INVALID_OPERATION);
9605 }
9606 }
9607
9608 UNIMPLEMENTED();
9609 }
9610 catch(std::bad_alloc&)
9611 {
9612 return gl::error(GL_OUT_OF_MEMORY);
9613 }
9614}
9615
9616void __stdcall glVertexAttribDivisor(GLuint index, GLuint divisor)
9617{
9618 EVENT("(GLuint index = %u, GLuint divisor = %u)", index, divisor);
9619
9620 try
9621 {
shannon.woods%transgaming.com@gtempaccount.com8736bd62013-04-13 03:35:41 +00009622 if (index >= gl::MAX_VERTEX_ATTRIBS)
9623 {
9624 return gl::error(GL_INVALID_VALUE);
9625 }
9626
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009627 gl::Context *context = gl::getNonLostContext();
9628
9629 if (context)
9630 {
9631 if (context->getClientVersion() < 3)
9632 {
9633 return gl::error(GL_INVALID_OPERATION);
9634 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009635
shannon.woods%transgaming.com@gtempaccount.com8736bd62013-04-13 03:35:41 +00009636 context->setVertexAttribDivisor(index, divisor);
9637 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009638 }
9639 catch(std::bad_alloc&)
9640 {
9641 return gl::error(GL_OUT_OF_MEMORY);
9642 }
9643}
9644
9645void __stdcall glBindTransformFeedback(GLenum target, GLuint id)
9646{
9647 EVENT("(GLenum target = 0x%X, GLuint id = %u)", target, id);
9648
9649 try
9650 {
9651 gl::Context *context = gl::getNonLostContext();
9652
9653 if (context)
9654 {
9655 if (context->getClientVersion() < 3)
9656 {
9657 return gl::error(GL_INVALID_OPERATION);
9658 }
9659 }
9660
9661 UNIMPLEMENTED();
9662 }
9663 catch(std::bad_alloc&)
9664 {
9665 return gl::error(GL_OUT_OF_MEMORY);
9666 }
9667}
9668
9669void __stdcall glDeleteTransformFeedbacks(GLsizei n, const GLuint* ids)
9670{
9671 EVENT("(GLsizei n = %d, const GLuint* ids = 0x%0.8p)", n, ids);
9672
9673 try
9674 {
9675 gl::Context *context = gl::getNonLostContext();
9676
9677 if (context)
9678 {
9679 if (context->getClientVersion() < 3)
9680 {
9681 return gl::error(GL_INVALID_OPERATION);
9682 }
9683 }
9684
9685 UNIMPLEMENTED();
9686 }
9687 catch(std::bad_alloc&)
9688 {
9689 return gl::error(GL_OUT_OF_MEMORY);
9690 }
9691}
9692
9693void __stdcall glGenTransformFeedbacks(GLsizei n, GLuint* ids)
9694{
9695 EVENT("(GLsizei n = %d, GLuint* ids = 0x%0.8p)", n, ids);
9696
9697 try
9698 {
9699 gl::Context *context = gl::getNonLostContext();
9700
9701 if (context)
9702 {
9703 if (context->getClientVersion() < 3)
9704 {
9705 return gl::error(GL_INVALID_OPERATION);
9706 }
9707 }
9708
9709 UNIMPLEMENTED();
9710 }
9711 catch(std::bad_alloc&)
9712 {
9713 return gl::error(GL_OUT_OF_MEMORY);
9714 }
9715}
9716
9717GLboolean __stdcall glIsTransformFeedback(GLuint id)
9718{
9719 EVENT("(GLuint id = %u)", id);
9720
9721 try
9722 {
9723 gl::Context *context = gl::getNonLostContext();
9724
9725 if (context)
9726 {
9727 if (context->getClientVersion() < 3)
9728 {
9729 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
9730 }
9731 }
9732
9733 UNIMPLEMENTED();
9734 }
9735 catch(std::bad_alloc&)
9736 {
9737 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
9738 }
9739
9740 return GL_FALSE;
9741}
9742
9743void __stdcall glPauseTransformFeedback(void)
9744{
9745 EVENT("(void)");
9746
9747 try
9748 {
9749 gl::Context *context = gl::getNonLostContext();
9750
9751 if (context)
9752 {
9753 if (context->getClientVersion() < 3)
9754 {
9755 return gl::error(GL_INVALID_OPERATION);
9756 }
9757 }
9758
9759 UNIMPLEMENTED();
9760 }
9761 catch(std::bad_alloc&)
9762 {
9763 return gl::error(GL_OUT_OF_MEMORY);
9764 }
9765}
9766
9767void __stdcall glResumeTransformFeedback(void)
9768{
9769 EVENT("(void)");
9770
9771 try
9772 {
9773 gl::Context *context = gl::getNonLostContext();
9774
9775 if (context)
9776 {
9777 if (context->getClientVersion() < 3)
9778 {
9779 return gl::error(GL_INVALID_OPERATION);
9780 }
9781 }
9782
9783 UNIMPLEMENTED();
9784 }
9785 catch(std::bad_alloc&)
9786 {
9787 return gl::error(GL_OUT_OF_MEMORY);
9788 }
9789}
9790
9791void __stdcall glGetProgramBinary(GLuint program, GLsizei bufSize, GLsizei* length, GLenum* binaryFormat, GLvoid* binary)
9792{
9793 EVENT("(GLuint program = %u, GLsizei bufSize = %d, GLsizei* length = 0x%0.8p, GLenum* binaryFormat = 0x%0.8p, GLvoid* binary = 0x%0.8p)",
9794 program, bufSize, length, binaryFormat, binary);
9795
9796 try
9797 {
9798 gl::Context *context = gl::getNonLostContext();
9799
9800 if (context)
9801 {
9802 if (context->getClientVersion() < 3)
9803 {
9804 return gl::error(GL_INVALID_OPERATION);
9805 }
9806 }
9807
9808 UNIMPLEMENTED();
9809 }
9810 catch(std::bad_alloc&)
9811 {
9812 return gl::error(GL_OUT_OF_MEMORY);
9813 }
9814}
9815
9816void __stdcall glProgramBinary(GLuint program, GLenum binaryFormat, const GLvoid* binary, GLsizei length)
9817{
9818 EVENT("(GLuint program = %u, GLenum binaryFormat = 0x%X, const GLvoid* binary = 0x%0.8p, GLsizei length = %d)",
9819 program, binaryFormat, binary, length);
9820
9821 try
9822 {
9823 gl::Context *context = gl::getNonLostContext();
9824
9825 if (context)
9826 {
9827 if (context->getClientVersion() < 3)
9828 {
9829 return gl::error(GL_INVALID_OPERATION);
9830 }
9831 }
9832
9833 UNIMPLEMENTED();
9834 }
9835 catch(std::bad_alloc&)
9836 {
9837 return gl::error(GL_OUT_OF_MEMORY);
9838 }
9839}
9840
9841void __stdcall glProgramParameteri(GLuint program, GLenum pname, GLint value)
9842{
9843 EVENT("(GLuint program = %u, GLenum pname = 0x%X, GLint value = %d)",
9844 program, pname, value);
9845
9846 try
9847 {
9848 gl::Context *context = gl::getNonLostContext();
9849
9850 if (context)
9851 {
9852 if (context->getClientVersion() < 3)
9853 {
9854 return gl::error(GL_INVALID_OPERATION);
9855 }
9856 }
9857
9858 UNIMPLEMENTED();
9859 }
9860 catch(std::bad_alloc&)
9861 {
9862 return gl::error(GL_OUT_OF_MEMORY);
9863 }
9864}
9865
9866void __stdcall glInvalidateFramebuffer(GLenum target, GLsizei numAttachments, const GLenum* attachments)
9867{
9868 EVENT("(GLenum target = 0x%X, GLsizei numAttachments = %d, const GLenum* attachments = 0x%0.8p)",
9869 target, numAttachments, attachments);
9870
9871 try
9872 {
9873 gl::Context *context = gl::getNonLostContext();
9874
9875 if (context)
9876 {
9877 if (context->getClientVersion() < 3)
9878 {
9879 return gl::error(GL_INVALID_OPERATION);
9880 }
9881 }
9882
9883 UNIMPLEMENTED();
9884 }
9885 catch(std::bad_alloc&)
9886 {
9887 return gl::error(GL_OUT_OF_MEMORY);
9888 }
9889}
9890
9891void __stdcall glInvalidateSubFramebuffer(GLenum target, GLsizei numAttachments, const GLenum* attachments, GLint x, GLint y, GLsizei width, GLsizei height)
9892{
9893 EVENT("(GLenum target = 0x%X, GLsizei numAttachments = %d, const GLenum* attachments = 0x%0.8p, GLint x = %d, "
9894 "GLint y = %d, GLsizei width = %d, GLsizei height = %d)",
9895 target, numAttachments, attachments, x, y, width, height);
9896
9897 try
9898 {
9899 gl::Context *context = gl::getNonLostContext();
9900
9901 if (context)
9902 {
9903 if (context->getClientVersion() < 3)
9904 {
9905 return gl::error(GL_INVALID_OPERATION);
9906 }
9907 }
9908
9909 UNIMPLEMENTED();
9910 }
9911 catch(std::bad_alloc&)
9912 {
9913 return gl::error(GL_OUT_OF_MEMORY);
9914 }
9915}
9916
9917void __stdcall glTexStorage2D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height)
9918{
9919 EVENT("(GLenum target = 0x%X, GLsizei levels = %d, GLenum internalformat = 0x%X, GLsizei width = %d, GLsizei height = %d)",
9920 target, levels, internalformat, width, height);
9921
9922 try
9923 {
9924 gl::Context *context = gl::getNonLostContext();
9925
9926 if (context)
9927 {
9928 if (context->getClientVersion() < 3)
9929 {
9930 return gl::error(GL_INVALID_OPERATION);
9931 }
9932 }
9933
9934 UNIMPLEMENTED();
9935 }
9936 catch(std::bad_alloc&)
9937 {
9938 return gl::error(GL_OUT_OF_MEMORY);
9939 }
9940}
9941
9942void __stdcall glTexStorage3D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth)
9943{
9944 EVENT("(GLenum target = 0x%X, GLsizei levels = %d, GLenum internalformat = 0x%X, GLsizei width = %d, "
9945 "GLsizei height = %d, GLsizei depth = %d)",
9946 target, levels, internalformat, width, height, depth);
9947
9948 try
9949 {
9950 gl::Context *context = gl::getNonLostContext();
9951
9952 if (context)
9953 {
9954 if (context->getClientVersion() < 3)
9955 {
9956 return gl::error(GL_INVALID_OPERATION);
9957 }
shannon.woods%transgaming.com@gtempaccount.com14eb55e2013-04-13 03:35:06 +00009958 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009959 }
9960 catch(std::bad_alloc&)
9961 {
9962 return gl::error(GL_OUT_OF_MEMORY);
9963 }
9964}
9965
9966void __stdcall glGetInternalformativ(GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize, GLint* params)
9967{
9968 EVENT("(GLenum target = 0x%X, GLenum internalformat = 0x%X, GLenum pname = 0x%X, GLsizei bufSize = %d, "
9969 "GLint* params = 0x%0.8p)",
9970 target, internalformat, pname, bufSize, params);
9971
9972 try
9973 {
9974 gl::Context *context = gl::getNonLostContext();
9975
9976 if (context)
9977 {
9978 if (context->getClientVersion() < 3)
9979 {
9980 return gl::error(GL_INVALID_OPERATION);
9981 }
9982 }
9983
9984 UNIMPLEMENTED();
9985 }
9986 catch(std::bad_alloc&)
9987 {
9988 return gl::error(GL_OUT_OF_MEMORY);
9989 }
9990}
9991
9992// Extension functions
9993
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +00009994void __stdcall glBlitFramebufferANGLE(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1,
9995 GLbitfield mask, GLenum filter)
9996{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00009997 EVENT("(GLint srcX0 = %d, GLint srcY0 = %d, GLint srcX1 = %d, GLint srcY1 = %d, "
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +00009998 "GLint dstX0 = %d, GLint dstY0 = %d, GLint dstX1 = %d, GLint dstY1 = %d, "
9999 "GLbitfield mask = 0x%X, GLenum filter = 0x%X)",
10000 srcX0, srcY0, srcX1, srcX1, dstX0, dstY0, dstX1, dstY1, mask, filter);
10001
10002 try
10003 {
10004 switch (filter)
10005 {
10006 case GL_NEAREST:
10007 break;
10008 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010009 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +000010010 }
10011
10012 if ((mask & ~(GL_COLOR_BUFFER_BIT | GL_STENCIL_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)) != 0)
10013 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010014 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +000010015 }
10016
10017 if (srcX1 - srcX0 != dstX1 - dstX0 || srcY1 - srcY0 != dstY1 - dstY0)
10018 {
10019 ERR("Scaling and flipping in BlitFramebufferANGLE not supported by this implementation");
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010020 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +000010021 }
10022
daniel@transgaming.com9d788502011-11-09 17:46:55 +000010023 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +000010024
10025 if (context)
10026 {
10027 if (context->getReadFramebufferHandle() == context->getDrawFramebufferHandle())
10028 {
10029 ERR("Blits with the same source and destination framebuffer are not supported by this implementation.");
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010030 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +000010031 }
10032
10033 context->blitFramebuffer(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask);
10034 }
10035 }
10036 catch(std::bad_alloc&)
10037 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010038 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +000010039 }
10040}
10041
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +000010042void __stdcall glTexImage3DOES(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth,
10043 GLint border, GLenum format, GLenum type, const GLvoid* pixels)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000010044{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +000010045 EVENT("(GLenum target = 0x%X, GLint level = %d, GLenum internalformat = 0x%X, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +000010046 "GLsizei width = %d, GLsizei height = %d, GLsizei depth = %d, GLint border = %d, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +000010047 "GLenum format = 0x%X, GLenum type = 0x%x, const GLvoid* pixels = 0x%0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000010048 target, level, internalformat, width, height, depth, border, format, type, pixels);
10049
10050 try
10051 {
10052 UNIMPLEMENTED(); // FIXME
10053 }
10054 catch(std::bad_alloc&)
10055 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010056 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000010057 }
10058}
daniel@transgaming.comce3d0f22010-05-04 03:35:14 +000010059
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010060void __stdcall glGetProgramBinaryOES(GLuint program, GLsizei bufSize, GLsizei *length,
10061 GLenum *binaryFormat, void *binary)
10062{
apatrick@chromium.org90080e32012-07-09 22:15:33 +000010063 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 +000010064 program, bufSize, length, binaryFormat, binary);
10065
10066 try
10067 {
10068 gl::Context *context = gl::getNonLostContext();
10069
10070 if (context)
10071 {
10072 gl::Program *programObject = context->getProgram(program);
10073
daniel@transgaming.com716056c2012-07-24 18:38:59 +000010074 if (!programObject || !programObject->isLinked())
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010075 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010076 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010077 }
10078
10079 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
10080
10081 if (!programBinary)
10082 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010083 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010084 }
10085
apatrick@chromium.org90080e32012-07-09 22:15:33 +000010086 if (!programBinary->save(binary, bufSize, length))
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010087 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010088 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010089 }
apatrick@chromium.org90080e32012-07-09 22:15:33 +000010090
10091 *binaryFormat = GL_PROGRAM_BINARY_ANGLE;
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010092 }
10093 }
10094 catch(std::bad_alloc&)
10095 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010096 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010097 }
10098}
10099
10100void __stdcall glProgramBinaryOES(GLuint program, GLenum binaryFormat,
10101 const void *binary, GLint length)
10102{
10103 EVENT("(GLenum program = 0x%X, binaryFormat = 0x%x, binary = 0x%0.8p, length = %d)",
10104 program, binaryFormat, binary, length);
10105
10106 try
10107 {
10108 gl::Context *context = gl::getNonLostContext();
10109
10110 if (context)
10111 {
10112 if (binaryFormat != GL_PROGRAM_BINARY_ANGLE)
10113 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010114 return gl::error(GL_INVALID_ENUM);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010115 }
10116
10117 gl::Program *programObject = context->getProgram(program);
10118
10119 if (!programObject)
10120 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010121 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010122 }
10123
daniel@transgaming.com95d29422012-07-24 18:36:10 +000010124 context->setProgramBinary(program, binary, length);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010125 }
10126 }
10127 catch(std::bad_alloc&)
10128 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010129 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010130 }
10131}
10132
shannon.woods%transgaming.com@gtempaccount.com4059a382013-04-13 03:31:16 +000010133void __stdcall glDrawBuffersEXT(GLsizei n, const GLenum *bufs)
10134{
10135 EVENT("(GLenum n = %d, bufs = 0x%0.8p)", n, bufs);
10136
10137 try
10138 {
10139 gl::Context *context = gl::getNonLostContext();
10140
10141 if (context)
10142 {
10143 if (n < 0 || (unsigned int)n > context->getMaximumRenderTargets())
10144 {
10145 return gl::error(GL_INVALID_VALUE);
10146 }
10147
10148 if (context->getDrawFramebufferHandle() == 0)
10149 {
shannon.woods%transgaming.com@gtempaccount.com2fa73c52013-04-13 03:37:20 +000010150 if (n != 1)
shannon.woods%transgaming.com@gtempaccount.com4059a382013-04-13 03:31:16 +000010151 {
10152 return gl::error(GL_INVALID_OPERATION);
10153 }
10154
shannon.woods%transgaming.com@gtempaccount.com2fa73c52013-04-13 03:37:20 +000010155 if (bufs[0] != GL_NONE && bufs[0] != GL_BACK)
shannon.woods%transgaming.com@gtempaccount.com4059a382013-04-13 03:31:16 +000010156 {
shannon.woods%transgaming.com@gtempaccount.com2fa73c52013-04-13 03:37:20 +000010157 return gl::error(GL_INVALID_OPERATION);
shannon.woods%transgaming.com@gtempaccount.com4059a382013-04-13 03:31:16 +000010158 }
10159 }
10160 else
10161 {
10162 for (int colorAttachment = 0; colorAttachment < n; colorAttachment++)
10163 {
10164 const GLenum attachment = GL_COLOR_ATTACHMENT0_EXT + colorAttachment;
10165 if (bufs[colorAttachment] != GL_NONE && bufs[colorAttachment] != attachment)
10166 {
10167 return gl::error(GL_INVALID_OPERATION);
10168 }
10169 }
10170 }
10171
10172 gl::Framebuffer *framebuffer = context->getDrawFramebuffer();
10173
10174 for (int colorAttachment = 0; colorAttachment < n; colorAttachment++)
10175 {
10176 framebuffer->setDrawBufferState(colorAttachment, bufs[colorAttachment]);
10177 }
shannon.woods%transgaming.com@gtempaccount.com2fa73c52013-04-13 03:37:20 +000010178
10179 for (int colorAttachment = n; colorAttachment < (int)context->getMaximumRenderTargets(); colorAttachment++)
10180 {
10181 framebuffer->setDrawBufferState(colorAttachment, GL_NONE);
10182 }
shannon.woods%transgaming.com@gtempaccount.com4059a382013-04-13 03:31:16 +000010183 }
10184 }
10185 catch (std::bad_alloc&)
10186 {
10187 return gl::error(GL_OUT_OF_MEMORY);
10188 }
10189}
10190
daniel@transgaming.comce3d0f22010-05-04 03:35:14 +000010191__eglMustCastToProperFunctionPointerType __stdcall glGetProcAddress(const char *procname)
10192{
10193 struct Extension
10194 {
10195 const char *name;
10196 __eglMustCastToProperFunctionPointerType address;
10197 };
10198
10199 static const Extension glExtensions[] =
10200 {
10201 {"glTexImage3DOES", (__eglMustCastToProperFunctionPointerType)glTexImage3DOES},
daniel@transgaming.com01868132010-08-24 19:21:17 +000010202 {"glBlitFramebufferANGLE", (__eglMustCastToProperFunctionPointerType)glBlitFramebufferANGLE},
daniel@transgaming.com1fe96c92011-01-14 15:08:44 +000010203 {"glRenderbufferStorageMultisampleANGLE", (__eglMustCastToProperFunctionPointerType)glRenderbufferStorageMultisampleANGLE},
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +000010204 {"glDeleteFencesNV", (__eglMustCastToProperFunctionPointerType)glDeleteFencesNV},
10205 {"glGenFencesNV", (__eglMustCastToProperFunctionPointerType)glGenFencesNV},
10206 {"glIsFenceNV", (__eglMustCastToProperFunctionPointerType)glIsFenceNV},
10207 {"glTestFenceNV", (__eglMustCastToProperFunctionPointerType)glTestFenceNV},
10208 {"glGetFenceivNV", (__eglMustCastToProperFunctionPointerType)glGetFenceivNV},
10209 {"glFinishFenceNV", (__eglMustCastToProperFunctionPointerType)glFinishFenceNV},
10210 {"glSetFenceNV", (__eglMustCastToProperFunctionPointerType)glSetFenceNV},
zmo@google.coma574f782011-10-03 21:45:23 +000010211 {"glGetTranslatedShaderSourceANGLE", (__eglMustCastToProperFunctionPointerType)glGetTranslatedShaderSourceANGLE},
daniel@transgaming.com0bd1f2f2011-11-11 04:19:03 +000010212 {"glTexStorage2DEXT", (__eglMustCastToProperFunctionPointerType)glTexStorage2DEXT},
daniel@transgaming.com709ed112011-11-12 03:18:10 +000010213 {"glGetGraphicsResetStatusEXT", (__eglMustCastToProperFunctionPointerType)glGetGraphicsResetStatusEXT},
10214 {"glReadnPixelsEXT", (__eglMustCastToProperFunctionPointerType)glReadnPixelsEXT},
10215 {"glGetnUniformfvEXT", (__eglMustCastToProperFunctionPointerType)glGetnUniformfvEXT},
10216 {"glGetnUniformivEXT", (__eglMustCastToProperFunctionPointerType)glGetnUniformivEXT},
daniel@transgaming.com86bdb822012-01-20 18:24:39 +000010217 {"glGenQueriesEXT", (__eglMustCastToProperFunctionPointerType)glGenQueriesEXT},
10218 {"glDeleteQueriesEXT", (__eglMustCastToProperFunctionPointerType)glDeleteQueriesEXT},
10219 {"glIsQueryEXT", (__eglMustCastToProperFunctionPointerType)glIsQueryEXT},
10220 {"glBeginQueryEXT", (__eglMustCastToProperFunctionPointerType)glBeginQueryEXT},
10221 {"glEndQueryEXT", (__eglMustCastToProperFunctionPointerType)glEndQueryEXT},
10222 {"glGetQueryivEXT", (__eglMustCastToProperFunctionPointerType)glGetQueryivEXT},
10223 {"glGetQueryObjectuivEXT", (__eglMustCastToProperFunctionPointerType)glGetQueryObjectuivEXT},
shannon.woods%transgaming.com@gtempaccount.com77d94722013-04-13 03:34:22 +000010224 {"glDrawBuffersEXT", (__eglMustCastToProperFunctionPointerType)glDrawBuffersEXT},
daniel@transgaming.comdce02fd2012-01-27 15:39:51 +000010225 {"glVertexAttribDivisorANGLE", (__eglMustCastToProperFunctionPointerType)glVertexAttribDivisorANGLE},
10226 {"glDrawArraysInstancedANGLE", (__eglMustCastToProperFunctionPointerType)glDrawArraysInstancedANGLE},
10227 {"glDrawElementsInstancedANGLE", (__eglMustCastToProperFunctionPointerType)glDrawElementsInstancedANGLE},
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010228 {"glGetProgramBinaryOES", (__eglMustCastToProperFunctionPointerType)glGetProgramBinaryOES},
10229 {"glProgramBinaryOES", (__eglMustCastToProperFunctionPointerType)glProgramBinaryOES}, };
daniel@transgaming.comce3d0f22010-05-04 03:35:14 +000010230
shannon.woods@transgaming.comd438fd42013-02-28 23:17:45 +000010231 for (unsigned int ext = 0; ext < ArraySize(glExtensions); ext++)
daniel@transgaming.comce3d0f22010-05-04 03:35:14 +000010232 {
10233 if (strcmp(procname, glExtensions[ext].name) == 0)
10234 {
10235 return (__eglMustCastToProperFunctionPointerType)glExtensions[ext].address;
10236 }
10237 }
10238
10239 return NULL;
10240}
10241
daniel@transgaming.com17f548c2011-11-09 17:47:02 +000010242// Non-public functions used by EGL
10243
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +000010244bool __stdcall glBindTexImage(egl::Surface *surface)
jbauman@chromium.orgae345802011-03-30 22:04:25 +000010245{
10246 EVENT("(egl::Surface* surface = 0x%0.8p)",
10247 surface);
10248
10249 try
10250 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +000010251 gl::Context *context = gl::getNonLostContext();
jbauman@chromium.orgae345802011-03-30 22:04:25 +000010252
10253 if (context)
10254 {
10255 gl::Texture2D *textureObject = context->getTexture2D();
10256
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +000010257 if (textureObject->isImmutable())
10258 {
10259 return false;
10260 }
10261
jbauman@chromium.orgae345802011-03-30 22:04:25 +000010262 if (textureObject)
10263 {
10264 textureObject->bindTexImage(surface);
10265 }
10266 }
10267 }
10268 catch(std::bad_alloc&)
10269 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010270 return gl::error(GL_OUT_OF_MEMORY, false);
jbauman@chromium.orgae345802011-03-30 22:04:25 +000010271 }
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +000010272
10273 return true;
jbauman@chromium.orgae345802011-03-30 22:04:25 +000010274}
10275
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000010276}