blob: 2ff868948cb887e8aa7d7a7b97c6766576083498 [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
shannon.woods%transgaming.com@gtempaccount.com6d73c4e2013-04-13 03:45:12 +000024bool validImageSize(GLint level, GLsizei width, GLsizei height, GLsizei depth)
daniel@transgaming.com4f9ef0d2011-05-30 23:51:19 +000025{
shannon.woods%transgaming.com@gtempaccount.com6d73c4e2013-04-13 03:45:12 +000026 if (level < 0 || width < 0 || height < 0 || depth < 0)
daniel@transgaming.com4f9ef0d2011-05-30 23:51:19 +000027 {
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
shannon.woods%transgaming.com@gtempaccount.com6d73c4e2013-04-13 03:45:12 +000041 if (gl::isPow2(width) && gl::isPow2(height) && gl::isPow2(depth))
daniel@transgaming.com4f9ef0d2011-05-30 23:51:19 +000042 {
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
shannon.woods%transgaming.com@gtempaccount.com6d73c4e2013-04-13 03:45:12 +0000225bool validateSubImageParams3D(bool compressed, GLsizei width, GLsizei height, GLsizei depth,
226 GLint xoffset, GLint yoffset,GLint zoffset, GLint level, GLenum format, GLenum type,
227 gl::Texture3D *texture)
228{
229 if (!texture)
230 {
231 return gl::error(GL_INVALID_OPERATION, false);
232 }
233
234 if (compressed != texture->isCompressed(level))
235 {
236 return gl::error(GL_INVALID_OPERATION, false);
237 }
238
239 if (format != GL_NONE)
240 {
241 GLenum internalformat = gl::ConvertSizedInternalFormat(format, type);
242 if (internalformat != texture->getInternalFormat(level))
243 {
244 return gl::error(GL_INVALID_OPERATION, false);
245 }
246 }
247
248 if (compressed)
249 {
250 if ((width % 4 != 0 && width != texture->getWidth(0)) ||
251 (height % 4 != 0 && height != texture->getHeight(0)))
252 {
253 return gl::error(GL_INVALID_OPERATION, false);
254 }
255 }
256
257 if (xoffset + width > texture->getWidth(level) ||
258 yoffset + height > texture->getHeight(level) ||
259 zoffset + depth > texture->getDepth(level))
260 {
261 return gl::error(GL_INVALID_VALUE, false);
262 }
263
264 return true;
265}
266
daniel@transgaming.comb7915a52011-11-12 03:14:20 +0000267// check for combinations of format and type that are valid for ReadPixels
268bool validReadFormatType(GLenum format, GLenum type)
269{
270 switch (format)
271 {
272 case GL_RGBA:
273 switch (type)
274 {
275 case GL_UNSIGNED_BYTE:
276 break;
277 default:
278 return false;
279 }
280 break;
281 case GL_BGRA_EXT:
282 switch (type)
283 {
284 case GL_UNSIGNED_BYTE:
285 case GL_UNSIGNED_SHORT_4_4_4_4_REV_EXT:
286 case GL_UNSIGNED_SHORT_1_5_5_5_REV_EXT:
287 break;
288 default:
289 return false;
290 }
291 break;
daniel@transgaming.comb7915a52011-11-12 03:14:20 +0000292 default:
293 return false;
294 }
295 return true;
296}
297
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000298extern "C"
299{
300
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +0000301// OpenGL ES 2.0 functions
302
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000303void __stdcall glActiveTexture(GLenum texture)
304{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000305 EVENT("(GLenum texture = 0x%X)", texture);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000306
307 try
308 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000309 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000310
311 if (context)
312 {
daniel@transgaming.com3f74c7a2011-05-11 15:36:51 +0000313 if (texture < GL_TEXTURE0 || texture > GL_TEXTURE0 + context->getMaximumCombinedTextureImageUnits() - 1)
314 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000315 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com3f74c7a2011-05-11 15:36:51 +0000316 }
317
daniel@transgaming.com428d1582010-05-04 03:35:25 +0000318 context->setActiveSampler(texture - GL_TEXTURE0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000319 }
320 }
321 catch(std::bad_alloc&)
322 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000323 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000324 }
325}
326
327void __stdcall glAttachShader(GLuint program, GLuint shader)
328{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000329 EVENT("(GLuint program = %d, GLuint shader = %d)", program, shader);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000330
331 try
332 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000333 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000334
335 if (context)
336 {
337 gl::Program *programObject = context->getProgram(program);
338 gl::Shader *shaderObject = context->getShader(shader);
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +0000339
daniel@transgaming.come9d6ed02010-04-13 03:26:23 +0000340 if (!programObject)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000341 {
daniel@transgaming.come9d6ed02010-04-13 03:26:23 +0000342 if (context->getShader(program))
343 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000344 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.come9d6ed02010-04-13 03:26:23 +0000345 }
346 else
347 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000348 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.come9d6ed02010-04-13 03:26:23 +0000349 }
350 }
351
352 if (!shaderObject)
353 {
354 if (context->getProgram(shader))
355 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000356 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.come9d6ed02010-04-13 03:26:23 +0000357 }
358 else
359 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000360 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.come9d6ed02010-04-13 03:26:23 +0000361 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000362 }
363
364 if (!programObject->attachShader(shaderObject))
365 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000366 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000367 }
368 }
369 }
370 catch(std::bad_alloc&)
371 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000372 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000373 }
374}
375
daniel@transgaming.com86bdb822012-01-20 18:24:39 +0000376void __stdcall glBeginQueryEXT(GLenum target, GLuint id)
377{
378 EVENT("(GLenum target = 0x%X, GLuint %d)", target, id);
379
380 try
381 {
382 switch (target)
383 {
384 case GL_ANY_SAMPLES_PASSED_EXT:
385 case GL_ANY_SAMPLES_PASSED_CONSERVATIVE_EXT:
386 break;
387 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000388 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +0000389 }
390
391 if (id == 0)
392 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000393 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +0000394 }
395
396 gl::Context *context = gl::getNonLostContext();
397
398 if (context)
399 {
400 context->beginQuery(target, id);
401 }
402 }
403 catch(std::bad_alloc&)
404 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000405 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +0000406 }
407}
408
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +0000409void __stdcall glBindAttribLocation(GLuint program, GLuint index, const GLchar* name)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000410{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000411 EVENT("(GLuint program = %d, GLuint index = %d, const GLchar* name = 0x%0.8p)", program, index, name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000412
413 try
414 {
415 if (index >= gl::MAX_VERTEX_ATTRIBS)
416 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000417 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000418 }
419
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000420 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000421
422 if (context)
423 {
424 gl::Program *programObject = context->getProgram(program);
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +0000425
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000426 if (!programObject)
427 {
daniel@transgaming.com98079832010-04-13 03:26:29 +0000428 if (context->getShader(program))
429 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000430 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com98079832010-04-13 03:26:29 +0000431 }
432 else
433 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000434 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com98079832010-04-13 03:26:29 +0000435 }
436 }
437
438 if (strncmp(name, "gl_", 3) == 0)
439 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000440 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000441 }
442
443 programObject->bindAttributeLocation(index, name);
444 }
445 }
446 catch(std::bad_alloc&)
447 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000448 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000449 }
450}
451
452void __stdcall glBindBuffer(GLenum target, GLuint buffer)
453{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000454 EVENT("(GLenum target = 0x%X, GLuint buffer = %d)", target, buffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000455
456 try
457 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000458 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000459
460 if (context)
461 {
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +0000462 // Check ES3 specific targets
463 switch (target)
464 {
shannon.woods%transgaming.com@gtempaccount.com51171882013-04-13 03:39:10 +0000465 case GL_COPY_READ_BUFFER:
466 case GL_COPY_WRITE_BUFFER:
shannon.woods%transgaming.com@gtempaccount.comc926e5f2013-04-13 03:39:18 +0000467 case GL_PIXEL_PACK_BUFFER:
468 case GL_PIXEL_UNPACK_BUFFER:
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +0000469 case GL_UNIFORM_BUFFER:
470 case GL_TRANSFORM_FEEDBACK_BUFFER:
471 if (context->getClientVersion() < 3)
472 {
473 return gl::error(GL_INVALID_ENUM);
474 }
475 }
476
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000477 switch (target)
478 {
479 case GL_ARRAY_BUFFER:
480 context->bindArrayBuffer(buffer);
481 return;
482 case GL_ELEMENT_ARRAY_BUFFER:
483 context->bindElementArrayBuffer(buffer);
484 return;
shannon.woods%transgaming.com@gtempaccount.com51171882013-04-13 03:39:10 +0000485 case GL_COPY_READ_BUFFER:
486 context->bindCopyReadBuffer(buffer);
487 return;
488 case GL_COPY_WRITE_BUFFER:
489 context->bindCopyWriteBuffer(buffer);
490 return;
shannon.woods%transgaming.com@gtempaccount.comc926e5f2013-04-13 03:39:18 +0000491 case GL_PIXEL_PACK_BUFFER:
492 context->bindPixelPackBuffer(buffer);
493 return;
494 case GL_PIXEL_UNPACK_BUFFER:
495 context->bindPixelUnpackBuffer(buffer);
496 return;
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +0000497 case GL_UNIFORM_BUFFER:
498 context->bindGenericUniformBuffer(buffer);
499 return;
500 case GL_TRANSFORM_FEEDBACK_BUFFER:
501 context->bindGenericUniformBuffer(buffer);
502 return;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000503 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000504 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000505 }
506 }
507 }
508 catch(std::bad_alloc&)
509 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000510 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000511 }
512}
513
514void __stdcall glBindFramebuffer(GLenum target, GLuint framebuffer)
515{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000516 EVENT("(GLenum target = 0x%X, GLuint framebuffer = %d)", target, framebuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000517
518 try
519 {
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +0000520 if (target != GL_FRAMEBUFFER && target != GL_DRAW_FRAMEBUFFER_ANGLE && target != GL_READ_FRAMEBUFFER_ANGLE)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000521 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000522 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000523 }
524
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000525 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000526
527 if (context)
528 {
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +0000529 if (target == GL_READ_FRAMEBUFFER_ANGLE || target == GL_FRAMEBUFFER)
530 {
531 context->bindReadFramebuffer(framebuffer);
532 }
533
534 if (target == GL_DRAW_FRAMEBUFFER_ANGLE || target == GL_FRAMEBUFFER)
535 {
536 context->bindDrawFramebuffer(framebuffer);
537 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000538 }
539 }
540 catch(std::bad_alloc&)
541 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000542 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000543 }
544}
545
546void __stdcall glBindRenderbuffer(GLenum target, GLuint renderbuffer)
547{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000548 EVENT("(GLenum target = 0x%X, GLuint renderbuffer = %d)", target, renderbuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000549
550 try
551 {
552 if (target != GL_RENDERBUFFER)
553 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000554 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000555 }
556
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000557 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000558
559 if (context)
560 {
561 context->bindRenderbuffer(renderbuffer);
562 }
563 }
564 catch(std::bad_alloc&)
565 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000566 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000567 }
568}
569
570void __stdcall glBindTexture(GLenum target, GLuint texture)
571{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000572 EVENT("(GLenum target = 0x%X, GLuint texture = %d)", target, texture);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000573
574 try
575 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000576 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000577
578 if (context)
579 {
580 gl::Texture *textureObject = context->getTexture(texture);
581
582 if (textureObject && textureObject->getTarget() != target && texture != 0)
583 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000584 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000585 }
586
587 switch (target)
588 {
589 case GL_TEXTURE_2D:
590 context->bindTexture2D(texture);
591 return;
592 case GL_TEXTURE_CUBE_MAP:
593 context->bindTextureCubeMap(texture);
594 return;
shannon.woods%transgaming.com@gtempaccount.comc416e1c2013-04-13 03:45:05 +0000595 case GL_TEXTURE_3D:
596 if (context->getClientVersion() < 3)
597 {
598 return gl::error(GL_INVALID_ENUM);
599 }
600 context->bindTexture3D(texture);
601 return;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000602 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000603 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000604 }
605 }
606 }
607 catch(std::bad_alloc&)
608 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000609 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000610 }
611}
612
613void __stdcall glBlendColor(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha)
614{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000615 EVENT("(GLclampf red = %f, GLclampf green = %f, GLclampf blue = %f, GLclampf alpha = %f)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +0000616 red, green, blue, alpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000617
618 try
619 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000620 gl::Context* context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000621
622 if (context)
623 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +0000624 context->setBlendColor(gl::clamp01(red), gl::clamp01(green), gl::clamp01(blue), gl::clamp01(alpha));
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000625 }
626 }
627 catch(std::bad_alloc&)
628 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000629 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000630 }
631}
632
633void __stdcall glBlendEquation(GLenum mode)
634{
635 glBlendEquationSeparate(mode, mode);
636}
637
638void __stdcall glBlendEquationSeparate(GLenum modeRGB, GLenum modeAlpha)
639{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000640 EVENT("(GLenum modeRGB = 0x%X, GLenum modeAlpha = 0x%X)", modeRGB, modeAlpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000641
642 try
643 {
shannon.woods%transgaming.com@gtempaccount.com00b6a0e2013-04-13 03:38:00 +0000644 gl::Context *context = gl::getNonLostContext();
645
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000646 switch (modeRGB)
647 {
648 case GL_FUNC_ADD:
649 case GL_FUNC_SUBTRACT:
650 case GL_FUNC_REVERSE_SUBTRACT:
651 break;
shannon.woods%transgaming.com@gtempaccount.com00b6a0e2013-04-13 03:38:00 +0000652
653 case GL_MIN:
654 case GL_MAX:
655 if (context && context->getClientVersion() < 3)
656 {
657 return gl::error(GL_INVALID_ENUM);
658 }
659 break;
660
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000661 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000662 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000663 }
664
665 switch (modeAlpha)
666 {
667 case GL_FUNC_ADD:
668 case GL_FUNC_SUBTRACT:
669 case GL_FUNC_REVERSE_SUBTRACT:
670 break;
shannon.woods%transgaming.com@gtempaccount.com00b6a0e2013-04-13 03:38:00 +0000671
672 case GL_MIN:
673 case GL_MAX:
674 if (context && context->getClientVersion() < 3)
675 {
676 return gl::error(GL_INVALID_ENUM);
677 }
678 break;
679
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000680 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000681 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000682 }
683
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000684 if (context)
685 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +0000686 context->setBlendEquation(modeRGB, modeAlpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000687 }
688 }
689 catch(std::bad_alloc&)
690 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000691 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000692 }
693}
694
695void __stdcall glBlendFunc(GLenum sfactor, GLenum dfactor)
696{
697 glBlendFuncSeparate(sfactor, dfactor, sfactor, dfactor);
698}
699
700void __stdcall glBlendFuncSeparate(GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha)
701{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000702 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 +0000703 srcRGB, dstRGB, srcAlpha, dstAlpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000704
705 try
706 {
707 switch (srcRGB)
708 {
709 case GL_ZERO:
710 case GL_ONE:
711 case GL_SRC_COLOR:
712 case GL_ONE_MINUS_SRC_COLOR:
713 case GL_DST_COLOR:
714 case GL_ONE_MINUS_DST_COLOR:
715 case GL_SRC_ALPHA:
716 case GL_ONE_MINUS_SRC_ALPHA:
717 case GL_DST_ALPHA:
718 case GL_ONE_MINUS_DST_ALPHA:
719 case GL_CONSTANT_COLOR:
720 case GL_ONE_MINUS_CONSTANT_COLOR:
721 case GL_CONSTANT_ALPHA:
722 case GL_ONE_MINUS_CONSTANT_ALPHA:
723 case GL_SRC_ALPHA_SATURATE:
724 break;
725 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000726 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000727 }
728
729 switch (dstRGB)
730 {
731 case GL_ZERO:
732 case GL_ONE:
733 case GL_SRC_COLOR:
734 case GL_ONE_MINUS_SRC_COLOR:
735 case GL_DST_COLOR:
736 case GL_ONE_MINUS_DST_COLOR:
737 case GL_SRC_ALPHA:
738 case GL_ONE_MINUS_SRC_ALPHA:
739 case GL_DST_ALPHA:
740 case GL_ONE_MINUS_DST_ALPHA:
741 case GL_CONSTANT_COLOR:
742 case GL_ONE_MINUS_CONSTANT_COLOR:
743 case GL_CONSTANT_ALPHA:
744 case GL_ONE_MINUS_CONSTANT_ALPHA:
745 break;
746 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000747 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000748 }
749
750 switch (srcAlpha)
751 {
752 case GL_ZERO:
753 case GL_ONE:
754 case GL_SRC_COLOR:
755 case GL_ONE_MINUS_SRC_COLOR:
756 case GL_DST_COLOR:
757 case GL_ONE_MINUS_DST_COLOR:
758 case GL_SRC_ALPHA:
759 case GL_ONE_MINUS_SRC_ALPHA:
760 case GL_DST_ALPHA:
761 case GL_ONE_MINUS_DST_ALPHA:
762 case GL_CONSTANT_COLOR:
763 case GL_ONE_MINUS_CONSTANT_COLOR:
764 case GL_CONSTANT_ALPHA:
765 case GL_ONE_MINUS_CONSTANT_ALPHA:
766 case GL_SRC_ALPHA_SATURATE:
767 break;
768 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000769 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000770 }
771
772 switch (dstAlpha)
773 {
774 case GL_ZERO:
775 case GL_ONE:
776 case GL_SRC_COLOR:
777 case GL_ONE_MINUS_SRC_COLOR:
778 case GL_DST_COLOR:
779 case GL_ONE_MINUS_DST_COLOR:
780 case GL_SRC_ALPHA:
781 case GL_ONE_MINUS_SRC_ALPHA:
782 case GL_DST_ALPHA:
783 case GL_ONE_MINUS_DST_ALPHA:
784 case GL_CONSTANT_COLOR:
785 case GL_ONE_MINUS_CONSTANT_COLOR:
786 case GL_CONSTANT_ALPHA:
787 case GL_ONE_MINUS_CONSTANT_ALPHA:
788 break;
789 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000790 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000791 }
792
daniel@transgaming.comfe453652010-03-16 06:23:28 +0000793 bool constantColorUsed = (srcRGB == GL_CONSTANT_COLOR || srcRGB == GL_ONE_MINUS_CONSTANT_COLOR ||
794 dstRGB == GL_CONSTANT_COLOR || dstRGB == GL_ONE_MINUS_CONSTANT_COLOR);
795
796 bool constantAlphaUsed = (srcRGB == GL_CONSTANT_ALPHA || srcRGB == GL_ONE_MINUS_CONSTANT_ALPHA ||
797 dstRGB == GL_CONSTANT_ALPHA || dstRGB == GL_ONE_MINUS_CONSTANT_ALPHA);
798
799 if (constantColorUsed && constantAlphaUsed)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000800 {
daniel@transgaming.comfe453652010-03-16 06:23:28 +0000801 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 +0000802 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000803 }
804
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000805 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000806
807 if (context)
808 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +0000809 context->setBlendFactors(srcRGB, dstRGB, srcAlpha, dstAlpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000810 }
811 }
812 catch(std::bad_alloc&)
813 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000814 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000815 }
816}
817
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +0000818void __stdcall glBufferData(GLenum target, GLsizeiptr size, const GLvoid* data, GLenum usage)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000819{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000820 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 +0000821 target, size, data, usage);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000822
823 try
824 {
825 if (size < 0)
826 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000827 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000828 }
829
shannon.woods%transgaming.com@gtempaccount.comf2db40b2013-04-13 03:37:09 +0000830 gl::Context *context = gl::getNonLostContext();
831
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000832 switch (usage)
833 {
834 case GL_STREAM_DRAW:
835 case GL_STATIC_DRAW:
836 case GL_DYNAMIC_DRAW:
837 break;
shannon.woods%transgaming.com@gtempaccount.comf2db40b2013-04-13 03:37:09 +0000838
839 case GL_STREAM_READ:
840 case GL_STREAM_COPY:
841 case GL_STATIC_READ:
842 case GL_STATIC_COPY:
843 case GL_DYNAMIC_READ:
844 case GL_DYNAMIC_COPY:
845 if (context && context->getClientVersion() < 3)
846 {
847 return gl::error(GL_INVALID_ENUM);
848 }
849 break;
850
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000851 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000852 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000853 }
854
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000855 if (context)
856 {
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +0000857 // Check ES3 specific targets
858 switch (target)
859 {
shannon.woods%transgaming.com@gtempaccount.com51171882013-04-13 03:39:10 +0000860 case GL_COPY_READ_BUFFER:
861 case GL_COPY_WRITE_BUFFER:
shannon.woods%transgaming.com@gtempaccount.comc926e5f2013-04-13 03:39:18 +0000862 case GL_PIXEL_PACK_BUFFER:
863 case GL_PIXEL_UNPACK_BUFFER:
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +0000864 case GL_UNIFORM_BUFFER:
865 case GL_TRANSFORM_FEEDBACK_BUFFER:
866 if (context->getClientVersion() < 3)
867 {
868 return gl::error(GL_INVALID_ENUM);
869 }
870 }
871
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000872 gl::Buffer *buffer;
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +0000873
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000874 switch (target)
875 {
876 case GL_ARRAY_BUFFER:
877 buffer = context->getArrayBuffer();
878 break;
879 case GL_ELEMENT_ARRAY_BUFFER:
880 buffer = context->getElementArrayBuffer();
881 break;
shannon.woods%transgaming.com@gtempaccount.com51171882013-04-13 03:39:10 +0000882 case GL_COPY_READ_BUFFER:
883 buffer = context->getCopyReadBuffer();
884 break;
885 case GL_COPY_WRITE_BUFFER:
886 buffer = context->getCopyWriteBuffer();
887 break;
shannon.woods%transgaming.com@gtempaccount.comc926e5f2013-04-13 03:39:18 +0000888 case GL_PIXEL_PACK_BUFFER:
889 buffer = context->getPixelPackBuffer();
890 break;
891 case GL_PIXEL_UNPACK_BUFFER:
892 buffer = context->getPixelUnpackBuffer();
893 break;
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +0000894 case GL_TRANSFORM_FEEDBACK_BUFFER:
895 buffer = context->getGenericTransformFeedbackBuffer();
896 break;
897 case GL_UNIFORM_BUFFER:
898 buffer = context->getGenericUniformBuffer();
899 break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000900 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000901 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000902 }
903
904 if (!buffer)
905 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000906 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000907 }
908
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +0000909 buffer->bufferData(data, size, usage);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000910 }
911 }
912 catch(std::bad_alloc&)
913 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000914 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000915 }
916}
917
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +0000918void __stdcall glBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid* data)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000919{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000920 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 +0000921 target, offset, size, data);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000922
923 try
924 {
daniel@transgaming.comdefa1c32010-05-18 18:51:45 +0000925 if (size < 0 || offset < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000926 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000927 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000928 }
929
daniel@transgaming.comd4620a32010-03-21 04:31:28 +0000930 if (data == NULL)
931 {
932 return;
933 }
934
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000935 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +0000936
937 if (context)
938 {
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +0000939 // Check ES3 specific targets
940 switch (target)
941 {
shannon.woods%transgaming.com@gtempaccount.com51171882013-04-13 03:39:10 +0000942 case GL_COPY_READ_BUFFER:
943 case GL_COPY_WRITE_BUFFER:
shannon.woods%transgaming.com@gtempaccount.comc926e5f2013-04-13 03:39:18 +0000944 case GL_PIXEL_PACK_BUFFER:
945 case GL_PIXEL_UNPACK_BUFFER:
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +0000946 case GL_UNIFORM_BUFFER:
947 case GL_TRANSFORM_FEEDBACK_BUFFER:
948 if (context->getClientVersion() < 3)
949 {
950 return gl::error(GL_INVALID_ENUM);
951 }
952 }
953
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +0000954 gl::Buffer *buffer;
955
956 switch (target)
957 {
958 case GL_ARRAY_BUFFER:
959 buffer = context->getArrayBuffer();
960 break;
961 case GL_ELEMENT_ARRAY_BUFFER:
962 buffer = context->getElementArrayBuffer();
963 break;
shannon.woods%transgaming.com@gtempaccount.com51171882013-04-13 03:39:10 +0000964 case GL_COPY_READ_BUFFER:
965 buffer = context->getCopyReadBuffer();
966 break;
967 case GL_COPY_WRITE_BUFFER:
968 buffer = context->getCopyWriteBuffer();
969 break;
shannon.woods%transgaming.com@gtempaccount.comc926e5f2013-04-13 03:39:18 +0000970 case GL_PIXEL_PACK_BUFFER:
971 buffer = context->getPixelPackBuffer();
972 break;
973 case GL_PIXEL_UNPACK_BUFFER:
974 buffer = context->getPixelUnpackBuffer();
975 break;
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +0000976 case GL_TRANSFORM_FEEDBACK_BUFFER:
977 buffer = context->getGenericTransformFeedbackBuffer();
978 break;
979 case GL_UNIFORM_BUFFER:
980 buffer = context->getGenericUniformBuffer();
981 break;
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +0000982 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000983 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +0000984 }
985
986 if (!buffer)
987 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000988 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +0000989 }
990
daniel@transgaming.comdefa1c32010-05-18 18:51:45 +0000991 if ((size_t)size + offset > buffer->size())
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +0000992 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000993 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +0000994 }
daniel@transgaming.comdefa1c32010-05-18 18:51:45 +0000995
996 buffer->bufferSubData(data, size, offset);
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +0000997 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000998 }
999 catch(std::bad_alloc&)
1000 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001001 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001002 }
1003}
1004
1005GLenum __stdcall glCheckFramebufferStatus(GLenum target)
1006{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001007 EVENT("(GLenum target = 0x%X)", target);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001008
1009 try
1010 {
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00001011 if (target != GL_FRAMEBUFFER && target != GL_DRAW_FRAMEBUFFER_ANGLE && target != GL_READ_FRAMEBUFFER_ANGLE)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001012 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001013 return gl::error(GL_INVALID_ENUM, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001014 }
1015
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001016 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001017
1018 if (context)
1019 {
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00001020 gl::Framebuffer *framebuffer = NULL;
1021 if (target == GL_READ_FRAMEBUFFER_ANGLE)
1022 {
1023 framebuffer = context->getReadFramebuffer();
1024 }
1025 else
1026 {
1027 framebuffer = context->getDrawFramebuffer();
1028 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001029
1030 return framebuffer->completeness();
1031 }
1032 }
1033 catch(std::bad_alloc&)
1034 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001035 return gl::error(GL_OUT_OF_MEMORY, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001036 }
1037
1038 return 0;
1039}
1040
1041void __stdcall glClear(GLbitfield mask)
1042{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00001043 EVENT("(GLbitfield mask = 0x%X)", mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001044
1045 try
1046 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001047 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001048
1049 if (context)
1050 {
1051 context->clear(mask);
1052 }
1053 }
1054 catch(std::bad_alloc&)
1055 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001056 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001057 }
1058}
1059
1060void __stdcall glClearColor(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha)
1061{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001062 EVENT("(GLclampf red = %f, GLclampf green = %f, GLclampf blue = %f, GLclampf alpha = %f)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001063 red, green, blue, alpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001064
1065 try
1066 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001067 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001068
1069 if (context)
1070 {
1071 context->setClearColor(red, green, blue, alpha);
1072 }
1073 }
1074 catch(std::bad_alloc&)
1075 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001076 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001077 }
1078}
1079
1080void __stdcall glClearDepthf(GLclampf depth)
1081{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001082 EVENT("(GLclampf depth = %f)", depth);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001083
1084 try
1085 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001086 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001087
1088 if (context)
1089 {
1090 context->setClearDepth(depth);
1091 }
1092 }
1093 catch(std::bad_alloc&)
1094 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001095 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001096 }
1097}
1098
1099void __stdcall glClearStencil(GLint s)
1100{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001101 EVENT("(GLint s = %d)", s);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001102
1103 try
1104 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001105 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001106
1107 if (context)
1108 {
1109 context->setClearStencil(s);
1110 }
1111 }
1112 catch(std::bad_alloc&)
1113 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001114 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001115 }
1116}
1117
1118void __stdcall glColorMask(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha)
1119{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00001120 EVENT("(GLboolean red = %d, GLboolean green = %u, GLboolean blue = %u, GLboolean alpha = %u)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001121 red, green, blue, alpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001122
1123 try
1124 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001125 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001126
1127 if (context)
1128 {
daniel@transgaming.coma36f98e2010-05-18 18:51:09 +00001129 context->setColorMask(red == GL_TRUE, green == GL_TRUE, blue == GL_TRUE, alpha == GL_TRUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001130 }
1131 }
1132 catch(std::bad_alloc&)
1133 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001134 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001135 }
1136}
1137
1138void __stdcall glCompileShader(GLuint shader)
1139{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001140 EVENT("(GLuint shader = %d)", shader);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001141
1142 try
1143 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001144 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001145
1146 if (context)
1147 {
1148 gl::Shader *shaderObject = context->getShader(shader);
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00001149
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001150 if (!shaderObject)
1151 {
daniel@transgaming.com0cefaf42010-04-13 03:26:36 +00001152 if (context->getProgram(shader))
1153 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001154 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com0cefaf42010-04-13 03:26:36 +00001155 }
1156 else
1157 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001158 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com0cefaf42010-04-13 03:26:36 +00001159 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001160 }
1161
1162 shaderObject->compile();
1163 }
1164 }
1165 catch(std::bad_alloc&)
1166 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001167 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001168 }
1169}
1170
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00001171void __stdcall glCompressedTexImage2D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height,
1172 GLint border, GLsizei imageSize, const GLvoid* data)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001173{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001174 EVENT("(GLenum target = 0x%X, GLint level = %d, GLenum internalformat = 0x%X, GLsizei width = %d, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00001175 "GLsizei height = %d, GLint border = %d, GLsizei imageSize = %d, const GLvoid* data = 0x%0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001176 target, level, internalformat, width, height, border, imageSize, data);
1177
1178 try
1179 {
shannon.woods%transgaming.com@gtempaccount.com6d73c4e2013-04-13 03:45:12 +00001180 if (!validImageSize(level, width, height, 1) || border != 0 || imageSize < 0)
daniel@transgaming.com41430492010-03-11 20:36:18 +00001181 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001182 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com41430492010-03-11 20:36:18 +00001183 }
1184
daniel@transgaming.com01868132010-08-24 19:21:17 +00001185 switch (internalformat)
1186 {
1187 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
1188 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
gman@chromium.org50c526d2011-08-10 05:19:44 +00001189 case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
1190 case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
daniel@transgaming.com01868132010-08-24 19:21:17 +00001191 break;
1192 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001193 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com01868132010-08-24 19:21:17 +00001194 }
1195
1196 if (border != 0)
1197 {
shannon.woods@transgaming.com0efef902013-02-28 23:21:09 +00001198 return gl::error(GL_INVALID_OPERATION);
1199 }
1200
1201 if (width != 1 && width != 2 && width % 4 != 0)
1202 {
1203 return gl::error(GL_INVALID_OPERATION);
1204 }
1205
1206 if (height != 1 && height != 2 && height % 4 != 0)
1207 {
1208 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com01868132010-08-24 19:21:17 +00001209 }
1210
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001211 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com01868132010-08-24 19:21:17 +00001212
1213 if (context)
1214 {
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001215 if (level > context->getMaximumTextureLevel())
1216 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001217 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001218 }
1219
1220 switch (target)
1221 {
1222 case GL_TEXTURE_2D:
shannon.woods%transgaming.com@gtempaccount.comc1fdf6b2013-04-13 03:44:41 +00001223 if (width > (context->getMaximum2DTextureDimension() >> level) ||
1224 height > (context->getMaximum2DTextureDimension() >> level))
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001225 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001226 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001227 }
1228 break;
1229 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
1230 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
1231 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
1232 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
1233 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
1234 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
1235 if (width != height)
1236 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001237 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001238 }
1239
1240 if (width > (context->getMaximumCubeTextureDimension() >> level) ||
1241 height > (context->getMaximumCubeTextureDimension() >> level))
1242 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001243 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001244 }
1245 break;
1246 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001247 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001248 }
1249
gman@chromium.org50c526d2011-08-10 05:19:44 +00001250 switch (internalformat) {
1251 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
1252 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
1253 if (!context->supportsDXT1Textures())
1254 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001255 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 +00001256 }
1257 break;
1258 case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
1259 if (!context->supportsDXT3Textures())
1260 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001261 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 +00001262 }
1263 break;
1264 case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
1265 if (!context->supportsDXT5Textures())
1266 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001267 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 +00001268 }
1269 break;
1270 default: UNREACHABLE();
daniel@transgaming.com01868132010-08-24 19:21:17 +00001271 }
1272
1273 if (imageSize != gl::ComputeCompressedSize(width, height, internalformat))
1274 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001275 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com01868132010-08-24 19:21:17 +00001276 }
1277
1278 if (target == GL_TEXTURE_2D)
1279 {
1280 gl::Texture2D *texture = context->getTexture2D();
1281
1282 if (!texture)
1283 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001284 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com01868132010-08-24 19:21:17 +00001285 }
1286
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00001287 if (texture->isImmutable())
1288 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001289 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00001290 }
1291
daniel@transgaming.com01868132010-08-24 19:21:17 +00001292 texture->setCompressedImage(level, internalformat, width, height, imageSize, data);
1293 }
1294 else
1295 {
1296 gl::TextureCubeMap *texture = context->getTextureCubeMap();
1297
1298 if (!texture)
1299 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001300 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com01868132010-08-24 19:21:17 +00001301 }
1302
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00001303 if (texture->isImmutable())
1304 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001305 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00001306 }
1307
daniel@transgaming.com01868132010-08-24 19:21:17 +00001308 switch (target)
1309 {
1310 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
1311 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
1312 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
1313 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
1314 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
1315 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
1316 texture->setCompressedImage(target, level, internalformat, width, height, imageSize, data);
1317 break;
1318 default: UNREACHABLE();
1319 }
1320 }
1321 }
1322
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001323 }
1324 catch(std::bad_alloc&)
1325 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001326 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001327 }
1328}
1329
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00001330void __stdcall glCompressedTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height,
1331 GLenum format, GLsizei imageSize, const GLvoid* data)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001332{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001333 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001334 "GLsizei width = %d, GLsizei height = %d, GLenum format = 0x%X, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00001335 "GLsizei imageSize = %d, const GLvoid* data = 0x%0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001336 target, level, xoffset, yoffset, width, height, format, imageSize, data);
1337
1338 try
1339 {
apatrick@chromium.org551022e2012-01-23 19:56:54 +00001340 if (!gl::IsInternalTextureTarget(target))
daniel@transgaming.com41430492010-03-11 20:36:18 +00001341 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001342 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com41430492010-03-11 20:36:18 +00001343 }
1344
shannon.woods%transgaming.com@gtempaccount.com6d73c4e2013-04-13 03:45:12 +00001345 if (xoffset < 0 || yoffset < 0 || !validImageSize(level, width, height, 1) || imageSize < 0)
daniel@transgaming.com41430492010-03-11 20:36:18 +00001346 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001347 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com41430492010-03-11 20:36:18 +00001348 }
1349
daniel@transgaming.com01868132010-08-24 19:21:17 +00001350 switch (format)
daniel@transgaming.com41430492010-03-11 20:36:18 +00001351 {
daniel@transgaming.com01868132010-08-24 19:21:17 +00001352 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
1353 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
gman@chromium.org50c526d2011-08-10 05:19:44 +00001354 case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
1355 case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
daniel@transgaming.com01868132010-08-24 19:21:17 +00001356 break;
1357 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001358 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com41430492010-03-11 20:36:18 +00001359 }
1360
daniel@transgaming.com01868132010-08-24 19:21:17 +00001361 if (width == 0 || height == 0 || data == NULL)
1362 {
1363 return;
1364 }
1365
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001366 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com01868132010-08-24 19:21:17 +00001367
1368 if (context)
1369 {
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001370 if (level > context->getMaximumTextureLevel())
1371 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001372 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001373 }
1374
gman@chromium.org50c526d2011-08-10 05:19:44 +00001375 switch (format) {
1376 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
1377 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
1378 if (!context->supportsDXT1Textures())
1379 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001380 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 +00001381 }
1382 break;
1383 case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
1384 if (!context->supportsDXT3Textures())
1385 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001386 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 +00001387 }
1388 break;
1389 case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
1390 if (!context->supportsDXT5Textures())
1391 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001392 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 +00001393 }
1394 break;
1395 default: UNREACHABLE();
daniel@transgaming.com01868132010-08-24 19:21:17 +00001396 }
1397
1398 if (imageSize != gl::ComputeCompressedSize(width, height, format))
1399 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001400 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com01868132010-08-24 19:21:17 +00001401 }
1402
1403 if (xoffset % 4 != 0 || yoffset % 4 != 0)
1404 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001405 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 +00001406 // does not exist unless DXT textures are supported.
daniel@transgaming.com01868132010-08-24 19:21:17 +00001407 }
1408
1409 if (target == GL_TEXTURE_2D)
1410 {
1411 gl::Texture2D *texture = context->getTexture2D();
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00001412 if (validateSubImageParams2D(true, width, height, xoffset, yoffset, level, format, GL_NONE, texture))
daniel@transgaming.com01868132010-08-24 19:21:17 +00001413 {
daniel@transgaming.com343373a2011-11-29 19:42:32 +00001414 texture->subImageCompressed(level, xoffset, yoffset, width, height, format, imageSize, data);
daniel@transgaming.com01868132010-08-24 19:21:17 +00001415 }
daniel@transgaming.com01868132010-08-24 19:21:17 +00001416 }
1417 else if (gl::IsCubemapTextureTarget(target))
1418 {
1419 gl::TextureCubeMap *texture = context->getTextureCubeMap();
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00001420 if (validateSubImageParamsCube(true, width, height, xoffset, yoffset, target, level, format, GL_NONE, texture))
daniel@transgaming.com01868132010-08-24 19:21:17 +00001421 {
daniel@transgaming.com343373a2011-11-29 19:42:32 +00001422 texture->subImageCompressed(target, level, xoffset, yoffset, width, height, format, imageSize, data);
daniel@transgaming.com01868132010-08-24 19:21:17 +00001423 }
daniel@transgaming.com01868132010-08-24 19:21:17 +00001424 }
1425 else
1426 {
1427 UNREACHABLE();
1428 }
1429 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001430 }
1431 catch(std::bad_alloc&)
1432 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001433 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001434 }
1435}
1436
1437void __stdcall glCopyTexImage2D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border)
1438{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001439 EVENT("(GLenum target = 0x%X, GLint level = %d, GLenum internalformat = 0x%X, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001440 "GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d, GLint border = %d)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001441 target, level, internalformat, x, y, width, height, border);
1442
1443 try
1444 {
shannon.woods%transgaming.com@gtempaccount.com6d73c4e2013-04-13 03:45:12 +00001445 if (!validImageSize(level, width, height, 1))
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001446 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001447 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001448 }
1449
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001450 if (border != 0)
1451 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001452 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001453 }
1454
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001455 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001456
1457 if (context)
1458 {
daniel@transgaming.com32b11442011-11-19 02:42:48 +00001459 if (level > context->getMaximumTextureLevel())
1460 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001461 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com32b11442011-11-19 02:42:48 +00001462 }
1463
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001464 switch (target)
1465 {
1466 case GL_TEXTURE_2D:
shannon.woods%transgaming.com@gtempaccount.comc1fdf6b2013-04-13 03:44:41 +00001467 if (width > (context->getMaximum2DTextureDimension() >> level) ||
1468 height > (context->getMaximum2DTextureDimension() >> level))
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001469 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001470 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001471 }
1472 break;
1473 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
1474 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
1475 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
1476 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
1477 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
1478 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
1479 if (width != height)
1480 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001481 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001482 }
1483
1484 if (width > (context->getMaximumCubeTextureDimension() >> level) ||
1485 height > (context->getMaximumCubeTextureDimension() >> level))
1486 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001487 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001488 }
1489 break;
1490 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001491 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001492 }
1493
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00001494 gl::Framebuffer *framebuffer = context->getReadFramebuffer();
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001495
daniel@transgaming.combbc57792010-07-28 19:21:05 +00001496 if (framebuffer->completeness() != GL_FRAMEBUFFER_COMPLETE)
1497 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001498 return gl::error(GL_INVALID_FRAMEBUFFER_OPERATION);
daniel@transgaming.combbc57792010-07-28 19:21:05 +00001499 }
1500
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00001501 if (context->getReadFramebufferHandle() != 0 && framebuffer->getSamples() != 0)
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00001502 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001503 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00001504 }
1505
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00001506 gl::Renderbuffer *source = framebuffer->getReadColorbuffer();
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +00001507 GLenum colorbufferFormat = source->getInternalFormat();
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001508
1509 // [OpenGL ES 2.0.24] table 3.9
1510 switch (internalformat)
1511 {
1512 case GL_ALPHA:
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00001513 if (colorbufferFormat != GL_ALPHA8_EXT &&
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001514 colorbufferFormat != GL_RGBA4 &&
1515 colorbufferFormat != GL_RGB5_A1 &&
shannon.woods@transgaming.com28e7ba02013-02-28 23:09:28 +00001516 colorbufferFormat != GL_BGRA8_EXT &&
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001517 colorbufferFormat != GL_RGBA8_OES)
1518 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001519 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001520 }
1521 break;
1522 case GL_LUMINANCE:
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00001523 case GL_RGB:
1524 if (colorbufferFormat != GL_RGB565 &&
1525 colorbufferFormat != GL_RGB8_OES &&
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001526 colorbufferFormat != GL_RGBA4 &&
1527 colorbufferFormat != GL_RGB5_A1 &&
shannon.woods@transgaming.com28e7ba02013-02-28 23:09:28 +00001528 colorbufferFormat != GL_BGRA8_EXT &&
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001529 colorbufferFormat != GL_RGBA8_OES)
1530 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001531 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001532 }
1533 break;
1534 case GL_LUMINANCE_ALPHA:
1535 case GL_RGBA:
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00001536 if (colorbufferFormat != GL_RGBA4 &&
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001537 colorbufferFormat != GL_RGB5_A1 &&
shannon.woods@transgaming.com28e7ba02013-02-28 23:09:28 +00001538 colorbufferFormat != GL_BGRA8_EXT &&
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001539 colorbufferFormat != GL_RGBA8_OES)
1540 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001541 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001542 }
1543 break;
1544 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
1545 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
gman@chromium.org50c526d2011-08-10 05:19:44 +00001546 if (context->supportsDXT1Textures())
1547 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001548 return gl::error(GL_INVALID_OPERATION);
gman@chromium.org50c526d2011-08-10 05:19:44 +00001549 }
1550 else
1551 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001552 return gl::error(GL_INVALID_ENUM);
gman@chromium.org50c526d2011-08-10 05:19:44 +00001553 }
1554 break;
1555 case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
1556 if (context->supportsDXT3Textures())
1557 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001558 return gl::error(GL_INVALID_OPERATION);
gman@chromium.org50c526d2011-08-10 05:19:44 +00001559 }
1560 else
1561 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001562 return gl::error(GL_INVALID_ENUM);
gman@chromium.org50c526d2011-08-10 05:19:44 +00001563 }
1564 break;
1565 case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
1566 if (context->supportsDXT5Textures())
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001567 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001568 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001569 }
1570 else
1571 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001572 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001573 }
1574 break;
daniel@transgaming.com0c854682012-05-31 01:14:11 +00001575 case GL_DEPTH_COMPONENT:
1576 case GL_DEPTH_COMPONENT16:
1577 case GL_DEPTH_COMPONENT32_OES:
1578 case GL_DEPTH_STENCIL_OES:
1579 case GL_DEPTH24_STENCIL8_OES:
1580 if (context->supportsDepthTextures())
1581 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001582 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com0c854682012-05-31 01:14:11 +00001583 }
1584 else
1585 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001586 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com0c854682012-05-31 01:14:11 +00001587 }
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001588 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001589 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001590 }
1591
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001592 if (target == GL_TEXTURE_2D)
1593 {
1594 gl::Texture2D *texture = context->getTexture2D();
1595
1596 if (!texture)
1597 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001598 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001599 }
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00001600
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00001601 if (texture->isImmutable())
1602 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001603 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00001604 }
1605
apatrick@chromium.orgb31f5322011-01-19 19:02:52 +00001606 texture->copyImage(level, internalformat, x, y, width, height, framebuffer);
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001607 }
daniel@transgaming.com19ffc242010-05-04 03:35:21 +00001608 else if (gl::IsCubemapTextureTarget(target))
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001609 {
1610 gl::TextureCubeMap *texture = context->getTextureCubeMap();
1611
1612 if (!texture)
1613 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001614 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001615 }
1616
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00001617 if (texture->isImmutable())
1618 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001619 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00001620 }
1621
apatrick@chromium.orgb31f5322011-01-19 19:02:52 +00001622 texture->copyImage(target, level, internalformat, x, y, width, height, framebuffer);
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001623 }
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001624 else UNREACHABLE();
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001625 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001626 }
1627 catch(std::bad_alloc&)
1628 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001629 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001630 }
1631}
1632
1633void __stdcall glCopyTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height)
1634{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001635 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001636 "GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001637 target, level, xoffset, yoffset, x, y, width, height);
1638
1639 try
1640 {
apatrick@chromium.org551022e2012-01-23 19:56:54 +00001641 if (!gl::IsInternalTextureTarget(target))
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001642 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001643 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001644 }
1645
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001646 if (level < 0 || xoffset < 0 || yoffset < 0 || width < 0 || height < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001647 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001648 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001649 }
1650
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001651 if (std::numeric_limits<GLsizei>::max() - xoffset < width || std::numeric_limits<GLsizei>::max() - yoffset < height)
1652 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001653 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001654 }
1655
1656 if (width == 0 || height == 0)
1657 {
1658 return;
1659 }
1660
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001661 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001662
1663 if (context)
1664 {
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001665 if (level > context->getMaximumTextureLevel())
1666 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001667 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001668 }
1669
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00001670 gl::Framebuffer *framebuffer = context->getReadFramebuffer();
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001671
daniel@transgaming.combbc57792010-07-28 19:21:05 +00001672 if (framebuffer->completeness() != GL_FRAMEBUFFER_COMPLETE)
1673 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001674 return gl::error(GL_INVALID_FRAMEBUFFER_OPERATION);
daniel@transgaming.combbc57792010-07-28 19:21:05 +00001675 }
1676
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00001677 if (context->getReadFramebufferHandle() != 0 && framebuffer->getSamples() != 0)
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00001678 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001679 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00001680 }
1681
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00001682 gl::Renderbuffer *source = framebuffer->getReadColorbuffer();
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +00001683 GLenum colorbufferFormat = source->getInternalFormat();
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001684 gl::Texture *texture = NULL;
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +00001685 GLenum textureFormat = GL_RGBA;
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001686
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001687 if (target == GL_TEXTURE_2D)
1688 {
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +00001689 gl::Texture2D *tex2d = context->getTexture2D();
1690
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00001691 if (!validateSubImageParams2D(false, width, height, xoffset, yoffset, level, GL_NONE, GL_NONE, tex2d))
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +00001692 {
1693 return; // error already registered by validateSubImageParams
1694 }
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00001695 textureFormat = gl::ExtractFormat(tex2d->getInternalFormat(level));
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +00001696 texture = tex2d;
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001697 }
daniel@transgaming.com19ffc242010-05-04 03:35:21 +00001698 else if (gl::IsCubemapTextureTarget(target))
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001699 {
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +00001700 gl::TextureCubeMap *texcube = context->getTextureCubeMap();
1701
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00001702 if (!validateSubImageParamsCube(false, width, height, xoffset, yoffset, target, level, GL_NONE, GL_NONE, texcube))
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +00001703 {
1704 return; // error already registered by validateSubImageParams
1705 }
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00001706 textureFormat = gl::ExtractFormat(texcube->getInternalFormat(target, level));
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +00001707 texture = texcube;
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001708 }
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001709 else UNREACHABLE();
1710
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001711 // [OpenGL ES 2.0.24] table 3.9
1712 switch (textureFormat)
1713 {
1714 case GL_ALPHA:
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00001715 if (colorbufferFormat != GL_ALPHA8_EXT &&
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001716 colorbufferFormat != GL_RGBA4 &&
1717 colorbufferFormat != GL_RGB5_A1 &&
1718 colorbufferFormat != GL_RGBA8_OES)
1719 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001720 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001721 }
1722 break;
1723 case GL_LUMINANCE:
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00001724 case GL_RGB:
1725 if (colorbufferFormat != GL_RGB565 &&
1726 colorbufferFormat != GL_RGB8_OES &&
1727 colorbufferFormat != GL_RGBA4 &&
1728 colorbufferFormat != GL_RGB5_A1 &&
1729 colorbufferFormat != GL_RGBA8_OES)
1730 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001731 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00001732 }
1733 break;
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001734 case GL_LUMINANCE_ALPHA:
1735 case GL_RGBA:
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00001736 if (colorbufferFormat != GL_RGBA4 &&
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001737 colorbufferFormat != GL_RGB5_A1 &&
1738 colorbufferFormat != GL_RGBA8_OES)
1739 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001740 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001741 }
1742 break;
1743 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
1744 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
gman@chromium.org50c526d2011-08-10 05:19:44 +00001745 case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
1746 case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001747 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com0c854682012-05-31 01:14:11 +00001748 case GL_DEPTH_COMPONENT:
1749 case GL_DEPTH_STENCIL_OES:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001750 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001751 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001752 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001753 }
1754
shannon.woods%transgaming.com@gtempaccount.com95996562013-04-13 03:44:58 +00001755 texture->copySubImage(target, level, xoffset, yoffset, 0, x, y, width, height, framebuffer);
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001756 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001757 }
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001758
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001759 catch(std::bad_alloc&)
1760 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001761 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001762 }
1763}
1764
1765GLuint __stdcall glCreateProgram(void)
1766{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001767 EVENT("()");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001768
1769 try
1770 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001771 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001772
1773 if (context)
1774 {
1775 return context->createProgram();
1776 }
1777 }
1778 catch(std::bad_alloc&)
1779 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001780 return gl::error(GL_OUT_OF_MEMORY, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001781 }
1782
1783 return 0;
1784}
1785
1786GLuint __stdcall glCreateShader(GLenum type)
1787{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001788 EVENT("(GLenum type = 0x%X)", type);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001789
1790 try
1791 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001792 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001793
1794 if (context)
1795 {
1796 switch (type)
1797 {
1798 case GL_FRAGMENT_SHADER:
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00001799 case GL_VERTEX_SHADER:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001800 return context->createShader(type);
1801 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001802 return gl::error(GL_INVALID_ENUM, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001803 }
1804 }
1805 }
1806 catch(std::bad_alloc&)
1807 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001808 return gl::error(GL_OUT_OF_MEMORY, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001809 }
1810
1811 return 0;
1812}
1813
1814void __stdcall glCullFace(GLenum mode)
1815{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001816 EVENT("(GLenum mode = 0x%X)", mode);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001817
1818 try
1819 {
1820 switch (mode)
1821 {
1822 case GL_FRONT:
1823 case GL_BACK:
1824 case GL_FRONT_AND_BACK:
1825 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001826 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001827
1828 if (context)
1829 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00001830 context->setCullMode(mode);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001831 }
1832 }
1833 break;
1834 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001835 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001836 }
1837 }
1838 catch(std::bad_alloc&)
1839 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001840 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001841 }
1842}
1843
1844void __stdcall glDeleteBuffers(GLsizei n, const GLuint* buffers)
1845{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001846 EVENT("(GLsizei n = %d, const GLuint* buffers = 0x%0.8p)", n, buffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001847
1848 try
1849 {
1850 if (n < 0)
1851 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001852 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001853 }
1854
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001855 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001856
1857 if (context)
1858 {
1859 for (int i = 0; i < n; i++)
1860 {
1861 context->deleteBuffer(buffers[i]);
1862 }
1863 }
1864 }
1865 catch(std::bad_alloc&)
1866 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001867 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001868 }
1869}
1870
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001871void __stdcall glDeleteFencesNV(GLsizei n, const GLuint* fences)
1872{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001873 EVENT("(GLsizei n = %d, const GLuint* fences = 0x%0.8p)", n, fences);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001874
1875 try
1876 {
1877 if (n < 0)
1878 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001879 return gl::error(GL_INVALID_VALUE);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001880 }
1881
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001882 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001883
1884 if (context)
1885 {
1886 for (int i = 0; i < n; i++)
1887 {
1888 context->deleteFence(fences[i]);
1889 }
1890 }
1891 }
1892 catch(std::bad_alloc&)
1893 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001894 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001895 }
1896}
1897
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001898void __stdcall glDeleteFramebuffers(GLsizei n, const GLuint* framebuffers)
1899{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001900 EVENT("(GLsizei n = %d, const GLuint* framebuffers = 0x%0.8p)", n, framebuffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001901
1902 try
1903 {
1904 if (n < 0)
1905 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001906 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001907 }
1908
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001909 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001910
1911 if (context)
1912 {
1913 for (int i = 0; i < n; i++)
1914 {
1915 if (framebuffers[i] != 0)
1916 {
1917 context->deleteFramebuffer(framebuffers[i]);
1918 }
1919 }
1920 }
1921 }
1922 catch(std::bad_alloc&)
1923 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001924 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001925 }
1926}
1927
1928void __stdcall glDeleteProgram(GLuint program)
1929{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001930 EVENT("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001931
1932 try
1933 {
daniel@transgaming.com75401e62010-04-13 03:26:39 +00001934 if (program == 0)
1935 {
1936 return;
1937 }
1938
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001939 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001940
1941 if (context)
1942 {
daniel@transgaming.com75401e62010-04-13 03:26:39 +00001943 if (!context->getProgram(program))
1944 {
1945 if(context->getShader(program))
1946 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001947 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com75401e62010-04-13 03:26:39 +00001948 }
1949 else
1950 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001951 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com75401e62010-04-13 03:26:39 +00001952 }
1953 }
1954
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001955 context->deleteProgram(program);
1956 }
1957 }
1958 catch(std::bad_alloc&)
1959 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001960 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001961 }
1962}
1963
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00001964void __stdcall glDeleteQueriesEXT(GLsizei n, const GLuint *ids)
1965{
1966 EVENT("(GLsizei n = %d, const GLuint *ids = 0x%0.8p)", n, ids);
1967
1968 try
1969 {
1970 if (n < 0)
1971 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001972 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00001973 }
1974
1975 gl::Context *context = gl::getNonLostContext();
1976
1977 if (context)
1978 {
1979 for (int i = 0; i < n; i++)
1980 {
1981 context->deleteQuery(ids[i]);
1982 }
1983 }
1984 }
1985 catch(std::bad_alloc&)
1986 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001987 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00001988 }
1989}
1990
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001991void __stdcall glDeleteRenderbuffers(GLsizei n, const GLuint* renderbuffers)
1992{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001993 EVENT("(GLsizei n = %d, const GLuint* renderbuffers = 0x%0.8p)", n, renderbuffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001994
1995 try
1996 {
1997 if (n < 0)
1998 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001999 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002000 }
2001
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002002 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002003
2004 if (context)
2005 {
daniel@transgaming.come2b22122010-03-11 19:22:14 +00002006 for (int i = 0; i < n; i++)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002007 {
2008 context->deleteRenderbuffer(renderbuffers[i]);
2009 }
2010 }
2011 }
2012 catch(std::bad_alloc&)
2013 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002014 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002015 }
2016}
2017
2018void __stdcall glDeleteShader(GLuint shader)
2019{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002020 EVENT("(GLuint shader = %d)", shader);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002021
2022 try
2023 {
daniel@transgaming.com75401e62010-04-13 03:26:39 +00002024 if (shader == 0)
2025 {
2026 return;
2027 }
2028
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002029 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002030
2031 if (context)
2032 {
daniel@transgaming.com75401e62010-04-13 03:26:39 +00002033 if (!context->getShader(shader))
2034 {
2035 if(context->getProgram(shader))
2036 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002037 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com75401e62010-04-13 03:26:39 +00002038 }
2039 else
2040 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002041 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com75401e62010-04-13 03:26:39 +00002042 }
2043 }
2044
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002045 context->deleteShader(shader);
2046 }
2047 }
2048 catch(std::bad_alloc&)
2049 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002050 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002051 }
2052}
2053
2054void __stdcall glDeleteTextures(GLsizei n, const GLuint* textures)
2055{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002056 EVENT("(GLsizei n = %d, const GLuint* textures = 0x%0.8p)", n, textures);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002057
2058 try
2059 {
2060 if (n < 0)
2061 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002062 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002063 }
2064
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002065 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002066
2067 if (context)
2068 {
2069 for (int i = 0; i < n; i++)
2070 {
2071 if (textures[i] != 0)
2072 {
2073 context->deleteTexture(textures[i]);
2074 }
2075 }
2076 }
2077 }
2078 catch(std::bad_alloc&)
2079 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002080 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002081 }
2082}
2083
2084void __stdcall glDepthFunc(GLenum func)
2085{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002086 EVENT("(GLenum func = 0x%X)", func);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002087
2088 try
2089 {
2090 switch (func)
2091 {
2092 case GL_NEVER:
2093 case GL_ALWAYS:
2094 case GL_LESS:
2095 case GL_LEQUAL:
2096 case GL_EQUAL:
2097 case GL_GREATER:
2098 case GL_GEQUAL:
2099 case GL_NOTEQUAL:
2100 break;
2101 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002102 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002103 }
2104
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002105 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002106
2107 if (context)
2108 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00002109 context->setDepthFunc(func);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002110 }
2111 }
2112 catch(std::bad_alloc&)
2113 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002114 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002115 }
2116}
2117
2118void __stdcall glDepthMask(GLboolean flag)
2119{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00002120 EVENT("(GLboolean flag = %u)", flag);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002121
2122 try
2123 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002124 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002125
2126 if (context)
2127 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00002128 context->setDepthMask(flag != GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002129 }
2130 }
2131 catch(std::bad_alloc&)
2132 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002133 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002134 }
2135}
2136
2137void __stdcall glDepthRangef(GLclampf zNear, GLclampf zFar)
2138{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002139 EVENT("(GLclampf zNear = %f, GLclampf zFar = %f)", zNear, zFar);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002140
2141 try
2142 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002143 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002144
2145 if (context)
2146 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00002147 context->setDepthRange(zNear, zFar);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002148 }
2149 }
2150 catch(std::bad_alloc&)
2151 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002152 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002153 }
2154}
2155
2156void __stdcall glDetachShader(GLuint program, GLuint shader)
2157{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002158 EVENT("(GLuint program = %d, GLuint shader = %d)", program, shader);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002159
2160 try
2161 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002162 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002163
2164 if (context)
2165 {
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00002166
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002167 gl::Program *programObject = context->getProgram(program);
2168 gl::Shader *shaderObject = context->getShader(shader);
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00002169
2170 if (!programObject)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002171 {
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00002172 gl::Shader *shaderByProgramHandle;
2173 shaderByProgramHandle = context->getShader(program);
2174 if (!shaderByProgramHandle)
2175 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002176 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00002177 }
2178 else
2179 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002180 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00002181 }
2182 }
2183
2184 if (!shaderObject)
2185 {
2186 gl::Program *programByShaderHandle = context->getProgram(shader);
2187 if (!programByShaderHandle)
2188 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002189 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00002190 }
2191 else
2192 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002193 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00002194 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002195 }
2196
2197 if (!programObject->detachShader(shaderObject))
2198 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002199 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002200 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002201 }
2202 }
2203 catch(std::bad_alloc&)
2204 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002205 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002206 }
2207}
2208
2209void __stdcall glDisable(GLenum cap)
2210{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002211 EVENT("(GLenum cap = 0x%X)", cap);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002212
2213 try
2214 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002215 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002216
2217 if (context)
2218 {
2219 switch (cap)
2220 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00002221 case GL_CULL_FACE: context->setCullFace(false); break;
2222 case GL_POLYGON_OFFSET_FILL: context->setPolygonOffsetFill(false); break;
2223 case GL_SAMPLE_ALPHA_TO_COVERAGE: context->setSampleAlphaToCoverage(false); break;
2224 case GL_SAMPLE_COVERAGE: context->setSampleCoverage(false); break;
2225 case GL_SCISSOR_TEST: context->setScissorTest(false); break;
2226 case GL_STENCIL_TEST: context->setStencilTest(false); break;
2227 case GL_DEPTH_TEST: context->setDepthTest(false); break;
2228 case GL_BLEND: context->setBlend(false); break;
2229 case GL_DITHER: context->setDither(false); break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002230 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002231 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002232 }
2233 }
2234 }
2235 catch(std::bad_alloc&)
2236 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002237 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002238 }
2239}
2240
2241void __stdcall glDisableVertexAttribArray(GLuint index)
2242{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002243 EVENT("(GLuint index = %d)", index);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002244
2245 try
2246 {
2247 if (index >= gl::MAX_VERTEX_ATTRIBS)
2248 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002249 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002250 }
2251
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002252 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002253
2254 if (context)
2255 {
daniel@transgaming.com83921382011-01-08 05:46:00 +00002256 context->setEnableVertexAttribArray(index, false);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002257 }
2258 }
2259 catch(std::bad_alloc&)
2260 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002261 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002262 }
2263}
2264
2265void __stdcall glDrawArrays(GLenum mode, GLint first, GLsizei count)
2266{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002267 EVENT("(GLenum mode = 0x%X, GLint first = %d, GLsizei count = %d)", mode, first, count);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002268
2269 try
2270 {
2271 if (count < 0 || first < 0)
2272 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002273 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002274 }
2275
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002276 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002277
2278 if (context)
2279 {
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00002280 context->drawArrays(mode, first, count, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002281 }
2282 }
2283 catch(std::bad_alloc&)
2284 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002285 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002286 }
2287}
2288
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002289void __stdcall glDrawArraysInstancedANGLE(GLenum mode, GLint first, GLsizei count, GLsizei primcount)
2290{
2291 EVENT("(GLenum mode = 0x%X, GLint first = %d, GLsizei count = %d, GLsizei primcount = %d)", mode, first, count, primcount);
2292
2293 try
2294 {
2295 if (count < 0 || first < 0 || primcount < 0)
2296 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002297 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002298 }
2299
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00002300 if (primcount > 0)
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002301 {
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00002302 gl::Context *context = gl::getNonLostContext();
2303
2304 if (context)
2305 {
2306 context->drawArrays(mode, first, count, primcount);
2307 }
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002308 }
2309 }
2310 catch(std::bad_alloc&)
2311 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002312 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002313 }
2314}
2315
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00002316void __stdcall glDrawElements(GLenum mode, GLsizei count, GLenum type, const GLvoid* indices)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002317{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002318 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 +00002319 mode, count, type, indices);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002320
2321 try
2322 {
2323 if (count < 0)
2324 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002325 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002326 }
2327
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002328 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002329
2330 if (context)
2331 {
daniel@transgaming.com83921382011-01-08 05:46:00 +00002332 switch (type)
2333 {
2334 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.com83921382011-01-08 05:46:00 +00002341 }
2342 break;
2343 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002344 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com83921382011-01-08 05:46:00 +00002345 }
2346
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00002347 context->drawElements(mode, count, type, indices, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002348 }
2349 }
2350 catch(std::bad_alloc&)
2351 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002352 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002353 }
2354}
2355
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002356void __stdcall glDrawElementsInstancedANGLE(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLsizei primcount)
2357{
2358 EVENT("(GLenum mode = 0x%X, GLsizei count = %d, GLenum type = 0x%X, const GLvoid* indices = 0x%0.8p, GLsizei primcount = %d)",
2359 mode, count, type, indices, primcount);
2360
2361 try
2362 {
2363 if (count < 0 || primcount < 0)
2364 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002365 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002366 }
2367
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00002368 if (primcount > 0)
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002369 {
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00002370 gl::Context *context = gl::getNonLostContext();
2371
2372 if (context)
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002373 {
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00002374 switch (type)
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002375 {
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00002376 case GL_UNSIGNED_BYTE:
2377 case GL_UNSIGNED_SHORT:
2378 break;
2379 case GL_UNSIGNED_INT:
2380 if (!context->supports32bitIndices())
2381 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002382 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00002383 }
2384 break;
2385 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002386 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002387 }
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00002388
2389 context->drawElements(mode, count, type, indices, primcount);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002390 }
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002391 }
2392 }
2393 catch(std::bad_alloc&)
2394 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002395 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002396 }
2397}
2398
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002399void __stdcall glEnable(GLenum cap)
2400{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002401 EVENT("(GLenum cap = 0x%X)", cap);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002402
2403 try
2404 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002405 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002406
2407 if (context)
2408 {
2409 switch (cap)
2410 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00002411 case GL_CULL_FACE: context->setCullFace(true); break;
2412 case GL_POLYGON_OFFSET_FILL: context->setPolygonOffsetFill(true); break;
2413 case GL_SAMPLE_ALPHA_TO_COVERAGE: context->setSampleAlphaToCoverage(true); break;
2414 case GL_SAMPLE_COVERAGE: context->setSampleCoverage(true); break;
2415 case GL_SCISSOR_TEST: context->setScissorTest(true); break;
2416 case GL_STENCIL_TEST: context->setStencilTest(true); break;
2417 case GL_DEPTH_TEST: context->setDepthTest(true); break;
2418 case GL_BLEND: context->setBlend(true); break;
2419 case GL_DITHER: context->setDither(true); break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002420 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002421 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002422 }
2423 }
2424 }
2425 catch(std::bad_alloc&)
2426 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002427 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002428 }
2429}
2430
2431void __stdcall glEnableVertexAttribArray(GLuint index)
2432{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002433 EVENT("(GLuint index = %d)", index);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002434
2435 try
2436 {
2437 if (index >= gl::MAX_VERTEX_ATTRIBS)
2438 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002439 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002440 }
2441
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002442 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002443
2444 if (context)
2445 {
daniel@transgaming.com83921382011-01-08 05:46:00 +00002446 context->setEnableVertexAttribArray(index, true);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002447 }
2448 }
2449 catch(std::bad_alloc&)
2450 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002451 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002452 }
2453}
2454
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00002455void __stdcall glEndQueryEXT(GLenum target)
2456{
2457 EVENT("GLenum target = 0x%X)", target);
2458
2459 try
2460 {
2461 switch (target)
2462 {
2463 case GL_ANY_SAMPLES_PASSED_EXT:
2464 case GL_ANY_SAMPLES_PASSED_CONSERVATIVE_EXT:
2465 break;
2466 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002467 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00002468 }
2469
2470 gl::Context *context = gl::getNonLostContext();
2471
2472 if (context)
2473 {
2474 context->endQuery(target);
2475 }
2476 }
2477 catch(std::bad_alloc&)
2478 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002479 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00002480 }
2481}
2482
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002483void __stdcall glFinishFenceNV(GLuint fence)
2484{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002485 EVENT("(GLuint fence = %d)", fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002486
2487 try
2488 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002489 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002490
2491 if (context)
2492 {
2493 gl::Fence* fenceObject = context->getFence(fence);
2494
2495 if (fenceObject == NULL)
2496 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002497 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002498 }
2499
2500 fenceObject->finishFence();
2501 }
2502 }
2503 catch(std::bad_alloc&)
2504 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002505 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002506 }
2507}
2508
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002509void __stdcall glFinish(void)
2510{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002511 EVENT("()");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002512
2513 try
2514 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002515 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002516
2517 if (context)
2518 {
daniel@transgaming.com0d86aa72011-10-26 02:35:10 +00002519 context->sync(true);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002520 }
2521 }
2522 catch(std::bad_alloc&)
2523 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002524 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002525 }
2526}
2527
2528void __stdcall glFlush(void)
2529{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002530 EVENT("()");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002531
2532 try
2533 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002534 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002535
2536 if (context)
2537 {
daniel@transgaming.com0d86aa72011-10-26 02:35:10 +00002538 context->sync(false);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002539 }
2540 }
2541 catch(std::bad_alloc&)
2542 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002543 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002544 }
2545}
2546
2547void __stdcall glFramebufferRenderbuffer(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer)
2548{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002549 EVENT("(GLenum target = 0x%X, GLenum attachment = 0x%X, GLenum renderbuffertarget = 0x%X, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00002550 "GLuint renderbuffer = %d)", target, attachment, renderbuffertarget, renderbuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002551
2552 try
2553 {
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002554 if ((target != GL_FRAMEBUFFER && target != GL_DRAW_FRAMEBUFFER_ANGLE && target != GL_READ_FRAMEBUFFER_ANGLE)
daniel@transgaming.com2fa45512011-10-04 18:43:18 +00002555 || (renderbuffertarget != GL_RENDERBUFFER && renderbuffer != 0))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002556 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002557 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002558 }
2559
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002560 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002561
2562 if (context)
2563 {
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002564 gl::Framebuffer *framebuffer = NULL;
2565 GLuint framebufferHandle = 0;
2566 if (target == GL_READ_FRAMEBUFFER_ANGLE)
2567 {
2568 framebuffer = context->getReadFramebuffer();
2569 framebufferHandle = context->getReadFramebufferHandle();
2570 }
daniel@transgaming.com2fa45512011-10-04 18:43:18 +00002571 else
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002572 {
2573 framebuffer = context->getDrawFramebuffer();
2574 framebufferHandle = context->getDrawFramebufferHandle();
2575 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002576
daniel@transgaming.com2fa45512011-10-04 18:43:18 +00002577 if (!framebuffer || (framebufferHandle == 0 && renderbuffer != 0))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002578 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002579 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002580 }
2581
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002582 if (attachment >= GL_COLOR_ATTACHMENT0_EXT && attachment <= GL_COLOR_ATTACHMENT15_EXT)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002583 {
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002584 const unsigned int colorAttachment = (attachment - GL_COLOR_ATTACHMENT0_EXT);
2585
2586 if (colorAttachment >= context->getMaximumRenderTargets())
2587 {
2588 return gl::error(GL_INVALID_VALUE);
2589 }
2590
2591 framebuffer->setColorbuffer(colorAttachment, GL_RENDERBUFFER, renderbuffer);
2592 }
2593 else
2594 {
2595 switch (attachment)
2596 {
2597 case GL_DEPTH_ATTACHMENT:
2598 framebuffer->setDepthbuffer(GL_RENDERBUFFER, renderbuffer);
2599 break;
2600 case GL_STENCIL_ATTACHMENT:
2601 framebuffer->setStencilbuffer(GL_RENDERBUFFER, renderbuffer);
2602 break;
2603 default:
2604 return gl::error(GL_INVALID_ENUM);
2605 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002606 }
2607 }
2608 }
2609 catch(std::bad_alloc&)
2610 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002611 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002612 }
2613}
2614
2615void __stdcall glFramebufferTexture2D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level)
2616{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002617 EVENT("(GLenum target = 0x%X, GLenum attachment = 0x%X, GLenum textarget = 0x%X, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00002618 "GLuint texture = %d, GLint level = %d)", target, attachment, textarget, texture, level);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002619
2620 try
2621 {
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002622 if (target != GL_FRAMEBUFFER && target != GL_DRAW_FRAMEBUFFER_ANGLE && target != GL_READ_FRAMEBUFFER_ANGLE)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002623 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002624 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002625 }
2626
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002627 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002628
2629 if (context)
2630 {
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002631 if (attachment >= GL_COLOR_ATTACHMENT0_EXT && attachment <= GL_COLOR_ATTACHMENT15_EXT)
2632 {
2633 const unsigned int colorAttachment = (attachment - GL_COLOR_ATTACHMENT0_EXT);
2634
2635 if (colorAttachment >= context->getMaximumRenderTargets())
2636 {
2637 return gl::error(GL_INVALID_VALUE);
2638 }
2639 }
2640 else
2641 {
2642 switch (attachment)
2643 {
2644 case GL_DEPTH_ATTACHMENT:
2645 case GL_STENCIL_ATTACHMENT:
2646 break;
2647 default:
2648 return gl::error(GL_INVALID_ENUM);
2649 }
2650 }
2651
daniel@transgaming.com93a81472010-04-20 18:52:58 +00002652 if (texture == 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002653 {
daniel@transgaming.com93a81472010-04-20 18:52:58 +00002654 textarget = GL_NONE;
2655 }
2656 else
2657 {
2658 gl::Texture *tex = context->getTexture(texture);
2659
2660 if (tex == NULL)
2661 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002662 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com93a81472010-04-20 18:52:58 +00002663 }
2664
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002665 switch (textarget)
2666 {
2667 case GL_TEXTURE_2D:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002668 {
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00002669 if (tex->getTarget() != GL_TEXTURE_2D)
2670 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002671 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00002672 }
2673 gl::Texture2D *tex2d = static_cast<gl::Texture2D *>(tex);
daniel@transgaming.com92f49922012-05-09 15:49:19 +00002674 if (tex2d->isCompressed(0))
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00002675 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002676 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00002677 }
2678 break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002679 }
daniel@transgaming.com93a81472010-04-20 18:52:58 +00002680
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002681 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002682 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002683 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002684 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002685 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002686 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
daniel@transgaming.com93a81472010-04-20 18:52:58 +00002687 {
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00002688 if (tex->getTarget() != GL_TEXTURE_CUBE_MAP)
2689 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002690 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00002691 }
2692 gl::TextureCubeMap *texcube = static_cast<gl::TextureCubeMap *>(tex);
daniel@transgaming.com4df88e82012-05-09 15:49:24 +00002693 if (texcube->isCompressed(textarget, level))
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00002694 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002695 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00002696 }
2697 break;
daniel@transgaming.com93a81472010-04-20 18:52:58 +00002698 }
daniel@transgaming.com93a81472010-04-20 18:52:58 +00002699
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002700 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002701 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002702 }
2703
2704 if (level != 0)
2705 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002706 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002707 }
2708 }
2709
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002710 gl::Framebuffer *framebuffer = NULL;
2711 GLuint framebufferHandle = 0;
2712 if (target == GL_READ_FRAMEBUFFER_ANGLE)
2713 {
2714 framebuffer = context->getReadFramebuffer();
2715 framebufferHandle = context->getReadFramebufferHandle();
2716 }
2717 else
2718 {
2719 framebuffer = context->getDrawFramebuffer();
2720 framebufferHandle = context->getDrawFramebufferHandle();
2721 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002722
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002723 if (framebufferHandle == 0 || !framebuffer)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002724 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002725 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002726 }
2727
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002728 if (attachment >= GL_COLOR_ATTACHMENT0_EXT && attachment <= GL_COLOR_ATTACHMENT15_EXT)
daniel@transgaming.comfbc09532010-04-26 15:33:41 +00002729 {
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002730 const unsigned int colorAttachment = (attachment - GL_COLOR_ATTACHMENT0_EXT);
2731
2732 if (colorAttachment >= context->getMaximumRenderTargets())
2733 {
2734 return gl::error(GL_INVALID_VALUE);
2735 }
2736
2737 framebuffer->setColorbuffer(colorAttachment, textarget, texture);
2738 }
2739 else
2740 {
2741 switch (attachment)
2742 {
2743 case GL_DEPTH_ATTACHMENT: framebuffer->setDepthbuffer(textarget, texture); break;
2744 case GL_STENCIL_ATTACHMENT: framebuffer->setStencilbuffer(textarget, texture); break;
2745 }
daniel@transgaming.comfbc09532010-04-26 15:33:41 +00002746 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002747 }
2748 }
2749 catch(std::bad_alloc&)
2750 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002751 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002752 }
2753}
2754
2755void __stdcall glFrontFace(GLenum mode)
2756{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002757 EVENT("(GLenum mode = 0x%X)", mode);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002758
2759 try
2760 {
2761 switch (mode)
2762 {
2763 case GL_CW:
2764 case GL_CCW:
2765 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002766 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002767
2768 if (context)
2769 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00002770 context->setFrontFace(mode);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002771 }
2772 }
2773 break;
2774 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002775 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002776 }
2777 }
2778 catch(std::bad_alloc&)
2779 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002780 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002781 }
2782}
2783
2784void __stdcall glGenBuffers(GLsizei n, GLuint* buffers)
2785{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002786 EVENT("(GLsizei n = %d, GLuint* buffers = 0x%0.8p)", n, buffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002787
2788 try
2789 {
2790 if (n < 0)
2791 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002792 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002793 }
2794
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002795 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002796
2797 if (context)
2798 {
2799 for (int i = 0; i < n; i++)
2800 {
2801 buffers[i] = context->createBuffer();
2802 }
2803 }
2804 }
2805 catch(std::bad_alloc&)
2806 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002807 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002808 }
2809}
2810
2811void __stdcall glGenerateMipmap(GLenum target)
2812{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002813 EVENT("(GLenum target = 0x%X)", target);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002814
2815 try
2816 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002817 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com8fd99e22010-04-20 18:52:00 +00002818
2819 if (context)
2820 {
daniel@transgaming.com8fd99e22010-04-20 18:52:00 +00002821 switch (target)
2822 {
2823 case GL_TEXTURE_2D:
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00002824 {
2825 gl::Texture2D *tex2d = context->getTexture2D();
2826
daniel@transgaming.com92f49922012-05-09 15:49:19 +00002827 if (tex2d->isCompressed(0))
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00002828 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002829 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00002830 }
daniel@transgaming.com0c854682012-05-31 01:14:11 +00002831 if (tex2d->isDepth(0))
2832 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002833 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com0c854682012-05-31 01:14:11 +00002834 }
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00002835
2836 tex2d->generateMipmaps();
2837 break;
2838 }
daniel@transgaming.com8fd99e22010-04-20 18:52:00 +00002839
2840 case GL_TEXTURE_CUBE_MAP:
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00002841 {
2842 gl::TextureCubeMap *texcube = context->getTextureCubeMap();
2843
daniel@transgaming.com4df88e82012-05-09 15:49:24 +00002844 if (texcube->isCompressed(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0))
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00002845 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002846 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00002847 }
2848
2849 texcube->generateMipmaps();
2850 break;
2851 }
daniel@transgaming.com8fd99e22010-04-20 18:52:00 +00002852
2853 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002854 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com8fd99e22010-04-20 18:52:00 +00002855 }
daniel@transgaming.com8fd99e22010-04-20 18:52:00 +00002856 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002857 }
2858 catch(std::bad_alloc&)
2859 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002860 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002861 }
2862}
2863
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002864void __stdcall glGenFencesNV(GLsizei n, GLuint* fences)
2865{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002866 EVENT("(GLsizei n = %d, GLuint* fences = 0x%0.8p)", n, fences);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002867
2868 try
2869 {
2870 if (n < 0)
2871 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002872 return gl::error(GL_INVALID_VALUE);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002873 }
2874
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002875 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002876
2877 if (context)
2878 {
2879 for (int i = 0; i < n; i++)
2880 {
2881 fences[i] = context->createFence();
2882 }
2883 }
2884 }
2885 catch(std::bad_alloc&)
2886 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002887 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002888 }
2889}
2890
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002891void __stdcall glGenFramebuffers(GLsizei n, GLuint* framebuffers)
2892{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002893 EVENT("(GLsizei n = %d, GLuint* framebuffers = 0x%0.8p)", n, framebuffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002894
2895 try
2896 {
2897 if (n < 0)
2898 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002899 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002900 }
2901
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002902 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002903
2904 if (context)
2905 {
2906 for (int i = 0; i < n; i++)
2907 {
2908 framebuffers[i] = context->createFramebuffer();
2909 }
2910 }
2911 }
2912 catch(std::bad_alloc&)
2913 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002914 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002915 }
2916}
2917
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00002918void __stdcall glGenQueriesEXT(GLsizei n, GLuint* ids)
2919{
2920 EVENT("(GLsizei n = %d, GLuint* ids = 0x%0.8p)", n, ids);
2921
2922 try
2923 {
2924 if (n < 0)
2925 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002926 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00002927 }
2928
2929 gl::Context *context = gl::getNonLostContext();
2930
2931 if (context)
2932 {
2933 for (int i = 0; i < n; i++)
2934 {
2935 ids[i] = context->createQuery();
2936 }
2937 }
2938 }
2939 catch(std::bad_alloc&)
2940 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002941 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00002942 }
2943}
2944
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002945void __stdcall glGenRenderbuffers(GLsizei n, GLuint* renderbuffers)
2946{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002947 EVENT("(GLsizei n = %d, GLuint* renderbuffers = 0x%0.8p)", n, renderbuffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002948
2949 try
2950 {
2951 if (n < 0)
2952 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002953 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002954 }
2955
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002956 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002957
2958 if (context)
2959 {
2960 for (int i = 0; i < n; i++)
2961 {
2962 renderbuffers[i] = context->createRenderbuffer();
2963 }
2964 }
2965 }
2966 catch(std::bad_alloc&)
2967 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002968 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002969 }
2970}
2971
2972void __stdcall glGenTextures(GLsizei n, GLuint* textures)
2973{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002974 EVENT("(GLsizei n = %d, GLuint* textures = 0x%0.8p)", n, textures);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002975
2976 try
2977 {
2978 if (n < 0)
2979 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002980 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002981 }
2982
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002983 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002984
2985 if (context)
2986 {
2987 for (int i = 0; i < n; i++)
2988 {
2989 textures[i] = context->createTexture();
2990 }
2991 }
2992 }
2993 catch(std::bad_alloc&)
2994 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002995 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002996 }
2997}
2998
daniel@transgaming.com85423182010-04-22 13:35:27 +00002999void __stdcall glGetActiveAttrib(GLuint program, GLuint index, GLsizei bufsize, GLsizei *length, GLint *size, GLenum *type, GLchar *name)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003000{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003001 EVENT("(GLuint program = %d, GLuint index = %d, GLsizei bufsize = %d, GLsizei *length = 0x%0.8p, "
daniel@transgaming.com85423182010-04-22 13:35:27 +00003002 "GLint *size = 0x%0.8p, GLenum *type = %0.8p, GLchar *name = %0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003003 program, index, bufsize, length, size, type, name);
3004
3005 try
3006 {
3007 if (bufsize < 0)
3008 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003009 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003010 }
3011
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003012 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com85423182010-04-22 13:35:27 +00003013
3014 if (context)
3015 {
3016 gl::Program *programObject = context->getProgram(program);
3017
3018 if (!programObject)
3019 {
3020 if (context->getShader(program))
3021 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003022 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com85423182010-04-22 13:35:27 +00003023 }
3024 else
3025 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003026 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com85423182010-04-22 13:35:27 +00003027 }
3028 }
3029
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00003030 if (index >= (GLuint)programObject->getActiveAttributeCount())
daniel@transgaming.com85423182010-04-22 13:35:27 +00003031 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003032 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com85423182010-04-22 13:35:27 +00003033 }
3034
3035 programObject->getActiveAttribute(index, bufsize, length, size, type, name);
3036 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003037 }
3038 catch(std::bad_alloc&)
3039 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003040 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003041 }
3042}
3043
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00003044void __stdcall glGetActiveUniform(GLuint program, GLuint index, GLsizei bufsize, GLsizei* length, GLint* size, GLenum* type, GLchar* name)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003045{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003046 EVENT("(GLuint program = %d, GLuint index = %d, GLsizei bufsize = %d, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00003047 "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 +00003048 program, index, bufsize, length, size, type, name);
3049
3050 try
3051 {
3052 if (bufsize < 0)
3053 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003054 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003055 }
3056
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003057 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00003058
3059 if (context)
3060 {
3061 gl::Program *programObject = context->getProgram(program);
3062
3063 if (!programObject)
3064 {
3065 if (context->getShader(program))
3066 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003067 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00003068 }
3069 else
3070 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003071 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00003072 }
3073 }
3074
3075 if (index >= (GLuint)programObject->getActiveUniformCount())
3076 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003077 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00003078 }
3079
3080 programObject->getActiveUniform(index, bufsize, length, size, type, name);
3081 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003082 }
3083 catch(std::bad_alloc&)
3084 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003085 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003086 }
3087}
3088
3089void __stdcall glGetAttachedShaders(GLuint program, GLsizei maxcount, GLsizei* count, GLuint* shaders)
3090{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003091 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 +00003092 program, maxcount, count, shaders);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003093
3094 try
3095 {
3096 if (maxcount < 0)
3097 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003098 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003099 }
3100
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003101 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com6c785212010-03-30 03:36:17 +00003102
3103 if (context)
3104 {
3105 gl::Program *programObject = context->getProgram(program);
3106
3107 if (!programObject)
3108 {
daniel@transgaming.com23953e32010-04-13 19:53:31 +00003109 if (context->getShader(program))
3110 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003111 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com23953e32010-04-13 19:53:31 +00003112 }
3113 else
3114 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003115 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com23953e32010-04-13 19:53:31 +00003116 }
daniel@transgaming.com6c785212010-03-30 03:36:17 +00003117 }
3118
3119 return programObject->getAttachedShaders(maxcount, count, shaders);
3120 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003121 }
3122 catch(std::bad_alloc&)
3123 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003124 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003125 }
3126}
3127
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00003128int __stdcall glGetAttribLocation(GLuint program, const GLchar* name)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003129{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003130 EVENT("(GLuint program = %d, const GLchar* name = %s)", program, name);
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.com4f39fd92010-03-08 20:26:45 +00003135
3136 if (context)
3137 {
daniel@transgaming.combb274c32010-04-13 03:26:21 +00003138
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003139 gl::Program *programObject = context->getProgram(program);
3140
3141 if (!programObject)
3142 {
daniel@transgaming.combb274c32010-04-13 03:26:21 +00003143 if (context->getShader(program))
3144 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003145 return gl::error(GL_INVALID_OPERATION, -1);
daniel@transgaming.combb274c32010-04-13 03:26:21 +00003146 }
3147 else
3148 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003149 return gl::error(GL_INVALID_VALUE, -1);
daniel@transgaming.combb274c32010-04-13 03:26:21 +00003150 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003151 }
3152
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003153 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
daniel@transgaming.com716056c2012-07-24 18:38:59 +00003154 if (!programObject->isLinked() || !programBinary)
daniel@transgaming.comcf4aa872010-04-13 03:26:27 +00003155 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003156 return gl::error(GL_INVALID_OPERATION, -1);
daniel@transgaming.comcf4aa872010-04-13 03:26:27 +00003157 }
3158
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003159 return programBinary->getAttributeLocation(name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003160 }
3161 }
3162 catch(std::bad_alloc&)
3163 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003164 return gl::error(GL_OUT_OF_MEMORY, -1);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003165 }
3166
3167 return -1;
3168}
3169
3170void __stdcall glGetBooleanv(GLenum pname, GLboolean* params)
3171{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003172 EVENT("(GLenum pname = 0x%X, GLboolean* params = 0x%0.8p)", pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003173
3174 try
3175 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003176 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003177
3178 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003179 {
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003180 if (!(context->getBooleanv(pname, params)))
3181 {
3182 GLenum nativeType;
3183 unsigned int numParams = 0;
3184 if (!context->getQueryParameterInfo(pname, &nativeType, &numParams))
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003185 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003186
3187 if (numParams == 0)
3188 return; // it is known that the pname is valid, but there are no parameters to return
3189
3190 if (nativeType == GL_FLOAT)
3191 {
3192 GLfloat *floatParams = NULL;
3193 floatParams = new GLfloat[numParams];
3194
3195 context->getFloatv(pname, floatParams);
3196
3197 for (unsigned int i = 0; i < numParams; ++i)
3198 {
3199 if (floatParams[i] == 0.0f)
3200 params[i] = GL_FALSE;
3201 else
3202 params[i] = GL_TRUE;
3203 }
3204
3205 delete [] floatParams;
3206 }
3207 else if (nativeType == GL_INT)
3208 {
3209 GLint *intParams = NULL;
3210 intParams = new GLint[numParams];
3211
3212 context->getIntegerv(pname, intParams);
3213
3214 for (unsigned int i = 0; i < numParams; ++i)
3215 {
3216 if (intParams[i] == 0)
3217 params[i] = GL_FALSE;
3218 else
3219 params[i] = GL_TRUE;
3220 }
3221
3222 delete [] intParams;
3223 }
3224 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003225 }
3226 }
3227 catch(std::bad_alloc&)
3228 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003229 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003230 }
3231}
3232
3233void __stdcall glGetBufferParameteriv(GLenum target, GLenum pname, GLint* params)
3234{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003235 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 +00003236
3237 try
3238 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003239 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comaa0ccbd2010-04-15 20:45:05 +00003240
3241 if (context)
3242 {
3243 gl::Buffer *buffer;
3244
3245 switch (target)
3246 {
3247 case GL_ARRAY_BUFFER:
3248 buffer = context->getArrayBuffer();
3249 break;
3250 case GL_ELEMENT_ARRAY_BUFFER:
3251 buffer = context->getElementArrayBuffer();
3252 break;
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003253 default: return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comaa0ccbd2010-04-15 20:45:05 +00003254 }
3255
3256 if (!buffer)
3257 {
3258 // A null buffer means that "0" is bound to the requested buffer target
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003259 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comaa0ccbd2010-04-15 20:45:05 +00003260 }
3261
3262 switch (pname)
3263 {
3264 case GL_BUFFER_USAGE:
3265 *params = buffer->usage();
3266 break;
3267 case GL_BUFFER_SIZE:
3268 *params = buffer->size();
3269 break;
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003270 default: return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comaa0ccbd2010-04-15 20:45:05 +00003271 }
3272 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003273 }
3274 catch(std::bad_alloc&)
3275 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003276 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003277 }
3278}
3279
3280GLenum __stdcall glGetError(void)
3281{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003282 EVENT("()");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003283
3284 gl::Context *context = gl::getContext();
3285
3286 if (context)
3287 {
daniel@transgaming.com82b28912011-12-12 21:01:35 +00003288 return context->getError();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003289 }
3290
3291 return GL_NO_ERROR;
3292}
3293
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00003294void __stdcall glGetFenceivNV(GLuint fence, GLenum pname, GLint *params)
3295{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003296 EVENT("(GLuint fence = %d, GLenum pname = 0x%X, GLint *params = 0x%0.8p)", fence, pname, params);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00003297
3298 try
3299 {
3300
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003301 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00003302
3303 if (context)
3304 {
3305 gl::Fence *fenceObject = context->getFence(fence);
3306
3307 if (fenceObject == NULL)
3308 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003309 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00003310 }
3311
3312 fenceObject->getFenceiv(pname, params);
3313 }
3314 }
3315 catch(std::bad_alloc&)
3316 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003317 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00003318 }
3319}
3320
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003321void __stdcall glGetFloatv(GLenum pname, GLfloat* params)
3322{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003323 EVENT("(GLenum pname = 0x%X, GLfloat* params = 0x%0.8p)", pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003324
3325 try
3326 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003327 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com32e58cd2010-03-24 09:44:10 +00003328
3329 if (context)
3330 {
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003331 if (!(context->getFloatv(pname, params)))
daniel@transgaming.com32e58cd2010-03-24 09:44:10 +00003332 {
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003333 GLenum nativeType;
3334 unsigned int numParams = 0;
3335 if (!context->getQueryParameterInfo(pname, &nativeType, &numParams))
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003336 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003337
3338 if (numParams == 0)
3339 return; // it is known that the pname is valid, but that there are no parameters to return.
3340
3341 if (nativeType == GL_BOOL)
3342 {
3343 GLboolean *boolParams = NULL;
3344 boolParams = new GLboolean[numParams];
3345
3346 context->getBooleanv(pname, boolParams);
3347
3348 for (unsigned int i = 0; i < numParams; ++i)
3349 {
3350 if (boolParams[i] == GL_FALSE)
3351 params[i] = 0.0f;
3352 else
3353 params[i] = 1.0f;
3354 }
3355
3356 delete [] boolParams;
3357 }
3358 else if (nativeType == GL_INT)
3359 {
3360 GLint *intParams = NULL;
3361 intParams = new GLint[numParams];
3362
3363 context->getIntegerv(pname, intParams);
3364
3365 for (unsigned int i = 0; i < numParams; ++i)
3366 {
3367 params[i] = (GLfloat)intParams[i];
3368 }
3369
3370 delete [] intParams;
3371 }
daniel@transgaming.com32e58cd2010-03-24 09:44:10 +00003372 }
3373 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003374 }
3375 catch(std::bad_alloc&)
3376 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003377 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003378 }
3379}
3380
3381void __stdcall glGetFramebufferAttachmentParameteriv(GLenum target, GLenum attachment, GLenum pname, GLint* params)
3382{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003383 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 +00003384 target, attachment, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003385
3386 try
3387 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003388 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003389
3390 if (context)
3391 {
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00003392 if (target != GL_FRAMEBUFFER && target != GL_DRAW_FRAMEBUFFER_ANGLE && target != GL_READ_FRAMEBUFFER_ANGLE)
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003393 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003394 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003395 }
3396
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00003397 gl::Framebuffer *framebuffer = NULL;
3398 if (target == GL_READ_FRAMEBUFFER_ANGLE)
3399 {
3400 if(context->getReadFramebufferHandle() == 0)
3401 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003402 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00003403 }
3404
3405 framebuffer = context->getReadFramebuffer();
3406 }
3407 else
3408 {
3409 if (context->getDrawFramebufferHandle() == 0)
3410 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003411 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00003412 }
3413
3414 framebuffer = context->getDrawFramebuffer();
3415 }
3416
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003417 GLenum attachmentType;
3418 GLuint attachmentHandle;
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00003419
3420 if (attachment >= GL_COLOR_ATTACHMENT0_EXT && attachment <= GL_COLOR_ATTACHMENT15_EXT)
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003421 {
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00003422 const unsigned int colorAttachment = (attachment - GL_COLOR_ATTACHMENT0_EXT);
3423
3424 if (colorAttachment >= context->getMaximumRenderTargets())
3425 {
3426 return gl::error(GL_INVALID_ENUM);
3427 }
3428
3429 attachmentType = framebuffer->getColorbufferType(colorAttachment);
3430 attachmentHandle = framebuffer->getColorbufferHandle(colorAttachment);
3431 }
3432 else
3433 {
3434 switch (attachment)
3435 {
3436 case GL_DEPTH_ATTACHMENT:
3437 attachmentType = framebuffer->getDepthbufferType();
3438 attachmentHandle = framebuffer->getDepthbufferHandle();
3439 break;
3440 case GL_STENCIL_ATTACHMENT:
3441 attachmentType = framebuffer->getStencilbufferType();
3442 attachmentHandle = framebuffer->getStencilbufferHandle();
3443 break;
3444 default: return gl::error(GL_INVALID_ENUM);
3445 }
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003446 }
3447
3448 GLenum attachmentObjectType; // Type category
daniel@transgaming.comfbc09532010-04-26 15:33:41 +00003449 if (attachmentType == GL_NONE || attachmentType == GL_RENDERBUFFER)
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003450 {
3451 attachmentObjectType = attachmentType;
3452 }
apatrick@chromium.org551022e2012-01-23 19:56:54 +00003453 else if (gl::IsInternalTextureTarget(attachmentType))
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003454 {
3455 attachmentObjectType = GL_TEXTURE;
3456 }
apatrick@chromium.orga1d80592012-01-25 21:52:10 +00003457 else
3458 {
3459 UNREACHABLE();
3460 return;
3461 }
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003462
3463 switch (pname)
3464 {
3465 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE:
3466 *params = attachmentObjectType;
3467 break;
3468 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME:
3469 if (attachmentObjectType == GL_RENDERBUFFER || attachmentObjectType == GL_TEXTURE)
3470 {
3471 *params = attachmentHandle;
3472 }
3473 else
3474 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003475 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003476 }
3477 break;
3478 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL:
3479 if (attachmentObjectType == GL_TEXTURE)
3480 {
3481 *params = 0; // FramebufferTexture2D will not allow level to be set to anything else in GL ES 2.0
3482 }
3483 else
3484 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003485 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003486 }
3487 break;
3488 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE:
3489 if (attachmentObjectType == GL_TEXTURE)
3490 {
daniel@transgaming.com19ffc242010-05-04 03:35:21 +00003491 if (gl::IsCubemapTextureTarget(attachmentType))
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003492 {
3493 *params = attachmentType;
3494 }
3495 else
3496 {
3497 *params = 0;
3498 }
3499 }
3500 else
3501 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003502 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003503 }
3504 break;
3505 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003506 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003507 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003508 }
3509 }
3510 catch(std::bad_alloc&)
3511 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003512 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003513 }
3514}
3515
daniel@transgaming.com17f548c2011-11-09 17:47:02 +00003516GLenum __stdcall glGetGraphicsResetStatusEXT(void)
3517{
3518 EVENT("()");
3519
3520 try
3521 {
3522 gl::Context *context = gl::getContext();
3523
3524 if (context)
3525 {
3526 return context->getResetStatus();
3527 }
3528
3529 return GL_NO_ERROR;
3530 }
3531 catch(std::bad_alloc&)
3532 {
3533 return GL_OUT_OF_MEMORY;
3534 }
3535}
3536
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003537void __stdcall glGetIntegerv(GLenum pname, GLint* params)
3538{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003539 EVENT("(GLenum pname = 0x%X, GLint* params = 0x%0.8p)", pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003540
3541 try
3542 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003543 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003544
3545 if (context)
3546 {
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003547 if (!(context->getIntegerv(pname, params)))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003548 {
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003549 GLenum nativeType;
3550 unsigned int numParams = 0;
3551 if (!context->getQueryParameterInfo(pname, &nativeType, &numParams))
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003552 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003553
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003554 if (numParams == 0)
3555 return; // it is known that pname is valid, but there are no parameters to return
3556
3557 if (nativeType == GL_BOOL)
3558 {
3559 GLboolean *boolParams = NULL;
3560 boolParams = new GLboolean[numParams];
3561
3562 context->getBooleanv(pname, boolParams);
3563
3564 for (unsigned int i = 0; i < numParams; ++i)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003565 {
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003566 if (boolParams[i] == GL_FALSE)
3567 params[i] = 0;
3568 else
3569 params[i] = 1;
3570 }
3571
3572 delete [] boolParams;
3573 }
3574 else if (nativeType == GL_FLOAT)
3575 {
3576 GLfloat *floatParams = NULL;
3577 floatParams = new GLfloat[numParams];
3578
3579 context->getFloatv(pname, floatParams);
3580
3581 for (unsigned int i = 0; i < numParams; ++i)
3582 {
daniel@transgaming.comc1641352010-04-26 15:33:36 +00003583 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 +00003584 {
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003585 params[i] = (GLint)(((GLfloat)(0xFFFFFFFF) * floatParams[i] - 1.0f) / 2.0f);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003586 }
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003587 else
3588 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 +00003589 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003590
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003591 delete [] floatParams;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003592 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003593 }
3594 }
3595 }
3596 catch(std::bad_alloc&)
3597 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003598 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003599 }
3600}
3601
3602void __stdcall glGetProgramiv(GLuint program, GLenum pname, GLint* params)
3603{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003604 EVENT("(GLuint program = %d, GLenum pname = %d, GLint* params = 0x%0.8p)", program, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003605
3606 try
3607 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003608 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003609
3610 if (context)
3611 {
3612 gl::Program *programObject = context->getProgram(program);
3613
3614 if (!programObject)
3615 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003616 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003617 }
3618
3619 switch (pname)
3620 {
3621 case GL_DELETE_STATUS:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003622 *params = programObject->isFlaggedForDeletion();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003623 return;
3624 case GL_LINK_STATUS:
daniel@transgaming.com716056c2012-07-24 18:38:59 +00003625 *params = programObject->isLinked();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003626 return;
3627 case GL_VALIDATE_STATUS:
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00003628 *params = programObject->isValidated();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003629 return;
3630 case GL_INFO_LOG_LENGTH:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003631 *params = programObject->getInfoLogLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003632 return;
3633 case GL_ATTACHED_SHADERS:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003634 *params = programObject->getAttachedShadersCount();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003635 return;
3636 case GL_ACTIVE_ATTRIBUTES:
daniel@transgaming.com85423182010-04-22 13:35:27 +00003637 *params = programObject->getActiveAttributeCount();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003638 return;
3639 case GL_ACTIVE_ATTRIBUTE_MAX_LENGTH:
daniel@transgaming.com85423182010-04-22 13:35:27 +00003640 *params = programObject->getActiveAttributeMaxLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003641 return;
3642 case GL_ACTIVE_UNIFORMS:
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00003643 *params = programObject->getActiveUniformCount();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003644 return;
3645 case GL_ACTIVE_UNIFORM_MAX_LENGTH:
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00003646 *params = programObject->getActiveUniformMaxLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003647 return;
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00003648 case GL_PROGRAM_BINARY_LENGTH_OES:
apatrick@chromium.org90080e32012-07-09 22:15:33 +00003649 *params = programObject->getProgramBinaryLength();
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00003650 return;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003651 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003652 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003653 }
3654 }
3655 }
3656 catch(std::bad_alloc&)
3657 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003658 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003659 }
3660}
3661
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00003662void __stdcall glGetProgramInfoLog(GLuint program, GLsizei bufsize, GLsizei* length, GLchar* infolog)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003663{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003664 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 +00003665 program, bufsize, length, infolog);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003666
3667 try
3668 {
3669 if (bufsize < 0)
3670 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003671 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003672 }
3673
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003674 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003675
3676 if (context)
3677 {
3678 gl::Program *programObject = context->getProgram(program);
3679
3680 if (!programObject)
3681 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003682 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003683 }
3684
3685 programObject->getInfoLog(bufsize, length, infolog);
3686 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003687 }
3688 catch(std::bad_alloc&)
3689 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003690 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003691 }
3692}
3693
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003694void __stdcall glGetQueryivEXT(GLenum target, GLenum pname, GLint *params)
3695{
3696 EVENT("GLenum target = 0x%X, GLenum pname = 0x%X, GLint *params = 0x%0.8p)", target, pname, params);
3697
3698 try
3699 {
3700 switch (pname)
3701 {
3702 case GL_CURRENT_QUERY_EXT:
3703 break;
3704 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003705 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003706 }
3707
3708 gl::Context *context = gl::getNonLostContext();
3709
3710 if (context)
3711 {
3712 params[0] = context->getActiveQuery(target);
3713 }
3714 }
3715 catch(std::bad_alloc&)
3716 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003717 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003718 }
3719}
3720
3721void __stdcall glGetQueryObjectuivEXT(GLuint id, GLenum pname, GLuint *params)
3722{
3723 EVENT("(GLuint id = %d, GLenum pname = 0x%X, GLuint *params = 0x%0.8p)", id, pname, params);
3724
3725 try
3726 {
3727 switch (pname)
3728 {
3729 case GL_QUERY_RESULT_EXT:
3730 case GL_QUERY_RESULT_AVAILABLE_EXT:
3731 break;
3732 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003733 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003734 }
3735 gl::Context *context = gl::getNonLostContext();
3736
3737 if (context)
3738 {
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003739 gl::Query *queryObject = context->getQuery(id, false, GL_NONE);
3740
3741 if (!queryObject)
3742 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003743 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003744 }
3745
3746 if (context->getActiveQuery(queryObject->getType()) == id)
3747 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003748 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003749 }
3750
3751 switch(pname)
3752 {
3753 case GL_QUERY_RESULT_EXT:
3754 params[0] = queryObject->getResult();
3755 break;
3756 case GL_QUERY_RESULT_AVAILABLE_EXT:
3757 params[0] = queryObject->isResultAvailable();
3758 break;
3759 default:
3760 ASSERT(false);
3761 }
3762 }
3763 }
3764 catch(std::bad_alloc&)
3765 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003766 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003767 }
3768}
3769
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003770void __stdcall glGetRenderbufferParameteriv(GLenum target, GLenum pname, GLint* params)
3771{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003772 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 +00003773
3774 try
3775 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003776 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003777
3778 if (context)
3779 {
3780 if (target != GL_RENDERBUFFER)
3781 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003782 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003783 }
3784
daniel@transgaming.com428d1582010-05-04 03:35:25 +00003785 if (context->getRenderbufferHandle() == 0)
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003786 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003787 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003788 }
3789
daniel@transgaming.com428d1582010-05-04 03:35:25 +00003790 gl::Renderbuffer *renderbuffer = context->getRenderbuffer(context->getRenderbufferHandle());
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003791
3792 switch (pname)
3793 {
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +00003794 case GL_RENDERBUFFER_WIDTH: *params = renderbuffer->getWidth(); break;
3795 case GL_RENDERBUFFER_HEIGHT: *params = renderbuffer->getHeight(); break;
3796 case GL_RENDERBUFFER_INTERNAL_FORMAT: *params = renderbuffer->getInternalFormat(); break;
3797 case GL_RENDERBUFFER_RED_SIZE: *params = renderbuffer->getRedSize(); break;
3798 case GL_RENDERBUFFER_GREEN_SIZE: *params = renderbuffer->getGreenSize(); break;
3799 case GL_RENDERBUFFER_BLUE_SIZE: *params = renderbuffer->getBlueSize(); break;
3800 case GL_RENDERBUFFER_ALPHA_SIZE: *params = renderbuffer->getAlphaSize(); break;
3801 case GL_RENDERBUFFER_DEPTH_SIZE: *params = renderbuffer->getDepthSize(); break;
3802 case GL_RENDERBUFFER_STENCIL_SIZE: *params = renderbuffer->getStencilSize(); break;
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00003803 case GL_RENDERBUFFER_SAMPLES_ANGLE:
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +00003804 if (context->getMaxSupportedSamples() != 0)
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00003805 {
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +00003806 *params = renderbuffer->getSamples();
3807 }
3808 else
3809 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003810 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00003811 }
3812 break;
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003813 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003814 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003815 }
3816 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003817 }
3818 catch(std::bad_alloc&)
3819 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003820 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003821 }
3822}
3823
3824void __stdcall glGetShaderiv(GLuint shader, GLenum pname, GLint* params)
3825{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003826 EVENT("(GLuint shader = %d, GLenum pname = %d, GLint* params = 0x%0.8p)", shader, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003827
3828 try
3829 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003830 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003831
3832 if (context)
3833 {
3834 gl::Shader *shaderObject = context->getShader(shader);
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00003835
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003836 if (!shaderObject)
3837 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003838 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003839 }
3840
3841 switch (pname)
3842 {
3843 case GL_SHADER_TYPE:
3844 *params = shaderObject->getType();
3845 return;
3846 case GL_DELETE_STATUS:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003847 *params = shaderObject->isFlaggedForDeletion();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003848 return;
3849 case GL_COMPILE_STATUS:
3850 *params = shaderObject->isCompiled() ? GL_TRUE : GL_FALSE;
3851 return;
3852 case GL_INFO_LOG_LENGTH:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003853 *params = shaderObject->getInfoLogLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003854 return;
3855 case GL_SHADER_SOURCE_LENGTH:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003856 *params = shaderObject->getSourceLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003857 return;
zmo@google.coma574f782011-10-03 21:45:23 +00003858 case GL_TRANSLATED_SHADER_SOURCE_LENGTH_ANGLE:
3859 *params = shaderObject->getTranslatedSourceLength();
3860 return;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003861 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003862 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003863 }
3864 }
3865 }
3866 catch(std::bad_alloc&)
3867 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003868 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003869 }
3870}
3871
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00003872void __stdcall glGetShaderInfoLog(GLuint shader, GLsizei bufsize, GLsizei* length, GLchar* infolog)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003873{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003874 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 +00003875 shader, bufsize, length, infolog);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003876
3877 try
3878 {
3879 if (bufsize < 0)
3880 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003881 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003882 }
3883
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003884 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003885
3886 if (context)
3887 {
3888 gl::Shader *shaderObject = context->getShader(shader);
3889
3890 if (!shaderObject)
3891 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003892 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003893 }
3894
3895 shaderObject->getInfoLog(bufsize, length, infolog);
3896 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003897 }
3898 catch(std::bad_alloc&)
3899 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003900 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003901 }
3902}
3903
3904void __stdcall glGetShaderPrecisionFormat(GLenum shadertype, GLenum precisiontype, GLint* range, GLint* precision)
3905{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003906 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 +00003907 shadertype, precisiontype, range, precision);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003908
3909 try
3910 {
daniel@transgaming.com6c785212010-03-30 03:36:17 +00003911 switch (shadertype)
3912 {
3913 case GL_VERTEX_SHADER:
3914 case GL_FRAGMENT_SHADER:
3915 break;
3916 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003917 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com6c785212010-03-30 03:36:17 +00003918 }
3919
3920 switch (precisiontype)
3921 {
3922 case GL_LOW_FLOAT:
3923 case GL_MEDIUM_FLOAT:
3924 case GL_HIGH_FLOAT:
3925 // Assume IEEE 754 precision
3926 range[0] = 127;
3927 range[1] = 127;
daniel@transgaming.comc5c15382010-04-23 18:34:49 +00003928 *precision = 23;
daniel@transgaming.com6c785212010-03-30 03:36:17 +00003929 break;
3930 case GL_LOW_INT:
3931 case GL_MEDIUM_INT:
3932 case GL_HIGH_INT:
3933 // Some (most) hardware only supports single-precision floating-point numbers,
3934 // which can accurately represent integers up to +/-16777216
3935 range[0] = 24;
3936 range[1] = 24;
daniel@transgaming.comc5c15382010-04-23 18:34:49 +00003937 *precision = 0;
daniel@transgaming.com6c785212010-03-30 03:36:17 +00003938 break;
3939 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003940 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com6c785212010-03-30 03:36:17 +00003941 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003942 }
3943 catch(std::bad_alloc&)
3944 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003945 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003946 }
3947}
3948
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00003949void __stdcall glGetShaderSource(GLuint shader, GLsizei bufsize, GLsizei* length, GLchar* source)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003950{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003951 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 +00003952 shader, bufsize, length, source);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003953
3954 try
3955 {
3956 if (bufsize < 0)
3957 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003958 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003959 }
3960
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003961 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003962
3963 if (context)
3964 {
3965 gl::Shader *shaderObject = context->getShader(shader);
3966
3967 if (!shaderObject)
3968 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003969 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003970 }
3971
3972 shaderObject->getSource(bufsize, length, source);
3973 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003974 }
3975 catch(std::bad_alloc&)
3976 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003977 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003978 }
3979}
3980
zmo@google.coma574f782011-10-03 21:45:23 +00003981void __stdcall glGetTranslatedShaderSourceANGLE(GLuint shader, GLsizei bufsize, GLsizei* length, GLchar* source)
3982{
3983 EVENT("(GLuint shader = %d, GLsizei bufsize = %d, GLsizei* length = 0x%0.8p, GLchar* source = 0x%0.8p)",
3984 shader, bufsize, length, source);
3985
3986 try
3987 {
3988 if (bufsize < 0)
3989 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003990 return gl::error(GL_INVALID_VALUE);
zmo@google.coma574f782011-10-03 21:45:23 +00003991 }
3992
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003993 gl::Context *context = gl::getNonLostContext();
zmo@google.coma574f782011-10-03 21:45:23 +00003994
3995 if (context)
3996 {
3997 gl::Shader *shaderObject = context->getShader(shader);
3998
3999 if (!shaderObject)
4000 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004001 return gl::error(GL_INVALID_OPERATION);
zmo@google.coma574f782011-10-03 21:45:23 +00004002 }
4003
4004 shaderObject->getTranslatedSource(bufsize, length, source);
4005 }
4006 }
4007 catch(std::bad_alloc&)
4008 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004009 return gl::error(GL_OUT_OF_MEMORY);
zmo@google.coma574f782011-10-03 21:45:23 +00004010 }
4011}
4012
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004013const GLubyte* __stdcall glGetString(GLenum name)
4014{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004015 EVENT("(GLenum name = 0x%X)", name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004016
4017 try
4018 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004019 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com3e4c6002010-05-05 18:50:13 +00004020
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004021 switch (name)
4022 {
4023 case GL_VENDOR:
daniel@transgaming.coma0ce7e62011-01-25 14:47:16 +00004024 return (GLubyte*)"Google Inc.";
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004025 case GL_RENDERER:
daniel@transgaming.comc23ff642011-08-16 20:28:45 +00004026 return (GLubyte*)((context != NULL) ? context->getRendererString() : "ANGLE");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004027 case GL_VERSION:
daniel@transgaming.com1825d8e2012-08-27 16:25:29 +00004028 return (GLubyte*)"OpenGL ES 2.0 (ANGLE " VERSION_STRING ")";
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004029 case GL_SHADING_LANGUAGE_VERSION:
daniel@transgaming.com1825d8e2012-08-27 16:25:29 +00004030 return (GLubyte*)"OpenGL ES GLSL ES 1.00 (ANGLE " VERSION_STRING ")";
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004031 case GL_EXTENSIONS:
daniel@transgaming.com3e4c6002010-05-05 18:50:13 +00004032 return (GLubyte*)((context != NULL) ? context->getExtensionString() : "");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004033 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004034 return gl::error(GL_INVALID_ENUM, (GLubyte*)NULL);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004035 }
4036 }
4037 catch(std::bad_alloc&)
4038 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004039 return gl::error(GL_OUT_OF_MEMORY, (GLubyte*)NULL);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004040 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004041}
4042
4043void __stdcall glGetTexParameterfv(GLenum target, GLenum pname, GLfloat* params)
4044{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004045 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 +00004046
4047 try
4048 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004049 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00004050
4051 if (context)
4052 {
4053 gl::Texture *texture;
4054
4055 switch (target)
4056 {
4057 case GL_TEXTURE_2D:
4058 texture = context->getTexture2D();
4059 break;
4060 case GL_TEXTURE_CUBE_MAP:
4061 texture = context->getTextureCubeMap();
4062 break;
shannon.woods%transgaming.com@gtempaccount.comc416e1c2013-04-13 03:45:05 +00004063 case GL_TEXTURE_3D:
4064 if (context->getClientVersion() < 3)
4065 {
4066 return gl::error(GL_INVALID_ENUM);
4067 }
4068 texture = context->getTexture3D();
4069 break;
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00004070 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004071 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00004072 }
4073
4074 switch (pname)
4075 {
4076 case GL_TEXTURE_MAG_FILTER:
4077 *params = (GLfloat)texture->getMagFilter();
4078 break;
4079 case GL_TEXTURE_MIN_FILTER:
4080 *params = (GLfloat)texture->getMinFilter();
4081 break;
4082 case GL_TEXTURE_WRAP_S:
4083 *params = (GLfloat)texture->getWrapS();
4084 break;
4085 case GL_TEXTURE_WRAP_T:
4086 *params = (GLfloat)texture->getWrapT();
4087 break;
shannon.woods%transgaming.com@gtempaccount.com0b3a8df2013-04-13 03:44:51 +00004088 case GL_TEXTURE_WRAP_R:
4089 if (context->getClientVersion() < 3)
4090 {
4091 return gl::error(GL_INVALID_ENUM);
4092 }
4093 *params = (GLfloat)texture->getWrapR();
4094 break;
daniel@transgaming.comd30bd0a2011-11-11 04:10:34 +00004095 case GL_TEXTURE_IMMUTABLE_FORMAT_EXT:
4096 *params = (GLfloat)(texture->isImmutable() ? GL_TRUE : GL_FALSE);
4097 break;
daniel@transgaming.com7d18c172011-11-11 04:18:21 +00004098 case GL_TEXTURE_USAGE_ANGLE:
4099 *params = (GLfloat)texture->getUsage();
4100 break;
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00004101 case GL_TEXTURE_MAX_ANISOTROPY_EXT:
4102 if (!context->supportsTextureFilterAnisotropy())
4103 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004104 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00004105 }
4106 *params = (GLfloat)texture->getMaxAnisotropy();
4107 break;
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00004108 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004109 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00004110 }
4111 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004112 }
4113 catch(std::bad_alloc&)
4114 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004115 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004116 }
4117}
4118
4119void __stdcall glGetTexParameteriv(GLenum target, GLenum pname, GLint* params)
4120{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004121 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 +00004122
4123 try
4124 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004125 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00004126
4127 if (context)
4128 {
4129 gl::Texture *texture;
4130
4131 switch (target)
4132 {
4133 case GL_TEXTURE_2D:
4134 texture = context->getTexture2D();
4135 break;
4136 case GL_TEXTURE_CUBE_MAP:
4137 texture = context->getTextureCubeMap();
4138 break;
shannon.woods%transgaming.com@gtempaccount.comc416e1c2013-04-13 03:45:05 +00004139 case GL_TEXTURE_3D:
4140 if (context->getClientVersion() < 3)
4141 {
4142 return gl::error(GL_INVALID_ENUM);
4143 }
4144 texture = context->getTexture3D();
4145 break;
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00004146 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004147 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00004148 }
4149
4150 switch (pname)
4151 {
4152 case GL_TEXTURE_MAG_FILTER:
4153 *params = texture->getMagFilter();
4154 break;
4155 case GL_TEXTURE_MIN_FILTER:
4156 *params = texture->getMinFilter();
4157 break;
4158 case GL_TEXTURE_WRAP_S:
4159 *params = texture->getWrapS();
4160 break;
4161 case GL_TEXTURE_WRAP_T:
4162 *params = texture->getWrapT();
4163 break;
shannon.woods%transgaming.com@gtempaccount.com0b3a8df2013-04-13 03:44:51 +00004164 case GL_TEXTURE_WRAP_R:
4165 if (context->getClientVersion() < 3)
4166 {
4167 return gl::error(GL_INVALID_ENUM);
4168 }
4169 *params = texture->getWrapR();
4170 break;
daniel@transgaming.comd30bd0a2011-11-11 04:10:34 +00004171 case GL_TEXTURE_IMMUTABLE_FORMAT_EXT:
4172 *params = texture->isImmutable() ? GL_TRUE : GL_FALSE;
4173 break;
daniel@transgaming.com7d18c172011-11-11 04:18:21 +00004174 case GL_TEXTURE_USAGE_ANGLE:
4175 *params = texture->getUsage();
4176 break;
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00004177 case GL_TEXTURE_MAX_ANISOTROPY_EXT:
4178 if (!context->supportsTextureFilterAnisotropy())
4179 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004180 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00004181 }
4182 *params = (GLint)texture->getMaxAnisotropy();
4183 break;
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00004184 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004185 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00004186 }
4187 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004188 }
4189 catch(std::bad_alloc&)
4190 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004191 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004192 }
4193}
4194
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004195void __stdcall glGetnUniformfvEXT(GLuint program, GLint location, GLsizei bufSize, GLfloat* params)
4196{
4197 EVENT("(GLuint program = %d, GLint location = %d, GLsizei bufSize = %d, GLfloat* params = 0x%0.8p)",
4198 program, location, bufSize, params);
4199
4200 try
4201 {
4202 if (bufSize < 0)
4203 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004204 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004205 }
4206
4207 gl::Context *context = gl::getNonLostContext();
4208
4209 if (context)
4210 {
4211 if (program == 0)
4212 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004213 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004214 }
4215
4216 gl::Program *programObject = context->getProgram(program);
4217
daniel@transgaming.com716056c2012-07-24 18:38:59 +00004218 if (!programObject || !programObject->isLinked())
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004219 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004220 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004221 }
4222
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00004223 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
4224 if (!programBinary)
4225 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004226 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00004227 }
4228
4229 if (!programBinary->getUniformfv(location, &bufSize, params))
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004230 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004231 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004232 }
4233 }
4234 }
4235 catch(std::bad_alloc&)
4236 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004237 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004238 }
4239}
4240
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004241void __stdcall glGetUniformfv(GLuint program, GLint location, GLfloat* params)
4242{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004243 EVENT("(GLuint program = %d, GLint location = %d, GLfloat* params = 0x%0.8p)", program, location, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004244
4245 try
4246 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004247 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004248
4249 if (context)
4250 {
4251 if (program == 0)
4252 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004253 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004254 }
4255
4256 gl::Program *programObject = context->getProgram(program);
4257
daniel@transgaming.com716056c2012-07-24 18:38:59 +00004258 if (!programObject || !programObject->isLinked())
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004259 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004260 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004261 }
4262
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00004263 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
4264 if (!programBinary)
4265 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004266 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00004267 }
4268
4269 if (!programBinary->getUniformfv(location, NULL, params))
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004270 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004271 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004272 }
4273 }
4274 }
4275 catch(std::bad_alloc&)
4276 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004277 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004278 }
4279}
4280
4281void __stdcall glGetnUniformivEXT(GLuint program, GLint location, GLsizei bufSize, GLint* params)
4282{
4283 EVENT("(GLuint program = %d, GLint location = %d, GLsizei bufSize = %d, GLint* params = 0x%0.8p)",
4284 program, location, bufSize, params);
4285
4286 try
4287 {
4288 if (bufSize < 0)
4289 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004290 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004291 }
4292
4293 gl::Context *context = gl::getNonLostContext();
4294
4295 if (context)
4296 {
4297 if (program == 0)
4298 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004299 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004300 }
4301
4302 gl::Program *programObject = context->getProgram(program);
4303
daniel@transgaming.com716056c2012-07-24 18:38:59 +00004304 if (!programObject || !programObject->isLinked())
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004305 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004306 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004307 }
4308
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00004309 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
4310 if (!programBinary)
4311 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004312 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00004313 }
4314
4315 if (!programBinary->getUniformiv(location, &bufSize, params))
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004316 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004317 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004318 }
4319 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004320 }
4321 catch(std::bad_alloc&)
4322 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004323 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004324 }
4325}
4326
4327void __stdcall glGetUniformiv(GLuint program, GLint location, GLint* params)
4328{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004329 EVENT("(GLuint program = %d, GLint location = %d, GLint* params = 0x%0.8p)", program, location, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004330
4331 try
4332 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004333 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004334
4335 if (context)
4336 {
4337 if (program == 0)
4338 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004339 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004340 }
4341
4342 gl::Program *programObject = context->getProgram(program);
4343
daniel@transgaming.com716056c2012-07-24 18:38:59 +00004344 if (!programObject || !programObject->isLinked())
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004345 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004346 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004347 }
4348
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00004349 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
4350 if (!programBinary)
4351 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004352 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00004353 }
4354
4355 if (!programBinary->getUniformiv(location, NULL, params))
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004356 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004357 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004358 }
4359 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004360 }
4361 catch(std::bad_alloc&)
4362 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004363 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004364 }
4365}
4366
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00004367int __stdcall glGetUniformLocation(GLuint program, const GLchar* name)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004368{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004369 EVENT("(GLuint program = %d, const GLchar* name = 0x%0.8p)", program, name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004370
4371 try
4372 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004373 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004374
4375 if (strstr(name, "gl_") == name)
4376 {
4377 return -1;
4378 }
4379
4380 if (context)
4381 {
4382 gl::Program *programObject = context->getProgram(program);
4383
4384 if (!programObject)
4385 {
daniel@transgaming.comd1abe5b2010-04-13 19:53:33 +00004386 if (context->getShader(program))
4387 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004388 return gl::error(GL_INVALID_OPERATION, -1);
daniel@transgaming.comd1abe5b2010-04-13 19:53:33 +00004389 }
4390 else
4391 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004392 return gl::error(GL_INVALID_VALUE, -1);
daniel@transgaming.comd1abe5b2010-04-13 19:53:33 +00004393 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004394 }
4395
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00004396 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
daniel@transgaming.com716056c2012-07-24 18:38:59 +00004397 if (!programObject->isLinked() || !programBinary)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004398 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004399 return gl::error(GL_INVALID_OPERATION, -1);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004400 }
4401
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00004402 return programBinary->getUniformLocation(name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004403 }
4404 }
4405 catch(std::bad_alloc&)
4406 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004407 return gl::error(GL_OUT_OF_MEMORY, -1);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004408 }
4409
4410 return -1;
4411}
4412
4413void __stdcall glGetVertexAttribfv(GLuint index, GLenum pname, GLfloat* params)
4414{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004415 EVENT("(GLuint index = %d, GLenum pname = 0x%X, GLfloat* params = 0x%0.8p)", index, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004416
4417 try
4418 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004419 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004420
daniel@transgaming.come0078962010-04-15 20:45:08 +00004421 if (context)
4422 {
4423 if (index >= gl::MAX_VERTEX_ATTRIBS)
4424 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004425 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004426 }
4427
daniel@transgaming.com83921382011-01-08 05:46:00 +00004428 const gl::VertexAttribute &attribState = context->getVertexAttribState(index);
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004429
daniel@transgaming.come0078962010-04-15 20:45:08 +00004430 switch (pname)
4431 {
4432 case GL_VERTEX_ATTRIB_ARRAY_ENABLED:
daniel@transgaming.com83921382011-01-08 05:46:00 +00004433 *params = (GLfloat)(attribState.mArrayEnabled ? GL_TRUE : GL_FALSE);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004434 break;
4435 case GL_VERTEX_ATTRIB_ARRAY_SIZE:
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004436 *params = (GLfloat)attribState.mSize;
daniel@transgaming.come0078962010-04-15 20:45:08 +00004437 break;
4438 case GL_VERTEX_ATTRIB_ARRAY_STRIDE:
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004439 *params = (GLfloat)attribState.mStride;
daniel@transgaming.come0078962010-04-15 20:45:08 +00004440 break;
4441 case GL_VERTEX_ATTRIB_ARRAY_TYPE:
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004442 *params = (GLfloat)attribState.mType;
daniel@transgaming.come0078962010-04-15 20:45:08 +00004443 break;
4444 case GL_VERTEX_ATTRIB_ARRAY_NORMALIZED:
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004445 *params = (GLfloat)(attribState.mNormalized ? GL_TRUE : GL_FALSE);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004446 break;
4447 case GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING:
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +00004448 *params = (GLfloat)attribState.mBoundBuffer.id();
daniel@transgaming.come0078962010-04-15 20:45:08 +00004449 break;
4450 case GL_CURRENT_VERTEX_ATTRIB:
4451 for (int i = 0; i < 4; ++i)
4452 {
shannon.woods%transgaming.com@gtempaccount.com3026dc72013-04-13 03:37:27 +00004453 params[i] = attribState.mCurrentValue.FloatValues[i];
daniel@transgaming.come0078962010-04-15 20:45:08 +00004454 }
4455 break;
shannon.woods%transgaming.com@gtempaccount.com14eb55e2013-04-13 03:35:06 +00004456 case GL_VERTEX_ATTRIB_ARRAY_DIVISOR:
4457 // Don't verify ES3 context because GL_VERTEX_ATTRIB_ARRAY_DIVISOR_ANGLE uses
4458 // the same constant.
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00004459 *params = (GLfloat)attribState.mDivisor;
4460 break;
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004461 default: return gl::error(GL_INVALID_ENUM);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004462 }
4463 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004464 }
4465 catch(std::bad_alloc&)
4466 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004467 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004468 }
4469}
4470
4471void __stdcall glGetVertexAttribiv(GLuint index, GLenum pname, GLint* params)
4472{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004473 EVENT("(GLuint index = %d, GLenum pname = 0x%X, GLint* params = 0x%0.8p)", index, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004474
4475 try
4476 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004477 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004478
daniel@transgaming.come0078962010-04-15 20:45:08 +00004479 if (context)
4480 {
4481 if (index >= gl::MAX_VERTEX_ATTRIBS)
4482 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004483 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004484 }
4485
daniel@transgaming.com83921382011-01-08 05:46:00 +00004486 const gl::VertexAttribute &attribState = context->getVertexAttribState(index);
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004487
daniel@transgaming.come0078962010-04-15 20:45:08 +00004488 switch (pname)
4489 {
4490 case GL_VERTEX_ATTRIB_ARRAY_ENABLED:
daniel@transgaming.com83921382011-01-08 05:46:00 +00004491 *params = (attribState.mArrayEnabled ? GL_TRUE : GL_FALSE);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004492 break;
4493 case GL_VERTEX_ATTRIB_ARRAY_SIZE:
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004494 *params = attribState.mSize;
daniel@transgaming.come0078962010-04-15 20:45:08 +00004495 break;
4496 case GL_VERTEX_ATTRIB_ARRAY_STRIDE:
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004497 *params = attribState.mStride;
daniel@transgaming.come0078962010-04-15 20:45:08 +00004498 break;
4499 case GL_VERTEX_ATTRIB_ARRAY_TYPE:
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004500 *params = attribState.mType;
daniel@transgaming.come0078962010-04-15 20:45:08 +00004501 break;
4502 case GL_VERTEX_ATTRIB_ARRAY_NORMALIZED:
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004503 *params = (attribState.mNormalized ? GL_TRUE : GL_FALSE);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004504 break;
4505 case GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING:
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +00004506 *params = attribState.mBoundBuffer.id();
daniel@transgaming.come0078962010-04-15 20:45:08 +00004507 break;
4508 case GL_CURRENT_VERTEX_ATTRIB:
4509 for (int i = 0; i < 4; ++i)
4510 {
shannon.woods%transgaming.com@gtempaccount.com3026dc72013-04-13 03:37:27 +00004511 float currentValue = attribState.mCurrentValue.FloatValues[i];
daniel@transgaming.come0078962010-04-15 20:45:08 +00004512 params[i] = (GLint)(currentValue > 0.0f ? floor(currentValue + 0.5f) : ceil(currentValue - 0.5f));
4513 }
4514 break;
shannon.woods%transgaming.com@gtempaccount.com14eb55e2013-04-13 03:35:06 +00004515 case GL_VERTEX_ATTRIB_ARRAY_DIVISOR:
4516 // Don't verify ES3 context because GL_VERTEX_ATTRIB_ARRAY_DIVISOR_ANGLE uses
4517 // the same constant.
4518 META_ASSERT(GL_VERTEX_ATTRIB_ARRAY_DIVISOR == GL_VERTEX_ATTRIB_ARRAY_DIVISOR_ANGLE);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00004519 *params = (GLint)attribState.mDivisor;
4520 break;
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004521 default: return gl::error(GL_INVALID_ENUM);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004522 }
4523 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004524 }
4525 catch(std::bad_alloc&)
4526 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004527 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004528 }
4529}
4530
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00004531void __stdcall glGetVertexAttribPointerv(GLuint index, GLenum pname, GLvoid** pointer)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004532{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004533 EVENT("(GLuint index = %d, GLenum pname = 0x%X, GLvoid** pointer = 0x%0.8p)", index, pname, pointer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004534
4535 try
4536 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004537 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004538
daniel@transgaming.come0078962010-04-15 20:45:08 +00004539 if (context)
4540 {
4541 if (index >= gl::MAX_VERTEX_ATTRIBS)
4542 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004543 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004544 }
4545
4546 if (pname != GL_VERTEX_ATTRIB_ARRAY_POINTER)
4547 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004548 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004549 }
4550
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004551 *pointer = const_cast<GLvoid*>(context->getVertexAttribPointer(index));
daniel@transgaming.come0078962010-04-15 20:45:08 +00004552 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004553 }
4554 catch(std::bad_alloc&)
4555 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004556 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004557 }
4558}
4559
4560void __stdcall glHint(GLenum target, GLenum mode)
4561{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004562 EVENT("(GLenum target = 0x%X, GLenum mode = 0x%X)", target, mode);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004563
4564 try
4565 {
alokp@chromium.orgd303ef92010-09-09 17:30:15 +00004566 switch (mode)
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00004567 {
alokp@chromium.orgd303ef92010-09-09 17:30:15 +00004568 case GL_FASTEST:
4569 case GL_NICEST:
4570 case GL_DONT_CARE:
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00004571 break;
4572 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004573 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00004574 }
4575
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004576 gl::Context *context = gl::getNonLostContext();
alokp@chromium.orgd303ef92010-09-09 17:30:15 +00004577 switch (target)
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00004578 {
alokp@chromium.orgd303ef92010-09-09 17:30:15 +00004579 case GL_GENERATE_MIPMAP_HINT:
4580 if (context) context->setGenerateMipmapHint(mode);
4581 break;
4582 case GL_FRAGMENT_SHADER_DERIVATIVE_HINT_OES:
4583 if (context) context->setFragmentShaderDerivativeHint(mode);
4584 break;
4585 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004586 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00004587 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004588 }
4589 catch(std::bad_alloc&)
4590 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004591 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004592 }
4593}
4594
4595GLboolean __stdcall glIsBuffer(GLuint buffer)
4596{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004597 EVENT("(GLuint buffer = %d)", buffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004598
4599 try
4600 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004601 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004602
4603 if (context && buffer)
4604 {
4605 gl::Buffer *bufferObject = context->getBuffer(buffer);
4606
4607 if (bufferObject)
4608 {
4609 return GL_TRUE;
4610 }
4611 }
4612 }
4613 catch(std::bad_alloc&)
4614 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004615 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004616 }
4617
4618 return GL_FALSE;
4619}
4620
4621GLboolean __stdcall glIsEnabled(GLenum cap)
4622{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004623 EVENT("(GLenum cap = 0x%X)", cap);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004624
4625 try
4626 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004627 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004628
4629 if (context)
4630 {
4631 switch (cap)
4632 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004633 case GL_CULL_FACE: return context->isCullFaceEnabled();
4634 case GL_POLYGON_OFFSET_FILL: return context->isPolygonOffsetFillEnabled();
4635 case GL_SAMPLE_ALPHA_TO_COVERAGE: return context->isSampleAlphaToCoverageEnabled();
4636 case GL_SAMPLE_COVERAGE: return context->isSampleCoverageEnabled();
4637 case GL_SCISSOR_TEST: return context->isScissorTestEnabled();
4638 case GL_STENCIL_TEST: return context->isStencilTestEnabled();
4639 case GL_DEPTH_TEST: return context->isDepthTestEnabled();
4640 case GL_BLEND: return context->isBlendEnabled();
4641 case GL_DITHER: return context->isDitherEnabled();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004642 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004643 return gl::error(GL_INVALID_ENUM, false);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004644 }
4645 }
4646 }
4647 catch(std::bad_alloc&)
4648 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004649 return gl::error(GL_OUT_OF_MEMORY, false);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004650 }
4651
4652 return false;
4653}
4654
daniel@transgaming.comfe208882010-09-01 15:47:57 +00004655GLboolean __stdcall glIsFenceNV(GLuint fence)
4656{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004657 EVENT("(GLuint fence = %d)", fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004658
4659 try
4660 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004661 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004662
4663 if (context)
4664 {
4665 gl::Fence *fenceObject = context->getFence(fence);
4666
4667 if (fenceObject == NULL)
4668 {
4669 return GL_FALSE;
4670 }
4671
4672 return fenceObject->isFence();
4673 }
4674 }
4675 catch(std::bad_alloc&)
4676 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004677 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004678 }
4679
4680 return GL_FALSE;
daniel@transgaming.comfe208882010-09-01 15:47:57 +00004681}
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004682
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004683GLboolean __stdcall glIsFramebuffer(GLuint framebuffer)
4684{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004685 EVENT("(GLuint framebuffer = %d)", framebuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004686
4687 try
4688 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004689 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004690
4691 if (context && framebuffer)
4692 {
4693 gl::Framebuffer *framebufferObject = context->getFramebuffer(framebuffer);
4694
4695 if (framebufferObject)
4696 {
4697 return GL_TRUE;
4698 }
4699 }
4700 }
4701 catch(std::bad_alloc&)
4702 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004703 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004704 }
4705
4706 return GL_FALSE;
4707}
4708
4709GLboolean __stdcall glIsProgram(GLuint program)
4710{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004711 EVENT("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004712
4713 try
4714 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004715 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004716
4717 if (context && program)
4718 {
4719 gl::Program *programObject = context->getProgram(program);
4720
4721 if (programObject)
4722 {
4723 return GL_TRUE;
4724 }
4725 }
4726 }
4727 catch(std::bad_alloc&)
4728 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004729 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004730 }
4731
4732 return GL_FALSE;
4733}
4734
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00004735GLboolean __stdcall glIsQueryEXT(GLuint id)
4736{
4737 EVENT("(GLuint id = %d)", id);
4738
4739 try
4740 {
4741 if (id == 0)
4742 {
4743 return GL_FALSE;
4744 }
4745
4746 gl::Context *context = gl::getNonLostContext();
4747
4748 if (context)
4749 {
4750 gl::Query *queryObject = context->getQuery(id, false, GL_NONE);
4751
4752 if (queryObject)
4753 {
4754 return GL_TRUE;
4755 }
4756 }
4757 }
4758 catch(std::bad_alloc&)
4759 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004760 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00004761 }
4762
4763 return GL_FALSE;
4764}
4765
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004766GLboolean __stdcall glIsRenderbuffer(GLuint renderbuffer)
4767{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004768 EVENT("(GLuint renderbuffer = %d)", renderbuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004769
4770 try
4771 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004772 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004773
4774 if (context && renderbuffer)
4775 {
4776 gl::Renderbuffer *renderbufferObject = context->getRenderbuffer(renderbuffer);
4777
4778 if (renderbufferObject)
4779 {
4780 return GL_TRUE;
4781 }
4782 }
4783 }
4784 catch(std::bad_alloc&)
4785 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004786 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004787 }
4788
4789 return GL_FALSE;
4790}
4791
4792GLboolean __stdcall glIsShader(GLuint shader)
4793{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004794 EVENT("(GLuint shader = %d)", shader);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004795
4796 try
4797 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004798 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004799
4800 if (context && shader)
4801 {
4802 gl::Shader *shaderObject = context->getShader(shader);
4803
4804 if (shaderObject)
4805 {
4806 return GL_TRUE;
4807 }
4808 }
4809 }
4810 catch(std::bad_alloc&)
4811 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004812 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004813 }
4814
4815 return GL_FALSE;
4816}
4817
4818GLboolean __stdcall glIsTexture(GLuint texture)
4819{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004820 EVENT("(GLuint texture = %d)", texture);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004821
4822 try
4823 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004824 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004825
4826 if (context && texture)
4827 {
4828 gl::Texture *textureObject = context->getTexture(texture);
4829
4830 if (textureObject)
4831 {
4832 return GL_TRUE;
4833 }
4834 }
4835 }
4836 catch(std::bad_alloc&)
4837 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004838 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004839 }
4840
4841 return GL_FALSE;
4842}
4843
4844void __stdcall glLineWidth(GLfloat width)
4845{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004846 EVENT("(GLfloat width = %f)", width);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004847
4848 try
4849 {
4850 if (width <= 0.0f)
4851 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004852 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004853 }
4854
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004855 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com32e58cd2010-03-24 09:44:10 +00004856
4857 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004858 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004859 context->setLineWidth(width);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004860 }
4861 }
4862 catch(std::bad_alloc&)
4863 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004864 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004865 }
4866}
4867
4868void __stdcall glLinkProgram(GLuint program)
4869{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004870 EVENT("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004871
4872 try
4873 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004874 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004875
4876 if (context)
4877 {
4878 gl::Program *programObject = context->getProgram(program);
4879
4880 if (!programObject)
4881 {
daniel@transgaming.com277b7142010-04-13 03:26:44 +00004882 if (context->getShader(program))
4883 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004884 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com277b7142010-04-13 03:26:44 +00004885 }
4886 else
4887 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004888 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com277b7142010-04-13 03:26:44 +00004889 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004890 }
4891
daniel@transgaming.com95d29422012-07-24 18:36:10 +00004892 context->linkProgram(program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004893 }
4894 }
4895 catch(std::bad_alloc&)
4896 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004897 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004898 }
4899}
4900
4901void __stdcall glPixelStorei(GLenum pname, GLint param)
4902{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004903 EVENT("(GLenum pname = 0x%X, GLint param = %d)", pname, param);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004904
4905 try
4906 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004907 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004908
4909 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004910 {
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004911 switch (pname)
4912 {
4913 case GL_UNPACK_ALIGNMENT:
4914 if (param != 1 && param != 2 && param != 4 && param != 8)
4915 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004916 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004917 }
4918
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004919 context->setUnpackAlignment(param);
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004920 break;
4921
4922 case GL_PACK_ALIGNMENT:
4923 if (param != 1 && param != 2 && param != 4 && param != 8)
4924 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004925 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004926 }
4927
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004928 context->setPackAlignment(param);
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004929 break;
4930
bsalomon@google.com56d46ab2011-11-23 14:53:10 +00004931 case GL_PACK_REVERSE_ROW_ORDER_ANGLE:
4932 context->setPackReverseRowOrder(param != 0);
4933 break;
4934
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004935 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004936 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004937 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004938 }
4939 }
4940 catch(std::bad_alloc&)
4941 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004942 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004943 }
4944}
4945
4946void __stdcall glPolygonOffset(GLfloat factor, GLfloat units)
4947{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004948 EVENT("(GLfloat factor = %f, GLfloat units = %f)", factor, units);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004949
4950 try
4951 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004952 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comaede6302010-04-29 03:35:48 +00004953
4954 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004955 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004956 context->setPolygonOffsetParams(factor, units);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004957 }
4958 }
4959 catch(std::bad_alloc&)
4960 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004961 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004962 }
4963}
4964
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00004965void __stdcall glReadnPixelsEXT(GLint x, GLint y, GLsizei width, GLsizei height,
4966 GLenum format, GLenum type, GLsizei bufSize,
4967 GLvoid *data)
4968{
4969 EVENT("(GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d, "
4970 "GLenum format = 0x%X, GLenum type = 0x%X, GLsizei bufSize = 0x%d, GLvoid *data = 0x%0.8p)",
4971 x, y, width, height, format, type, bufSize, data);
4972
4973 try
4974 {
4975 if (width < 0 || height < 0 || bufSize < 0)
4976 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004977 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00004978 }
4979
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00004980 gl::Context *context = gl::getNonLostContext();
4981
4982 if (context)
4983 {
daniel@transgaming.com42944b02012-09-27 17:45:57 +00004984 GLenum currentFormat, currentType;
4985
4986 // Failure in getCurrentReadFormatType indicates that no color attachment is currently bound,
4987 // and attempting to read back if that's the case is an error. The error will be registered
4988 // by getCurrentReadFormat.
4989 if (!context->getCurrentReadFormatType(&currentFormat, &currentType))
4990 return;
4991
4992 if (!(currentFormat == format && currentType == type) && !validReadFormatType(format, type))
4993 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004994 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com42944b02012-09-27 17:45:57 +00004995 }
4996
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00004997 context->readPixels(x, y, width, height, format, type, &bufSize, data);
4998 }
4999 }
5000 catch(std::bad_alloc&)
5001 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005002 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00005003 }
5004}
5005
5006void __stdcall glReadPixels(GLint x, GLint y, GLsizei width, GLsizei height,
5007 GLenum format, GLenum type, GLvoid* pixels)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005008{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005009 EVENT("(GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00005010 "GLenum format = 0x%X, GLenum type = 0x%X, GLvoid* pixels = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00005011 x, y, width, height, format, type, pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005012
5013 try
5014 {
5015 if (width < 0 || height < 0)
5016 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005017 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005018 }
5019
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005020 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005021
5022 if (context)
5023 {
daniel@transgaming.com42944b02012-09-27 17:45:57 +00005024 GLenum currentFormat, currentType;
5025
5026 // Failure in getCurrentReadFormatType indicates that no color attachment is currently bound,
5027 // and attempting to read back if that's the case is an error. The error will be registered
5028 // by getCurrentReadFormat.
5029 if (!context->getCurrentReadFormatType(&currentFormat, &currentType))
5030 return;
5031
5032 if (!(currentFormat == format && currentType == type) && !validReadFormatType(format, type))
5033 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005034 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com42944b02012-09-27 17:45:57 +00005035 }
5036
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00005037 context->readPixels(x, y, width, height, format, type, NULL, pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005038 }
5039 }
5040 catch(std::bad_alloc&)
5041 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005042 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005043 }
5044}
5045
5046void __stdcall glReleaseShaderCompiler(void)
5047{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005048 EVENT("()");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005049
5050 try
5051 {
5052 gl::Shader::releaseCompiler();
5053 }
5054 catch(std::bad_alloc&)
5055 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005056 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005057 }
5058}
5059
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00005060void __stdcall glRenderbufferStorageMultisampleANGLE(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005061{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005062 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 +00005063 target, samples, internalformat, width, height);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005064
5065 try
5066 {
5067 switch (target)
5068 {
5069 case GL_RENDERBUFFER:
5070 break;
5071 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005072 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005073 }
5074
daniel@transgaming.comedc19182010-10-15 17:57:55 +00005075 if (!gl::IsColorRenderable(internalformat) && !gl::IsDepthRenderable(internalformat) && !gl::IsStencilRenderable(internalformat))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005076 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005077 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005078 }
5079
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00005080 if (width < 0 || height < 0 || samples < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005081 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005082 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005083 }
5084
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005085 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005086
5087 if (context)
5088 {
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00005089 if (width > context->getMaximumRenderbufferDimension() ||
5090 height > context->getMaximumRenderbufferDimension() ||
5091 samples > context->getMaxSupportedSamples())
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00005092 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005093 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00005094 }
5095
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +00005096 GLuint handle = context->getRenderbufferHandle();
5097 if (handle == 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005098 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005099 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005100 }
5101
5102 switch (internalformat)
5103 {
5104 case GL_DEPTH_COMPONENT16:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005105 case GL_RGBA4:
5106 case GL_RGB5_A1:
5107 case GL_RGB565:
daniel@transgaming.com63977542010-08-24 19:21:02 +00005108 case GL_RGB8_OES:
5109 case GL_RGBA8_OES:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005110 case GL_STENCIL_INDEX8:
daniel@transgaming.comcdacc8e2010-07-28 19:20:50 +00005111 case GL_DEPTH24_STENCIL8_OES:
shannon.woods%transgaming.com@gtempaccount.com8dce6512013-04-13 03:42:19 +00005112 break;
5113 case GL_SRGB8_ALPHA8:
5114 case GL_RGB10_A2:
5115 case GL_RG8:
5116 case GL_R8:
5117 if (context->getClientVersion() < 3)
5118 {
5119 return gl::error(GL_INVALID_ENUM);
5120 }
daniel@transgaming.comcdacc8e2010-07-28 19:20:50 +00005121 break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005122 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005123 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005124 }
shannon.woods%transgaming.com@gtempaccount.com8dce6512013-04-13 03:42:19 +00005125
5126 context->setRenderbufferStorage(width, height, internalformat, samples);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005127 }
5128 }
5129 catch(std::bad_alloc&)
5130 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005131 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005132 }
5133}
5134
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00005135void __stdcall glRenderbufferStorage(GLenum target, GLenum internalformat, GLsizei width, GLsizei height)
5136{
5137 glRenderbufferStorageMultisampleANGLE(target, 0, internalformat, width, height);
5138}
5139
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005140void __stdcall glSampleCoverage(GLclampf value, GLboolean invert)
5141{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005142 EVENT("(GLclampf value = %f, GLboolean invert = %u)", value, invert);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005143
5144 try
5145 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005146 gl::Context* context = gl::getNonLostContext();
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00005147
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005148 if (context)
5149 {
daniel@transgaming.coma36f98e2010-05-18 18:51:09 +00005150 context->setSampleCoverageParams(gl::clamp01(value), invert == GL_TRUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005151 }
5152 }
5153 catch(std::bad_alloc&)
5154 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005155 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005156 }
5157}
5158
daniel@transgaming.comfe208882010-09-01 15:47:57 +00005159void __stdcall glSetFenceNV(GLuint fence, GLenum condition)
5160{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005161 EVENT("(GLuint fence = %d, GLenum condition = 0x%X)", fence, condition);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005162
5163 try
5164 {
5165 if (condition != GL_ALL_COMPLETED_NV)
5166 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005167 return gl::error(GL_INVALID_ENUM);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005168 }
5169
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005170 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005171
5172 if (context)
5173 {
5174 gl::Fence *fenceObject = context->getFence(fence);
5175
5176 if (fenceObject == NULL)
5177 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005178 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005179 }
5180
5181 fenceObject->setFence(condition);
5182 }
5183 }
5184 catch(std::bad_alloc&)
5185 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005186 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005187 }
daniel@transgaming.comfe208882010-09-01 15:47:57 +00005188}
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005189
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005190void __stdcall glScissor(GLint x, GLint y, GLsizei width, GLsizei height)
5191{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005192 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 +00005193
5194 try
5195 {
5196 if (width < 0 || height < 0)
5197 {
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.comfab5a1a2010-03-11 19:22:30 +00005202
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005203 if (context)
5204 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00005205 context->setScissorParams(x, y, width, height);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005206 }
5207 }
5208 catch(std::bad_alloc&)
5209 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005210 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005211 }
5212}
5213
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00005214void __stdcall glShaderBinary(GLsizei n, const GLuint* shaders, GLenum binaryformat, const GLvoid* binary, GLsizei length)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005215{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005216 EVENT("(GLsizei n = %d, const GLuint* shaders = 0x%0.8p, GLenum binaryformat = 0x%X, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00005217 "const GLvoid* binary = 0x%0.8p, GLsizei length = %d)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00005218 n, shaders, binaryformat, binary, length);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005219
5220 try
5221 {
daniel@transgaming.comd1f667f2010-04-29 03:38:52 +00005222 // No binary shader formats are supported.
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005223 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005224 }
5225 catch(std::bad_alloc&)
5226 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005227 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005228 }
5229}
5230
shannon.woods%transgaming.com@gtempaccount.com5f339332013-04-13 03:29:02 +00005231void __stdcall glShaderSource(GLuint shader, GLsizei count, const GLchar* const* string, const GLint* length)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005232{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005233 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 +00005234 shader, count, string, length);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005235
5236 try
5237 {
daniel@transgaming.com8e6a6be2010-04-13 03:26:41 +00005238 if (count < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005239 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005240 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005241 }
5242
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005243 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005244
5245 if (context)
5246 {
5247 gl::Shader *shaderObject = context->getShader(shader);
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00005248
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005249 if (!shaderObject)
5250 {
daniel@transgaming.com8e6a6be2010-04-13 03:26:41 +00005251 if (context->getProgram(shader))
5252 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005253 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com8e6a6be2010-04-13 03:26:41 +00005254 }
5255 else
5256 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005257 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com8e6a6be2010-04-13 03:26:41 +00005258 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005259 }
5260
5261 shaderObject->setSource(count, string, length);
5262 }
5263 }
5264 catch(std::bad_alloc&)
5265 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005266 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005267 }
5268}
5269
5270void __stdcall glStencilFunc(GLenum func, GLint ref, GLuint mask)
5271{
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00005272 glStencilFuncSeparate(GL_FRONT_AND_BACK, func, ref, mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005273}
5274
5275void __stdcall glStencilFuncSeparate(GLenum face, GLenum func, GLint ref, GLuint mask)
5276{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005277 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 +00005278
5279 try
5280 {
5281 switch (face)
5282 {
5283 case GL_FRONT:
5284 case GL_BACK:
5285 case GL_FRONT_AND_BACK:
5286 break;
5287 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005288 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005289 }
5290
5291 switch (func)
5292 {
5293 case GL_NEVER:
5294 case GL_ALWAYS:
5295 case GL_LESS:
5296 case GL_LEQUAL:
5297 case GL_EQUAL:
5298 case GL_GEQUAL:
5299 case GL_GREATER:
5300 case GL_NOTEQUAL:
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->setStencilParams(func, ref, 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->setStencilBackParams(func, ref, 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 glStencilMask(GLuint mask)
5328{
5329 glStencilMaskSeparate(GL_FRONT_AND_BACK, mask);
5330}
5331
5332void __stdcall glStencilMaskSeparate(GLenum face, GLuint mask)
5333{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005334 EVENT("(GLenum face = 0x%X, GLuint mask = %d)", face, mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005335
5336 try
5337 {
5338 switch (face)
5339 {
5340 case GL_FRONT:
5341 case GL_BACK:
5342 case GL_FRONT_AND_BACK:
5343 break;
5344 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005345 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005346 }
5347
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005348 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005349
5350 if (context)
5351 {
5352 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
5353 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00005354 context->setStencilWritemask(mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005355 }
5356
5357 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
5358 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00005359 context->setStencilBackWritemask(mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005360 }
5361 }
5362 }
5363 catch(std::bad_alloc&)
5364 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005365 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005366 }
5367}
5368
5369void __stdcall glStencilOp(GLenum fail, GLenum zfail, GLenum zpass)
5370{
5371 glStencilOpSeparate(GL_FRONT_AND_BACK, fail, zfail, zpass);
5372}
5373
5374void __stdcall glStencilOpSeparate(GLenum face, GLenum fail, GLenum zfail, GLenum zpass)
5375{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005376 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 +00005377 face, fail, zfail, zpass);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005378
5379 try
5380 {
5381 switch (face)
5382 {
5383 case GL_FRONT:
5384 case GL_BACK:
5385 case GL_FRONT_AND_BACK:
5386 break;
5387 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005388 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005389 }
5390
5391 switch (fail)
5392 {
5393 case GL_ZERO:
5394 case GL_KEEP:
5395 case GL_REPLACE:
5396 case GL_INCR:
5397 case GL_DECR:
5398 case GL_INVERT:
5399 case GL_INCR_WRAP:
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00005400 case GL_DECR_WRAP:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005401 break;
5402 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005403 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005404 }
5405
5406 switch (zfail)
5407 {
5408 case GL_ZERO:
5409 case GL_KEEP:
5410 case GL_REPLACE:
5411 case GL_INCR:
5412 case GL_DECR:
5413 case GL_INVERT:
5414 case GL_INCR_WRAP:
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00005415 case GL_DECR_WRAP:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005416 break;
5417 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005418 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005419 }
5420
5421 switch (zpass)
5422 {
5423 case GL_ZERO:
5424 case GL_KEEP:
5425 case GL_REPLACE:
5426 case GL_INCR:
5427 case GL_DECR:
5428 case GL_INVERT:
5429 case GL_INCR_WRAP:
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00005430 case GL_DECR_WRAP:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005431 break;
5432 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005433 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005434 }
5435
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005436 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005437
5438 if (context)
5439 {
5440 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
5441 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00005442 context->setStencilOperations(fail, zfail, zpass);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005443 }
5444
5445 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
5446 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00005447 context->setStencilBackOperations(fail, zfail, zpass);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005448 }
5449 }
5450 }
5451 catch(std::bad_alloc&)
5452 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005453 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005454 }
5455}
5456
daniel@transgaming.comfe208882010-09-01 15:47:57 +00005457GLboolean __stdcall glTestFenceNV(GLuint fence)
5458{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005459 EVENT("(GLuint fence = %d)", fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005460
5461 try
5462 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005463 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005464
5465 if (context)
5466 {
5467 gl::Fence *fenceObject = context->getFence(fence);
5468
5469 if (fenceObject == NULL)
5470 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005471 return gl::error(GL_INVALID_OPERATION, GL_TRUE);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005472 }
5473
5474 return fenceObject->testFence();
5475 }
5476 }
5477 catch(std::bad_alloc&)
5478 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005479 gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005480 }
5481
5482 return GL_TRUE;
daniel@transgaming.comfe208882010-09-01 15:47:57 +00005483}
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005484
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00005485void __stdcall glTexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height,
5486 GLint border, GLenum format, GLenum type, const GLvoid* pixels)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005487{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005488 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 +00005489 "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 +00005490 target, level, internalformat, width, height, border, format, type, pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005491
5492 try
5493 {
shannon.woods%transgaming.com@gtempaccount.com6d73c4e2013-04-13 03:45:12 +00005494 if (!validImageSize(level, width, height, 1))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005495 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005496 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005497 }
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00005498
apatrick@chromium.orge057c5d2012-01-26 19:18:24 +00005499 if (internalformat != GLint(format))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005500 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005501 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005502 }
5503
daniel@transgaming.com6377e362012-06-05 19:49:55 +00005504 // validate <type> by itself (used as secondary key below)
5505 switch (type)
5506 {
5507 case GL_UNSIGNED_BYTE:
5508 case GL_UNSIGNED_SHORT_5_6_5:
5509 case GL_UNSIGNED_SHORT_4_4_4_4:
5510 case GL_UNSIGNED_SHORT_5_5_5_1:
5511 case GL_UNSIGNED_SHORT:
5512 case GL_UNSIGNED_INT:
5513 case GL_UNSIGNED_INT_24_8_OES:
5514 case GL_HALF_FLOAT_OES:
5515 case GL_FLOAT:
5516 break;
5517 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005518 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com6377e362012-06-05 19:49:55 +00005519 }
5520
5521 // validate <format> + <type> combinations
5522 // - invalid <format> -> sets INVALID_ENUM
5523 // - invalid <format>+<type> combination -> sets INVALID_OPERATION
daniel@transgaming.com8a0a2db2011-03-21 16:38:20 +00005524 switch (format)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005525 {
5526 case GL_ALPHA:
5527 case GL_LUMINANCE:
5528 case GL_LUMINANCE_ALPHA:
5529 switch (type)
5530 {
5531 case GL_UNSIGNED_BYTE:
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00005532 case GL_FLOAT:
5533 case GL_HALF_FLOAT_OES:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005534 break;
5535 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005536 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005537 }
5538 break;
5539 case GL_RGB:
5540 switch (type)
5541 {
5542 case GL_UNSIGNED_BYTE:
5543 case GL_UNSIGNED_SHORT_5_6_5:
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00005544 case GL_FLOAT:
5545 case GL_HALF_FLOAT_OES:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005546 break;
5547 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005548 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005549 }
5550 break;
5551 case GL_RGBA:
5552 switch (type)
5553 {
5554 case GL_UNSIGNED_BYTE:
5555 case GL_UNSIGNED_SHORT_4_4_4_4:
5556 case GL_UNSIGNED_SHORT_5_5_5_1:
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00005557 case GL_FLOAT:
5558 case GL_HALF_FLOAT_OES:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005559 break;
5560 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005561 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005562 }
5563 break;
daniel@transgaming.coma9198d92010-08-08 04:49:56 +00005564 case GL_BGRA_EXT:
5565 switch (type)
5566 {
5567 case GL_UNSIGNED_BYTE:
5568 break;
5569 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005570 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.coma9198d92010-08-08 04:49:56 +00005571 }
5572 break;
daniel@transgaming.com01868132010-08-24 19:21:17 +00005573 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT: // error cases for compressed textures are handled below
5574 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
gman@chromium.org50c526d2011-08-10 05:19:44 +00005575 case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
5576 case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
daniel@transgaming.com01868132010-08-24 19:21:17 +00005577 break;
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00005578 case GL_DEPTH_COMPONENT:
5579 switch (type)
5580 {
5581 case GL_UNSIGNED_SHORT:
5582 case GL_UNSIGNED_INT:
5583 break;
5584 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005585 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00005586 }
5587 break;
5588 case GL_DEPTH_STENCIL_OES:
5589 switch (type)
5590 {
5591 case GL_UNSIGNED_INT_24_8_OES:
5592 break;
5593 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005594 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00005595 }
5596 break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005597 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005598 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005599 }
5600
5601 if (border != 0)
5602 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005603 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005604 }
5605
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005606 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005607
5608 if (context)
5609 {
daniel@transgaming.com32b11442011-11-19 02:42:48 +00005610 if (level > context->getMaximumTextureLevel())
5611 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005612 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com32b11442011-11-19 02:42:48 +00005613 }
5614
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00005615 switch (target)
5616 {
5617 case GL_TEXTURE_2D:
shannon.woods%transgaming.com@gtempaccount.comc1fdf6b2013-04-13 03:44:41 +00005618 if (width > (context->getMaximum2DTextureDimension() >> level) ||
5619 height > (context->getMaximum2DTextureDimension() >> level))
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00005620 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005621 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00005622 }
5623 break;
5624 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
5625 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
5626 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
5627 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
5628 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
5629 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
5630 if (width != height)
5631 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005632 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00005633 }
5634
5635 if (width > (context->getMaximumCubeTextureDimension() >> level) ||
5636 height > (context->getMaximumCubeTextureDimension() >> level))
5637 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005638 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00005639 }
5640 break;
5641 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005642 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00005643 }
5644
gman@chromium.org50c526d2011-08-10 05:19:44 +00005645 switch (format) {
5646 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
5647 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
5648 if (context->supportsDXT1Textures())
daniel@transgaming.com01868132010-08-24 19:21:17 +00005649 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005650 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com01868132010-08-24 19:21:17 +00005651 }
5652 else
5653 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005654 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com01868132010-08-24 19:21:17 +00005655 }
gman@chromium.org50c526d2011-08-10 05:19:44 +00005656 break;
5657 case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
5658 if (context->supportsDXT3Textures())
5659 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005660 return gl::error(GL_INVALID_OPERATION);
gman@chromium.org50c526d2011-08-10 05:19:44 +00005661 }
5662 else
5663 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005664 return gl::error(GL_INVALID_ENUM);
gman@chromium.org50c526d2011-08-10 05:19:44 +00005665 }
5666 break;
5667 case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
5668 if (context->supportsDXT5Textures())
5669 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005670 return gl::error(GL_INVALID_OPERATION);
gman@chromium.org50c526d2011-08-10 05:19:44 +00005671 }
5672 else
5673 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005674 return gl::error(GL_INVALID_ENUM);
gman@chromium.org50c526d2011-08-10 05:19:44 +00005675 }
5676 break;
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00005677 case GL_DEPTH_COMPONENT:
5678 case GL_DEPTH_STENCIL_OES:
5679 if (!context->supportsDepthTextures())
5680 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005681 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00005682 }
daniel@transgaming.com0c854682012-05-31 01:14:11 +00005683 if (target != GL_TEXTURE_2D)
5684 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005685 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com0c854682012-05-31 01:14:11 +00005686 }
daniel@transgaming.com797924b2012-06-05 19:50:01 +00005687 // OES_depth_texture supports loading depth data and multiple levels,
5688 // but ANGLE_depth_texture does not
5689 if (pixels != NULL || level != 0)
daniel@transgaming.com0c854682012-05-31 01:14:11 +00005690 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005691 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com0c854682012-05-31 01:14:11 +00005692 }
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00005693 break;
gman@chromium.org50c526d2011-08-10 05:19:44 +00005694 default:
5695 break;
daniel@transgaming.com01868132010-08-24 19:21:17 +00005696 }
5697
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00005698 if (type == GL_FLOAT)
5699 {
daniel@transgaming.combbeffbb2011-11-09 17:46:11 +00005700 if (!context->supportsFloat32Textures())
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00005701 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005702 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00005703 }
5704 }
5705 else if (type == GL_HALF_FLOAT_OES)
5706 {
daniel@transgaming.combbeffbb2011-11-09 17:46:11 +00005707 if (!context->supportsFloat16Textures())
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00005708 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005709 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00005710 }
5711 }
5712
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005713 if (target == GL_TEXTURE_2D)
5714 {
5715 gl::Texture2D *texture = context->getTexture2D();
5716
5717 if (!texture)
5718 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005719 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005720 }
5721
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005722 if (texture->isImmutable())
5723 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005724 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005725 }
5726
daniel@transgaming.com8a0a2db2011-03-21 16:38:20 +00005727 texture->setImage(level, width, height, format, type, context->getUnpackAlignment(), pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005728 }
5729 else
5730 {
5731 gl::TextureCubeMap *texture = context->getTextureCubeMap();
5732
5733 if (!texture)
5734 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005735 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005736 }
5737
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005738 if (texture->isImmutable())
5739 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005740 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005741 }
5742
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005743 switch (target)
5744 {
5745 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
daniel@transgaming.com8a0a2db2011-03-21 16:38:20 +00005746 texture->setImagePosX(level, width, height, format, type, context->getUnpackAlignment(), pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005747 break;
5748 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
daniel@transgaming.com8a0a2db2011-03-21 16:38:20 +00005749 texture->setImageNegX(level, width, height, format, type, context->getUnpackAlignment(), pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005750 break;
5751 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
daniel@transgaming.com8a0a2db2011-03-21 16:38:20 +00005752 texture->setImagePosY(level, width, height, format, type, context->getUnpackAlignment(), pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005753 break;
5754 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
daniel@transgaming.com8a0a2db2011-03-21 16:38:20 +00005755 texture->setImageNegY(level, width, height, format, type, context->getUnpackAlignment(), pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005756 break;
5757 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
daniel@transgaming.com8a0a2db2011-03-21 16:38:20 +00005758 texture->setImagePosZ(level, width, height, format, type, context->getUnpackAlignment(), pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005759 break;
5760 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
daniel@transgaming.com8a0a2db2011-03-21 16:38:20 +00005761 texture->setImageNegZ(level, width, height, format, type, context->getUnpackAlignment(), pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005762 break;
5763 default: UNREACHABLE();
5764 }
5765 }
5766 }
5767 }
5768 catch(std::bad_alloc&)
5769 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005770 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005771 }
5772}
5773
5774void __stdcall glTexParameterf(GLenum target, GLenum pname, GLfloat param)
5775{
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005776 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLint param = %f)", target, pname, param);
5777
5778 try
5779 {
5780 gl::Context *context = gl::getNonLostContext();
5781
5782 if (context)
5783 {
5784 gl::Texture *texture;
5785
5786 switch (target)
5787 {
5788 case GL_TEXTURE_2D:
5789 texture = context->getTexture2D();
5790 break;
5791 case GL_TEXTURE_CUBE_MAP:
5792 texture = context->getTextureCubeMap();
5793 break;
shannon.woods%transgaming.com@gtempaccount.comc416e1c2013-04-13 03:45:05 +00005794 case GL_TEXTURE_3D:
5795 if (context->getClientVersion() < 3)
5796 {
5797 return gl::error(GL_INVALID_ENUM);
5798 }
5799 texture = context->getTexture3D();
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005800 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005801 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005802 }
5803
5804 switch (pname)
5805 {
5806 case GL_TEXTURE_WRAP_S:
5807 if (!texture->setWrapS((GLenum)param))
5808 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005809 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005810 }
5811 break;
5812 case GL_TEXTURE_WRAP_T:
5813 if (!texture->setWrapT((GLenum)param))
5814 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005815 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005816 }
5817 break;
shannon.woods%transgaming.com@gtempaccount.com0b3a8df2013-04-13 03:44:51 +00005818 case GL_TEXTURE_WRAP_R:
5819 if (context->getClientVersion() < 3 || !texture->setWrapR((GLenum)param))
5820 {
5821 return gl::error(GL_INVALID_ENUM);
5822 }
5823 break;
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005824 case GL_TEXTURE_MIN_FILTER:
5825 if (!texture->setMinFilter((GLenum)param))
5826 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005827 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005828 }
5829 break;
5830 case GL_TEXTURE_MAG_FILTER:
5831 if (!texture->setMagFilter((GLenum)param))
5832 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005833 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005834 }
5835 break;
5836 case GL_TEXTURE_USAGE_ANGLE:
5837 if (!texture->setUsage((GLenum)param))
5838 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005839 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005840 }
5841 break;
5842 case GL_TEXTURE_MAX_ANISOTROPY_EXT:
5843 if (!context->supportsTextureFilterAnisotropy())
5844 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005845 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005846 }
5847 if (!texture->setMaxAnisotropy((float)param, context->getTextureMaxAnisotropy()))
5848 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005849 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005850 }
5851 break;
5852 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005853 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005854 }
5855 }
5856 }
5857 catch(std::bad_alloc&)
5858 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005859 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005860 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005861}
5862
5863void __stdcall glTexParameterfv(GLenum target, GLenum pname, const GLfloat* params)
5864{
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005865 glTexParameterf(target, pname, (GLfloat)*params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005866}
5867
5868void __stdcall glTexParameteri(GLenum target, GLenum pname, GLint param)
5869{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005870 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLint param = %d)", target, pname, param);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005871
5872 try
5873 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005874 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005875
5876 if (context)
5877 {
5878 gl::Texture *texture;
5879
5880 switch (target)
5881 {
5882 case GL_TEXTURE_2D:
5883 texture = context->getTexture2D();
5884 break;
5885 case GL_TEXTURE_CUBE_MAP:
5886 texture = context->getTextureCubeMap();
5887 break;
shannon.woods%transgaming.com@gtempaccount.comc416e1c2013-04-13 03:45:05 +00005888 case GL_TEXTURE_3D:
5889 if (context->getClientVersion() < 3)
5890 {
5891 return gl::error(GL_INVALID_ENUM);
5892 }
5893 texture = context->getTexture3D();
5894 break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005895 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005896 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005897 }
5898
5899 switch (pname)
5900 {
5901 case GL_TEXTURE_WRAP_S:
5902 if (!texture->setWrapS((GLenum)param))
5903 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005904 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005905 }
5906 break;
5907 case GL_TEXTURE_WRAP_T:
5908 if (!texture->setWrapT((GLenum)param))
5909 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005910 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005911 }
5912 break;
shannon.woods%transgaming.com@gtempaccount.com0b3a8df2013-04-13 03:44:51 +00005913 case GL_TEXTURE_WRAP_R:
5914 if (context->getClientVersion() < 3 || !texture->setWrapR((GLenum)param))
5915 {
5916 return gl::error(GL_INVALID_ENUM);
5917 }
5918 break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005919 case GL_TEXTURE_MIN_FILTER:
5920 if (!texture->setMinFilter((GLenum)param))
5921 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005922 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005923 }
5924 break;
5925 case GL_TEXTURE_MAG_FILTER:
5926 if (!texture->setMagFilter((GLenum)param))
5927 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005928 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005929 }
5930 break;
daniel@transgaming.com7d18c172011-11-11 04:18:21 +00005931 case GL_TEXTURE_USAGE_ANGLE:
5932 if (!texture->setUsage((GLenum)param))
5933 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005934 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com7d18c172011-11-11 04:18:21 +00005935 }
5936 break;
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005937 case GL_TEXTURE_MAX_ANISOTROPY_EXT:
5938 if (!context->supportsTextureFilterAnisotropy())
5939 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005940 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005941 }
5942 if (!texture->setMaxAnisotropy((float)param, context->getTextureMaxAnisotropy()))
5943 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005944 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005945 }
5946 break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005947 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005948 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005949 }
5950 }
5951 }
5952 catch(std::bad_alloc&)
5953 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005954 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005955 }
5956}
5957
5958void __stdcall glTexParameteriv(GLenum target, GLenum pname, const GLint* params)
5959{
5960 glTexParameteri(target, pname, *params);
5961}
5962
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005963void __stdcall glTexStorage2DEXT(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height)
5964{
5965 EVENT("(GLenum target = 0x%X, GLsizei levels = %d, GLenum internalformat = 0x%X, GLsizei width = %d, GLsizei height = %d)",
5966 target, levels, internalformat, width, height);
5967
5968 try
5969 {
5970 if (target != GL_TEXTURE_2D && target != GL_TEXTURE_CUBE_MAP)
5971 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005972 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005973 }
5974
5975 if (width < 1 || height < 1 || levels < 1)
5976 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005977 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005978 }
5979
5980 if (target == GL_TEXTURE_CUBE_MAP && width != height)
5981 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005982 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005983 }
5984
daniel@transgaming.com45b888a2011-11-16 03:56:39 +00005985 if (levels != 1 && levels != gl::log2(std::max(width, height)) + 1)
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005986 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005987 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005988 }
5989
5990 GLenum format = gl::ExtractFormat(internalformat);
5991 GLenum type = gl::ExtractType(internalformat);
5992
5993 if (format == GL_NONE || type == GL_NONE)
5994 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005995 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005996 }
5997
5998 gl::Context *context = gl::getNonLostContext();
5999
6000 if (context)
6001 {
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00006002 switch (target)
6003 {
6004 case GL_TEXTURE_2D:
shannon.woods%transgaming.com@gtempaccount.comc1fdf6b2013-04-13 03:44:41 +00006005 if (width > context->getMaximum2DTextureDimension() ||
6006 height > context->getMaximum2DTextureDimension())
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00006007 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006008 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00006009 }
6010 break;
6011 case GL_TEXTURE_CUBE_MAP:
6012 if (width > context->getMaximumCubeTextureDimension() ||
6013 height > context->getMaximumCubeTextureDimension())
6014 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006015 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00006016 }
6017 break;
6018 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006019 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00006020 }
6021
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00006022 if (levels != 1 && !context->supportsNonPower2Texture())
6023 {
6024 if (!gl::isPow2(width) || !gl::isPow2(height))
6025 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006026 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00006027 }
6028 }
6029
daniel@transgaming.come1077362011-11-11 04:16:50 +00006030 switch (internalformat)
6031 {
6032 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
6033 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
6034 if (!context->supportsDXT1Textures())
6035 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006036 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.come1077362011-11-11 04:16:50 +00006037 }
6038 break;
6039 case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
6040 if (!context->supportsDXT3Textures())
6041 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006042 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.come1077362011-11-11 04:16:50 +00006043 }
6044 break;
6045 case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
6046 if (!context->supportsDXT5Textures())
6047 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006048 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.come1077362011-11-11 04:16:50 +00006049 }
6050 break;
daniel@transgaming.comff941aa2011-11-11 04:17:09 +00006051 case GL_RGBA32F_EXT:
6052 case GL_RGB32F_EXT:
6053 case GL_ALPHA32F_EXT:
6054 case GL_LUMINANCE32F_EXT:
6055 case GL_LUMINANCE_ALPHA32F_EXT:
6056 if (!context->supportsFloat32Textures())
6057 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006058 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comff941aa2011-11-11 04:17:09 +00006059 }
6060 break;
6061 case GL_RGBA16F_EXT:
6062 case GL_RGB16F_EXT:
6063 case GL_ALPHA16F_EXT:
6064 case GL_LUMINANCE16F_EXT:
6065 case GL_LUMINANCE_ALPHA16F_EXT:
6066 if (!context->supportsFloat16Textures())
6067 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006068 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comff941aa2011-11-11 04:17:09 +00006069 }
6070 break;
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00006071 case GL_DEPTH_COMPONENT16:
6072 case GL_DEPTH_COMPONENT32_OES:
6073 case GL_DEPTH24_STENCIL8_OES:
6074 if (!context->supportsDepthTextures())
6075 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006076 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00006077 }
daniel@transgaming.com0c854682012-05-31 01:14:11 +00006078 if (target != GL_TEXTURE_2D)
6079 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006080 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com0c854682012-05-31 01:14:11 +00006081 }
daniel@transgaming.com797924b2012-06-05 19:50:01 +00006082 // ANGLE_depth_texture only supports 1-level textures
6083 if (levels != 1)
6084 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006085 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com797924b2012-06-05 19:50:01 +00006086 }
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00006087 break;
6088 default:
6089 break;
daniel@transgaming.come1077362011-11-11 04:16:50 +00006090 }
6091
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00006092 if (target == GL_TEXTURE_2D)
6093 {
6094 gl::Texture2D *texture = context->getTexture2D();
6095
6096 if (!texture || texture->id() == 0)
6097 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006098 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00006099 }
6100
6101 if (texture->isImmutable())
6102 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006103 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00006104 }
6105
6106 texture->storage(levels, internalformat, width, height);
6107 }
6108 else if (target == GL_TEXTURE_CUBE_MAP)
6109 {
6110 gl::TextureCubeMap *texture = context->getTextureCubeMap();
6111
6112 if (!texture || texture->id() == 0)
6113 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006114 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00006115 }
6116
6117 if (texture->isImmutable())
6118 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006119 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00006120 }
6121
6122 texture->storage(levels, internalformat, width);
6123 }
6124 else UNREACHABLE();
6125 }
6126 }
6127 catch(std::bad_alloc&)
6128 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006129 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00006130 }
6131}
6132
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00006133void __stdcall glTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height,
6134 GLenum format, GLenum type, const GLvoid* pixels)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006135{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006136 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00006137 "GLsizei width = %d, GLsizei height = %d, GLenum format = 0x%X, GLenum type = 0x%X, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00006138 "const GLvoid* pixels = 0x%0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006139 target, level, xoffset, yoffset, width, height, format, type, pixels);
6140
6141 try
6142 {
apatrick@chromium.org551022e2012-01-23 19:56:54 +00006143 if (!gl::IsInternalTextureTarget(target))
daniel@transgaming.com00c75962010-03-11 20:36:15 +00006144 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006145 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com00c75962010-03-11 20:36:15 +00006146 }
6147
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00006148 if (level < 0 || xoffset < 0 || yoffset < 0 || width < 0 || height < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006149 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006150 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006151 }
6152
daniel@transgaming.com00c75962010-03-11 20:36:15 +00006153 if (std::numeric_limits<GLsizei>::max() - xoffset < width || std::numeric_limits<GLsizei>::max() - yoffset < height)
6154 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006155 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com00c75962010-03-11 20:36:15 +00006156 }
6157
daniel@transgaming.com8833dd22012-06-05 19:49:58 +00006158 if (!checkTextureFormatType(format, type))
daniel@transgaming.com00c75962010-03-11 20:36:15 +00006159 {
daniel@transgaming.com8833dd22012-06-05 19:49:58 +00006160 return; // error is set by helper function
daniel@transgaming.com00c75962010-03-11 20:36:15 +00006161 }
6162
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006163 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com00c75962010-03-11 20:36:15 +00006164
6165 if (context)
6166 {
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00006167 if (level > context->getMaximumTextureLevel())
6168 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006169 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00006170 }
6171
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00006172 if (format == GL_FLOAT)
6173 {
daniel@transgaming.combbeffbb2011-11-09 17:46:11 +00006174 if (!context->supportsFloat32Textures())
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00006175 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006176 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00006177 }
6178 }
6179 else if (format == GL_HALF_FLOAT_OES)
6180 {
daniel@transgaming.combbeffbb2011-11-09 17:46:11 +00006181 if (!context->supportsFloat16Textures())
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00006182 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006183 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00006184 }
6185 }
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00006186 else if (gl::IsDepthTexture(format))
6187 {
6188 if (!context->supportsDepthTextures())
6189 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006190 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00006191 }
daniel@transgaming.com0c854682012-05-31 01:14:11 +00006192 if (target != GL_TEXTURE_2D)
6193 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006194 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com0c854682012-05-31 01:14:11 +00006195 }
6196 // OES_depth_texture supports loading depth data, but ANGLE_depth_texture does not
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006197 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00006198 }
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00006199
daniel@transgaming.com1d2d3c42012-05-31 01:14:15 +00006200 if (width == 0 || height == 0 || pixels == NULL)
6201 {
6202 return;
6203 }
6204
daniel@transgaming.com00c75962010-03-11 20:36:15 +00006205 if (target == GL_TEXTURE_2D)
6206 {
6207 gl::Texture2D *texture = context->getTexture2D();
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00006208 if (validateSubImageParams2D(false, width, height, xoffset, yoffset, level, format, type, texture))
daniel@transgaming.com00c75962010-03-11 20:36:15 +00006209 {
daniel@transgaming.com343373a2011-11-29 19:42:32 +00006210 texture->subImage(level, xoffset, yoffset, width, height, format, type, context->getUnpackAlignment(), pixels);
daniel@transgaming.com00c75962010-03-11 20:36:15 +00006211 }
daniel@transgaming.com00c75962010-03-11 20:36:15 +00006212 }
daniel@transgaming.com19ffc242010-05-04 03:35:21 +00006213 else if (gl::IsCubemapTextureTarget(target))
daniel@transgaming.com00c75962010-03-11 20:36:15 +00006214 {
6215 gl::TextureCubeMap *texture = context->getTextureCubeMap();
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00006216 if (validateSubImageParamsCube(false, width, height, xoffset, yoffset, target, level, format, type, texture))
daniel@transgaming.com00c75962010-03-11 20:36:15 +00006217 {
daniel@transgaming.com343373a2011-11-29 19:42:32 +00006218 texture->subImage(target, level, xoffset, yoffset, width, height, format, type, context->getUnpackAlignment(), pixels);
daniel@transgaming.com00c75962010-03-11 20:36:15 +00006219 }
daniel@transgaming.com00c75962010-03-11 20:36:15 +00006220 }
6221 else
6222 {
6223 UNREACHABLE();
6224 }
6225 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006226 }
6227 catch(std::bad_alloc&)
6228 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006229 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006230 }
6231}
6232
6233void __stdcall glUniform1f(GLint location, GLfloat x)
6234{
6235 glUniform1fv(location, 1, &x);
6236}
6237
6238void __stdcall glUniform1fv(GLint location, GLsizei count, const GLfloat* v)
6239{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006240 EVENT("(GLint location = %d, GLsizei count = %d, const GLfloat* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006241
6242 try
6243 {
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006244 if (count < 0)
6245 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006246 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006247 }
6248
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006249 if (location == -1)
6250 {
6251 return;
6252 }
6253
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006254 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006255
6256 if (context)
6257 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00006258 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006259 if (!programBinary)
6260 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006261 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006262 }
6263
6264 if (!programBinary->setUniform1fv(location, count, v))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006265 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006266 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006267 }
6268 }
6269 }
6270 catch(std::bad_alloc&)
6271 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006272 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006273 }
6274}
6275
6276void __stdcall glUniform1i(GLint location, GLint x)
6277{
6278 glUniform1iv(location, 1, &x);
6279}
6280
6281void __stdcall glUniform1iv(GLint location, GLsizei count, const GLint* v)
6282{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006283 EVENT("(GLint location = %d, GLsizei count = %d, const GLint* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006284
6285 try
6286 {
6287 if (count < 0)
6288 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006289 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006290 }
6291
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006292 if (location == -1)
6293 {
6294 return;
6295 }
6296
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006297 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006298
6299 if (context)
6300 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00006301 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006302 if (!programBinary)
6303 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006304 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006305 }
6306
6307 if (!programBinary->setUniform1iv(location, count, v))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006308 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006309 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006310 }
6311 }
6312 }
6313 catch(std::bad_alloc&)
6314 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006315 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006316 }
6317}
6318
6319void __stdcall glUniform2f(GLint location, GLfloat x, GLfloat y)
6320{
6321 GLfloat xy[2] = {x, y};
6322
6323 glUniform2fv(location, 1, (GLfloat*)&xy);
6324}
6325
6326void __stdcall glUniform2fv(GLint location, GLsizei count, const GLfloat* v)
6327{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006328 EVENT("(GLint location = %d, GLsizei count = %d, const GLfloat* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006329
6330 try
6331 {
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006332 if (count < 0)
6333 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006334 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006335 }
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006336
6337 if (location == -1)
6338 {
6339 return;
6340 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006341
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006342 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006343
6344 if (context)
6345 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00006346 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006347 if (!programBinary)
6348 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006349 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006350 }
6351
6352 if (!programBinary->setUniform2fv(location, count, v))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006353 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006354 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006355 }
6356 }
6357 }
6358 catch(std::bad_alloc&)
6359 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006360 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006361 }
6362}
6363
6364void __stdcall glUniform2i(GLint location, GLint x, GLint y)
6365{
6366 GLint xy[4] = {x, y};
6367
6368 glUniform2iv(location, 1, (GLint*)&xy);
6369}
6370
6371void __stdcall glUniform2iv(GLint location, GLsizei count, const GLint* v)
6372{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006373 EVENT("(GLint location = %d, GLsizei count = %d, const GLint* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006374
6375 try
6376 {
6377 if (count < 0)
6378 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006379 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006380 }
6381
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006382 if (location == -1)
6383 {
6384 return;
6385 }
6386
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006387 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006388
6389 if (context)
6390 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00006391 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006392 if (!programBinary)
6393 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006394 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006395 }
6396
6397 if (!programBinary->setUniform2iv(location, count, v))
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006398 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006399 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006400 }
6401 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006402 }
6403 catch(std::bad_alloc&)
6404 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006405 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006406 }
6407}
6408
6409void __stdcall glUniform3f(GLint location, GLfloat x, GLfloat y, GLfloat z)
6410{
6411 GLfloat xyz[3] = {x, y, z};
6412
6413 glUniform3fv(location, 1, (GLfloat*)&xyz);
6414}
6415
6416void __stdcall glUniform3fv(GLint location, GLsizei count, const GLfloat* v)
6417{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006418 EVENT("(GLint location = %d, GLsizei count = %d, const GLfloat* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006419
6420 try
6421 {
6422 if (count < 0)
6423 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006424 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006425 }
6426
6427 if (location == -1)
6428 {
6429 return;
6430 }
6431
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006432 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006433
6434 if (context)
6435 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00006436 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006437 if (!programBinary)
6438 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006439 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006440 }
6441
6442 if (!programBinary->setUniform3fv(location, count, v))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006443 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006444 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006445 }
6446 }
6447 }
6448 catch(std::bad_alloc&)
6449 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006450 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006451 }
6452}
6453
6454void __stdcall glUniform3i(GLint location, GLint x, GLint y, GLint z)
6455{
6456 GLint xyz[3] = {x, y, z};
6457
6458 glUniform3iv(location, 1, (GLint*)&xyz);
6459}
6460
6461void __stdcall glUniform3iv(GLint location, GLsizei count, const GLint* v)
6462{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006463 EVENT("(GLint location = %d, GLsizei count = %d, const GLint* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006464
6465 try
6466 {
6467 if (count < 0)
6468 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006469 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006470 }
6471
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006472 if (location == -1)
6473 {
6474 return;
6475 }
6476
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006477 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006478
6479 if (context)
6480 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00006481 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006482 if (!programBinary)
6483 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006484 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006485 }
6486
6487 if (!programBinary->setUniform3iv(location, count, v))
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006488 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006489 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006490 }
6491 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006492 }
6493 catch(std::bad_alloc&)
6494 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006495 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006496 }
6497}
6498
6499void __stdcall glUniform4f(GLint location, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
6500{
6501 GLfloat xyzw[4] = {x, y, z, w};
6502
6503 glUniform4fv(location, 1, (GLfloat*)&xyzw);
6504}
6505
6506void __stdcall glUniform4fv(GLint location, GLsizei count, const GLfloat* v)
6507{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006508 EVENT("(GLint location = %d, GLsizei count = %d, const GLfloat* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006509
6510 try
6511 {
6512 if (count < 0)
6513 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006514 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006515 }
6516
6517 if (location == -1)
6518 {
6519 return;
6520 }
6521
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006522 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006523
6524 if (context)
6525 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00006526 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006527 if (!programBinary)
6528 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006529 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006530 }
6531
6532 if (!programBinary->setUniform4fv(location, count, v))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006533 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006534 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006535 }
6536 }
6537 }
6538 catch(std::bad_alloc&)
6539 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006540 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006541 }
6542}
6543
6544void __stdcall glUniform4i(GLint location, GLint x, GLint y, GLint z, GLint w)
6545{
6546 GLint xyzw[4] = {x, y, z, w};
6547
6548 glUniform4iv(location, 1, (GLint*)&xyzw);
6549}
6550
6551void __stdcall glUniform4iv(GLint location, GLsizei count, const GLint* v)
6552{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006553 EVENT("(GLint location = %d, GLsizei count = %d, const GLint* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006554
6555 try
6556 {
6557 if (count < 0)
6558 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006559 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006560 }
6561
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006562 if (location == -1)
6563 {
6564 return;
6565 }
6566
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006567 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006568
6569 if (context)
6570 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00006571 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006572 if (!programBinary)
6573 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006574 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006575 }
6576
6577 if (!programBinary->setUniform4iv(location, count, v))
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006578 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006579 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006580 }
6581 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006582 }
6583 catch(std::bad_alloc&)
6584 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006585 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006586 }
6587}
6588
6589void __stdcall glUniformMatrix2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
6590{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006591 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00006592 location, count, transpose, value);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006593
6594 try
6595 {
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00006596 if (count < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006597 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006598 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006599 }
6600
6601 if (location == -1)
6602 {
6603 return;
6604 }
6605
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006606 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006607
6608 if (context)
6609 {
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00006610 if (transpose != GL_FALSE && context->getClientVersion() < 3)
6611 {
6612 return gl::error(GL_INVALID_VALUE);
6613 }
6614
daniel@transgaming.com62a28462012-07-24 18:33:59 +00006615 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006616 if (!programBinary)
6617 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006618 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006619 }
6620
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00006621 if (!programBinary->setUniformMatrix2fv(location, count, transpose, value))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006622 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006623 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006624 }
6625 }
6626 }
6627 catch(std::bad_alloc&)
6628 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006629 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006630 }
6631}
6632
6633void __stdcall glUniformMatrix3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
6634{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006635 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00006636 location, count, transpose, value);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006637
6638 try
6639 {
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00006640 if (count < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006641 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006642 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006643 }
6644
6645 if (location == -1)
6646 {
6647 return;
6648 }
6649
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006650 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006651
6652 if (context)
6653 {
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00006654 if (transpose != GL_FALSE && context->getClientVersion() < 3)
6655 {
6656 return gl::error(GL_INVALID_VALUE);
6657 }
6658
daniel@transgaming.com62a28462012-07-24 18:33:59 +00006659 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006660 if (!programBinary)
6661 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006662 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006663 }
6664
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00006665 if (!programBinary->setUniformMatrix3fv(location, count, transpose, value))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006666 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006667 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006668 }
6669 }
6670 }
6671 catch(std::bad_alloc&)
6672 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006673 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006674 }
6675}
6676
6677void __stdcall glUniformMatrix4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
6678{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006679 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00006680 location, count, transpose, value);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006681
6682 try
6683 {
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00006684 if (count < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006685 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006686 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006687 }
6688
6689 if (location == -1)
6690 {
6691 return;
6692 }
6693
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006694 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006695
6696 if (context)
6697 {
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00006698 if (transpose != GL_FALSE && context->getClientVersion() < 3)
6699 {
6700 return gl::error(GL_INVALID_VALUE);
6701 }
6702
daniel@transgaming.com62a28462012-07-24 18:33:59 +00006703 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006704 if (!programBinary)
6705 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006706 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006707 }
6708
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00006709 if (!programBinary->setUniformMatrix4fv(location, count, transpose, value))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006710 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006711 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006712 }
6713 }
6714 }
6715 catch(std::bad_alloc&)
6716 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006717 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006718 }
6719}
6720
6721void __stdcall glUseProgram(GLuint program)
6722{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006723 EVENT("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006724
6725 try
6726 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006727 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006728
6729 if (context)
6730 {
6731 gl::Program *programObject = context->getProgram(program);
6732
daniel@transgaming.comc8478202010-04-13 19:53:35 +00006733 if (!programObject && program != 0)
6734 {
6735 if (context->getShader(program))
6736 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006737 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comc8478202010-04-13 19:53:35 +00006738 }
6739 else
6740 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006741 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comc8478202010-04-13 19:53:35 +00006742 }
6743 }
6744
daniel@transgaming.com716056c2012-07-24 18:38:59 +00006745 if (program != 0 && !programObject->isLinked())
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006746 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006747 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006748 }
6749
6750 context->useProgram(program);
6751 }
6752 }
6753 catch(std::bad_alloc&)
6754 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006755 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006756 }
6757}
6758
6759void __stdcall glValidateProgram(GLuint program)
6760{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006761 EVENT("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006762
6763 try
6764 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006765 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00006766
6767 if (context)
6768 {
6769 gl::Program *programObject = context->getProgram(program);
6770
6771 if (!programObject)
6772 {
6773 if (context->getShader(program))
6774 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006775 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00006776 }
6777 else
6778 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006779 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00006780 }
6781 }
6782
apatrick@chromium.org253b8d22012-06-22 19:27:21 +00006783 programObject->validate();
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00006784 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006785 }
6786 catch(std::bad_alloc&)
6787 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006788 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006789 }
6790}
6791
6792void __stdcall glVertexAttrib1f(GLuint index, GLfloat x)
6793{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006794 EVENT("(GLuint index = %d, GLfloat x = %f)", index, x);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006795
6796 try
6797 {
6798 if (index >= gl::MAX_VERTEX_ATTRIBS)
6799 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006800 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006801 }
6802
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006803 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006804
6805 if (context)
6806 {
6807 GLfloat vals[4] = { x, 0, 0, 1 };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00006808 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006809 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006810 }
6811 catch(std::bad_alloc&)
6812 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006813 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006814 }
6815}
6816
6817void __stdcall glVertexAttrib1fv(GLuint index, const GLfloat* values)
6818{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006819 EVENT("(GLuint index = %d, const GLfloat* values = 0x%0.8p)", index, values);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006820
6821 try
6822 {
6823 if (index >= gl::MAX_VERTEX_ATTRIBS)
6824 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006825 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006826 }
6827
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006828 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006829
6830 if (context)
6831 {
6832 GLfloat vals[4] = { values[0], 0, 0, 1 };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00006833 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006834 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006835 }
6836 catch(std::bad_alloc&)
6837 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006838 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006839 }
6840}
6841
6842void __stdcall glVertexAttrib2f(GLuint index, GLfloat x, GLfloat y)
6843{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006844 EVENT("(GLuint index = %d, GLfloat x = %f, GLfloat y = %f)", index, x, y);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006845
6846 try
6847 {
6848 if (index >= gl::MAX_VERTEX_ATTRIBS)
6849 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006850 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006851 }
6852
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006853 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006854
6855 if (context)
6856 {
6857 GLfloat vals[4] = { x, y, 0, 1 };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00006858 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006859 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006860 }
6861 catch(std::bad_alloc&)
6862 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006863 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006864 }
6865}
6866
6867void __stdcall glVertexAttrib2fv(GLuint index, const GLfloat* values)
6868{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006869 EVENT("(GLuint index = %d, const GLfloat* values = 0x%0.8p)", index, values);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006870
6871 try
6872 {
6873 if (index >= gl::MAX_VERTEX_ATTRIBS)
6874 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006875 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006876 }
6877
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006878 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006879
6880 if (context)
6881 {
6882 GLfloat vals[4] = { values[0], values[1], 0, 1 };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00006883 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006884 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006885 }
6886 catch(std::bad_alloc&)
6887 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006888 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006889 }
6890}
6891
6892void __stdcall glVertexAttrib3f(GLuint index, GLfloat x, GLfloat y, GLfloat z)
6893{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006894 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 +00006895
6896 try
6897 {
6898 if (index >= gl::MAX_VERTEX_ATTRIBS)
6899 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006900 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006901 }
6902
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006903 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006904
6905 if (context)
6906 {
6907 GLfloat vals[4] = { x, y, z, 1 };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00006908 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006909 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006910 }
6911 catch(std::bad_alloc&)
6912 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006913 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006914 }
6915}
6916
6917void __stdcall glVertexAttrib3fv(GLuint index, const GLfloat* values)
6918{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006919 EVENT("(GLuint index = %d, const GLfloat* values = 0x%0.8p)", index, values);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006920
6921 try
6922 {
6923 if (index >= gl::MAX_VERTEX_ATTRIBS)
6924 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006925 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006926 }
6927
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006928 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006929
6930 if (context)
6931 {
6932 GLfloat vals[4] = { values[0], values[1], values[2], 1 };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00006933 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006934 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006935 }
6936 catch(std::bad_alloc&)
6937 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006938 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006939 }
6940}
6941
6942void __stdcall glVertexAttrib4f(GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
6943{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006944 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 +00006945
6946 try
6947 {
6948 if (index >= gl::MAX_VERTEX_ATTRIBS)
6949 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006950 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006951 }
6952
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006953 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006954
6955 if (context)
6956 {
6957 GLfloat vals[4] = { x, y, z, w };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00006958 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006959 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006960 }
6961 catch(std::bad_alloc&)
6962 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006963 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006964 }
6965}
6966
6967void __stdcall glVertexAttrib4fv(GLuint index, const GLfloat* values)
6968{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006969 EVENT("(GLuint index = %d, const GLfloat* values = 0x%0.8p)", index, values);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006970
6971 try
6972 {
6973 if (index >= gl::MAX_VERTEX_ATTRIBS)
6974 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006975 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006976 }
6977
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006978 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006979
6980 if (context)
6981 {
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00006982 context->setVertexAttribf(index, values);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006983 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006984 }
6985 catch(std::bad_alloc&)
6986 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006987 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006988 }
6989}
6990
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00006991void __stdcall glVertexAttribDivisorANGLE(GLuint index, GLuint divisor)
6992{
6993 EVENT("(GLuint index = %d, GLuint divisor = %d)", index, divisor);
6994
6995 try
6996 {
6997 if (index >= gl::MAX_VERTEX_ATTRIBS)
6998 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006999 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00007000 }
7001
7002 gl::Context *context = gl::getNonLostContext();
7003
7004 if (context)
7005 {
7006 context->setVertexAttribDivisor(index, divisor);
7007 }
7008 }
7009 catch(std::bad_alloc&)
7010 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007011 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00007012 }
7013}
7014
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00007015void __stdcall glVertexAttribPointer(GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid* ptr)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007016{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00007017 EVENT("(GLuint index = %d, GLint size = %d, GLenum type = 0x%X, "
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007018 "GLboolean normalized = %u, GLsizei stride = %d, const GLvoid* ptr = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00007019 index, size, type, normalized, stride, ptr);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007020
7021 try
7022 {
7023 if (index >= gl::MAX_VERTEX_ATTRIBS)
7024 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007025 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007026 }
7027
7028 if (size < 1 || size > 4)
7029 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007030 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007031 }
7032
shannon.woods%transgaming.com@gtempaccount.com1a4e09a2013-04-13 03:33:30 +00007033 gl::Context *context = gl::getNonLostContext();
7034
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007035 switch (type)
7036 {
7037 case GL_BYTE:
7038 case GL_UNSIGNED_BYTE:
7039 case GL_SHORT:
7040 case GL_UNSIGNED_SHORT:
7041 case GL_FIXED:
7042 case GL_FLOAT:
7043 break;
shannon.woods%transgaming.com@gtempaccount.com1a4e09a2013-04-13 03:33:30 +00007044 case GL_HALF_FLOAT:
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007045 case GL_INT:
7046 case GL_UNSIGNED_INT:
shannon.woods%transgaming.com@gtempaccount.com1ab57be2013-04-13 03:38:39 +00007047 case GL_INT_2_10_10_10_REV:
7048 case GL_UNSIGNED_INT_2_10_10_10_REV:
shannon.woods%transgaming.com@gtempaccount.com1a4e09a2013-04-13 03:33:30 +00007049 if (context && context->getClientVersion() < 3)
7050 {
7051 return gl::error(GL_INVALID_ENUM);
7052 }
7053 else
7054 {
7055 break;
7056 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007057 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007058 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007059 }
7060
7061 if (stride < 0)
7062 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007063 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007064 }
7065
shannon.woods%transgaming.com@gtempaccount.com1ab57be2013-04-13 03:38:39 +00007066 if ((type == GL_INT_2_10_10_10_REV || type == GL_UNSIGNED_INT_2_10_10_10_REV) && size != 4)
7067 {
7068 return gl::error(GL_INVALID_OPERATION);
7069 }
7070
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007071 if (context)
7072 {
shannon.woods%transgaming.com@gtempaccount.com8de4e6a2013-04-13 03:37:44 +00007073 context->setVertexAttribState(index, context->getArrayBuffer(), size, type,
7074 normalized == GL_TRUE, false, stride, ptr);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007075 }
7076 }
7077 catch(std::bad_alloc&)
7078 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007079 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007080 }
7081}
7082
7083void __stdcall glViewport(GLint x, GLint y, GLsizei width, GLsizei height)
7084{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00007085 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 +00007086
7087 try
7088 {
7089 if (width < 0 || height < 0)
7090 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007091 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007092 }
7093
daniel@transgaming.com9d788502011-11-09 17:46:55 +00007094 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007095
7096 if (context)
7097 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00007098 context->setViewportParams(x, y, width, height);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007099 }
7100 }
7101 catch(std::bad_alloc&)
7102 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007103 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007104 }
7105}
7106
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007107// OpenGL ES 3.0 functions
7108
7109void __stdcall glReadBuffer(GLenum mode)
7110{
7111 EVENT("(GLenum mode = 0x%X)", mode);
7112
7113 try
7114 {
7115 gl::Context *context = gl::getNonLostContext();
7116
7117 if (context)
7118 {
7119 if (context->getClientVersion() < 3)
7120 {
7121 return gl::error(GL_INVALID_OPERATION);
7122 }
7123 }
7124
7125 UNIMPLEMENTED();
7126 }
7127 catch(std::bad_alloc&)
7128 {
7129 return gl::error(GL_OUT_OF_MEMORY);
7130 }
7131}
7132
7133void __stdcall glDrawRangeElements(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid* indices)
7134{
7135 EVENT("(GLenum mode = 0x%X, GLuint start = %u, GLuint end = %u, GLsizei count = %d, GLenum type = 0x%X, "
7136 "const GLvoid* indices = 0x%0.8p)", mode, start, end, count, type, indices);
7137
7138 try
7139 {
7140 gl::Context *context = gl::getNonLostContext();
7141
7142 if (context)
7143 {
7144 if (context->getClientVersion() < 3)
7145 {
7146 return gl::error(GL_INVALID_OPERATION);
7147 }
7148 }
7149
7150 UNIMPLEMENTED();
7151 }
7152 catch(std::bad_alloc&)
7153 {
7154 return gl::error(GL_OUT_OF_MEMORY);
7155 }
7156}
7157
7158void __stdcall glTexImage3D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid* pixels)
7159{
7160 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint internalformat = %d, GLsizei width = %d, "
7161 "GLsizei height = %d, GLsizei depth = %d, GLint border = %d, GLenum format = 0x%X, "
7162 "GLenum type = 0x%X, const GLvoid* pixels = 0x%0.8p)",
7163 target, level, internalformat, width, height, depth, border, format, type, pixels);
7164
7165 try
7166 {
7167 gl::Context *context = gl::getNonLostContext();
7168
7169 if (context)
7170 {
7171 if (context->getClientVersion() < 3)
7172 {
7173 return gl::error(GL_INVALID_OPERATION);
7174 }
7175 }
7176
7177 UNIMPLEMENTED();
7178 }
7179 catch(std::bad_alloc&)
7180 {
7181 return gl::error(GL_OUT_OF_MEMORY);
7182 }
7183}
7184
7185void __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)
7186{
7187 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
7188 "GLint zoffset = %d, GLsizei width = %d, GLsizei height = %d, GLsizei depth = %d, "
7189 "GLenum format = 0x%X, GLenum type = 0x%X, const GLvoid* pixels = 0x%0.8p)",
7190 target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels);
7191
7192 try
7193 {
7194 gl::Context *context = gl::getNonLostContext();
7195
7196 if (context)
7197 {
7198 if (context->getClientVersion() < 3)
7199 {
7200 return gl::error(GL_INVALID_OPERATION);
7201 }
7202 }
7203
7204 UNIMPLEMENTED();
7205 }
7206 catch(std::bad_alloc&)
7207 {
7208 return gl::error(GL_OUT_OF_MEMORY);
7209 }
7210}
7211
7212void __stdcall glCopyTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height)
7213{
7214 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
7215 "GLint zoffset = %d, GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d)",
7216 target, level, xoffset, yoffset, zoffset, x, y, width, height);
7217
7218 try
7219 {
7220 gl::Context *context = gl::getNonLostContext();
7221
7222 if (context)
7223 {
7224 if (context->getClientVersion() < 3)
7225 {
7226 return gl::error(GL_INVALID_OPERATION);
7227 }
7228 }
7229
7230 UNIMPLEMENTED();
7231 }
7232 catch(std::bad_alloc&)
7233 {
7234 return gl::error(GL_OUT_OF_MEMORY);
7235 }
7236}
7237
7238void __stdcall glCompressedTexImage3D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid* data)
7239{
7240 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint internalformat = %d, GLsizei width = %d, "
7241 "GLsizei height = %d, GLsizei depth = %d, GLint border = %d, GLsizei imageSize = %d, "
7242 "const GLvoid* data = 0x%0.8p)",
7243 target, level, internalformat, width, height, depth, border, imageSize, data);
7244
7245 try
7246 {
7247 gl::Context *context = gl::getNonLostContext();
7248
7249 if (context)
7250 {
7251 if (context->getClientVersion() < 3)
7252 {
7253 return gl::error(GL_INVALID_OPERATION);
7254 }
7255 }
7256
7257 UNIMPLEMENTED();
7258 }
7259 catch(std::bad_alloc&)
7260 {
7261 return gl::error(GL_OUT_OF_MEMORY);
7262 }
7263}
7264
7265void __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)
7266{
7267 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
7268 "GLint zoffset = %d, GLsizei width = %d, GLsizei height = %d, GLsizei depth = %d, "
7269 "GLenum format = 0x%X, GLsizei imageSize = %d, const GLvoid* data = 0x%0.8p)",
7270 target, level, xoffset, yoffset, zoffset, width, height, depth, format, imageSize, data);
7271
7272 try
7273 {
7274 gl::Context *context = gl::getNonLostContext();
7275
7276 if (context)
7277 {
7278 if (context->getClientVersion() < 3)
7279 {
7280 return gl::error(GL_INVALID_OPERATION);
7281 }
7282 }
7283
7284 UNIMPLEMENTED();
7285 }
7286 catch(std::bad_alloc&)
7287 {
7288 return gl::error(GL_OUT_OF_MEMORY);
7289 }
7290}
7291
7292void __stdcall glGenQueries(GLsizei n, GLuint* ids)
7293{
7294 EVENT("(GLsizei n = %d, GLuint* ids = 0x%0.8p)", n, ids);
7295
7296 try
7297 {
7298 gl::Context *context = gl::getNonLostContext();
7299
7300 if (context)
7301 {
7302 if (context->getClientVersion() < 3)
7303 {
7304 return gl::error(GL_INVALID_OPERATION);
7305 }
7306 }
7307
7308 UNIMPLEMENTED();
7309 }
7310 catch(std::bad_alloc&)
7311 {
7312 return gl::error(GL_OUT_OF_MEMORY);
7313 }
7314}
7315
7316void __stdcall glDeleteQueries(GLsizei n, const GLuint* ids)
7317{
7318 EVENT("(GLsizei n = %d, GLuint* ids = 0x%0.8p)", n, ids);
7319
7320 try
7321 {
7322 gl::Context *context = gl::getNonLostContext();
7323
7324 if (context)
7325 {
7326 if (context->getClientVersion() < 3)
7327 {
7328 return gl::error(GL_INVALID_OPERATION);
7329 }
7330 }
7331
7332 UNIMPLEMENTED();
7333 }
7334 catch(std::bad_alloc&)
7335 {
7336 return gl::error(GL_OUT_OF_MEMORY);
7337 }
7338}
7339
7340GLboolean __stdcall glIsQuery(GLuint id)
7341{
7342 EVENT("(GLuint id = %u)", id);
7343
7344 try
7345 {
7346 gl::Context *context = gl::getNonLostContext();
7347
7348 if (context)
7349 {
7350 if (context->getClientVersion() < 3)
7351 {
7352 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
7353 }
7354 }
7355
7356 UNIMPLEMENTED();
7357 }
7358 catch(std::bad_alloc&)
7359 {
7360 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
7361 }
7362
7363 return GL_FALSE;
7364}
7365
7366void __stdcall glBeginQuery(GLenum target, GLuint id)
7367{
7368 EVENT("(GLenum target = 0x%X, GLuint id = %u)", target, id);
7369
7370 try
7371 {
7372 gl::Context *context = gl::getNonLostContext();
7373
7374 if (context)
7375 {
7376 if (context->getClientVersion() < 3)
7377 {
7378 return gl::error(GL_INVALID_OPERATION);
7379 }
7380 }
7381
7382 UNIMPLEMENTED();
7383 }
7384 catch(std::bad_alloc&)
7385 {
7386 return gl::error(GL_OUT_OF_MEMORY);
7387 }
7388}
7389
7390void __stdcall glEndQuery(GLenum target)
7391{
7392 EVENT("(GLenum target = 0x%X)", target);
7393
7394 try
7395 {
7396 gl::Context *context = gl::getNonLostContext();
7397
7398 if (context)
7399 {
7400 if (context->getClientVersion() < 3)
7401 {
7402 return gl::error(GL_INVALID_OPERATION);
7403 }
7404 }
7405
7406 UNIMPLEMENTED();
7407 }
7408 catch(std::bad_alloc&)
7409 {
7410 return gl::error(GL_OUT_OF_MEMORY);
7411 }
7412}
7413
7414void __stdcall glGetQueryiv(GLenum target, GLenum pname, GLint* params)
7415{
7416 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLint* params = 0x%0.8p)", target, pname, params);
7417
7418 try
7419 {
7420 gl::Context *context = gl::getNonLostContext();
7421
7422 if (context)
7423 {
7424 if (context->getClientVersion() < 3)
7425 {
7426 return gl::error(GL_INVALID_OPERATION);
7427 }
7428 }
7429
7430 UNIMPLEMENTED();
7431 }
7432 catch(std::bad_alloc&)
7433 {
7434 return gl::error(GL_OUT_OF_MEMORY);
7435 }
7436}
7437
7438void __stdcall glGetQueryObjectuiv(GLuint id, GLenum pname, GLuint* params)
7439{
7440 EVENT("(GLuint id = %u, GLenum pname = 0x%X, GLint* params = 0x%0.8p)", id, pname, params);
7441
7442 try
7443 {
7444 gl::Context *context = gl::getNonLostContext();
7445
7446 if (context)
7447 {
7448 if (context->getClientVersion() < 3)
7449 {
7450 return gl::error(GL_INVALID_OPERATION);
7451 }
7452 }
7453
7454 UNIMPLEMENTED();
7455 }
7456 catch(std::bad_alloc&)
7457 {
7458 return gl::error(GL_OUT_OF_MEMORY);
7459 }
7460}
7461
7462GLboolean __stdcall glUnmapBuffer(GLenum target)
7463{
7464 EVENT("(GLenum target = 0x%X)", target);
7465
7466 try
7467 {
7468 gl::Context *context = gl::getNonLostContext();
7469
7470 if (context)
7471 {
7472 if (context->getClientVersion() < 3)
7473 {
7474 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
7475 }
7476 }
7477
7478 UNIMPLEMENTED();
7479 }
7480 catch(std::bad_alloc&)
7481 {
7482 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
7483 }
7484
7485 return GL_FALSE;
7486}
7487
7488void __stdcall glGetBufferPointerv(GLenum target, GLenum pname, GLvoid** params)
7489{
7490 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLvoid** params = 0x%0.8p)", target, pname, params);
7491
7492 try
7493 {
7494 gl::Context *context = gl::getNonLostContext();
7495
7496 if (context)
7497 {
7498 if (context->getClientVersion() < 3)
7499 {
7500 return gl::error(GL_INVALID_OPERATION);
7501 }
7502 }
7503
7504 UNIMPLEMENTED();
7505 }
7506 catch(std::bad_alloc&)
7507 {
7508 return gl::error(GL_OUT_OF_MEMORY);
7509 }
7510}
7511
7512void __stdcall glDrawBuffers(GLsizei n, const GLenum* bufs)
7513{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007514 try
7515 {
7516 gl::Context *context = gl::getNonLostContext();
7517
7518 if (context)
7519 {
7520 if (context->getClientVersion() < 3)
7521 {
7522 return gl::error(GL_INVALID_OPERATION);
7523 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007524
shannon.woods%transgaming.com@gtempaccount.com7948c5f2013-04-13 03:38:58 +00007525 glDrawBuffersEXT(n, bufs);
7526 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007527 }
7528 catch(std::bad_alloc&)
7529 {
7530 return gl::error(GL_OUT_OF_MEMORY);
7531 }
7532}
7533
7534void __stdcall glUniformMatrix2x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
7535{
7536 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
7537 location, count, transpose, value);
7538
7539 try
7540 {
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00007541 if (count < 0)
7542 {
7543 return gl::error(GL_INVALID_VALUE);
7544 }
7545
7546 if (location == -1)
7547 {
7548 return;
7549 }
7550
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007551 gl::Context *context = gl::getNonLostContext();
7552
7553 if (context)
7554 {
7555 if (context->getClientVersion() < 3)
7556 {
7557 return gl::error(GL_INVALID_OPERATION);
7558 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007559
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00007560 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
7561 if (!programBinary)
7562 {
7563 return gl::error(GL_INVALID_OPERATION);
7564 }
7565
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00007566 if (!programBinary->setUniformMatrix2x3fv(location, count, transpose, value))
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00007567 {
7568 return gl::error(GL_INVALID_OPERATION);
7569 }
7570 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007571 }
7572 catch(std::bad_alloc&)
7573 {
7574 return gl::error(GL_OUT_OF_MEMORY);
7575 }
7576}
7577
7578void __stdcall glUniformMatrix3x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
7579{
7580 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
7581 location, count, transpose, value);
7582
7583 try
7584 {
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00007585 if (count < 0)
7586 {
7587 return gl::error(GL_INVALID_VALUE);
7588 }
7589
7590 if (location == -1)
7591 {
7592 return;
7593 }
7594
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007595 gl::Context *context = gl::getNonLostContext();
7596
7597 if (context)
7598 {
7599 if (context->getClientVersion() < 3)
7600 {
7601 return gl::error(GL_INVALID_OPERATION);
7602 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007603
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00007604 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
7605 if (!programBinary)
7606 {
7607 return gl::error(GL_INVALID_OPERATION);
7608 }
7609
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00007610 if (!programBinary->setUniformMatrix3x2fv(location, count, transpose, value))
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00007611 {
7612 return gl::error(GL_INVALID_OPERATION);
7613 }
7614 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007615 }
7616 catch(std::bad_alloc&)
7617 {
7618 return gl::error(GL_OUT_OF_MEMORY);
7619 }
7620}
7621
7622void __stdcall glUniformMatrix2x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
7623{
7624 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
7625 location, count, transpose, value);
7626
7627 try
7628 {
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00007629 if (count < 0)
7630 {
7631 return gl::error(GL_INVALID_VALUE);
7632 }
7633
7634 if (location == -1)
7635 {
7636 return;
7637 }
7638
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007639 gl::Context *context = gl::getNonLostContext();
7640
7641 if (context)
7642 {
7643 if (context->getClientVersion() < 3)
7644 {
7645 return gl::error(GL_INVALID_OPERATION);
7646 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007647
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00007648 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
7649 if (!programBinary)
7650 {
7651 return gl::error(GL_INVALID_OPERATION);
7652 }
7653
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00007654 if (!programBinary->setUniformMatrix2x4fv(location, count, transpose, value))
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00007655 {
7656 return gl::error(GL_INVALID_OPERATION);
7657 }
7658 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007659 }
7660 catch(std::bad_alloc&)
7661 {
7662 return gl::error(GL_OUT_OF_MEMORY);
7663 }
7664}
7665
7666void __stdcall glUniformMatrix4x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
7667{
7668 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
7669 location, count, transpose, value);
7670
7671 try
7672 {
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00007673 if (count < 0)
7674 {
7675 return gl::error(GL_INVALID_VALUE);
7676 }
7677
7678 if (location == -1)
7679 {
7680 return;
7681 }
7682
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007683 gl::Context *context = gl::getNonLostContext();
7684
7685 if (context)
7686 {
7687 if (context->getClientVersion() < 3)
7688 {
7689 return gl::error(GL_INVALID_OPERATION);
7690 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007691
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00007692 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
7693 if (!programBinary)
7694 {
7695 return gl::error(GL_INVALID_OPERATION);
7696 }
7697
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00007698 if (!programBinary->setUniformMatrix4x2fv(location, count, transpose, value))
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00007699 {
7700 return gl::error(GL_INVALID_OPERATION);
7701 }
7702 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007703 }
7704 catch(std::bad_alloc&)
7705 {
7706 return gl::error(GL_OUT_OF_MEMORY);
7707 }
7708}
7709
7710void __stdcall glUniformMatrix3x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
7711{
7712 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
7713 location, count, transpose, value);
7714
7715 try
7716 {
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00007717 if (count < 0)
7718 {
7719 return gl::error(GL_INVALID_VALUE);
7720 }
7721
7722 if (location == -1)
7723 {
7724 return;
7725 }
7726
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007727 gl::Context *context = gl::getNonLostContext();
7728
7729 if (context)
7730 {
7731 if (context->getClientVersion() < 3)
7732 {
7733 return gl::error(GL_INVALID_OPERATION);
7734 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007735
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00007736 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
7737 if (!programBinary)
7738 {
7739 return gl::error(GL_INVALID_OPERATION);
7740 }
7741
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00007742 if (!programBinary->setUniformMatrix3x4fv(location, count, transpose, value))
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00007743 {
7744 return gl::error(GL_INVALID_OPERATION);
7745 }
7746 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007747 }
7748 catch(std::bad_alloc&)
7749 {
7750 return gl::error(GL_OUT_OF_MEMORY);
7751 }
7752}
7753
7754void __stdcall glUniformMatrix4x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
7755{
7756 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
7757 location, count, transpose, value);
7758
7759 try
7760 {
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00007761 if (count < 0)
7762 {
7763 return gl::error(GL_INVALID_VALUE);
7764 }
7765
7766 if (location == -1)
7767 {
7768 return;
7769 }
7770
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007771 gl::Context *context = gl::getNonLostContext();
7772
7773 if (context)
7774 {
7775 if (context->getClientVersion() < 3)
7776 {
7777 return gl::error(GL_INVALID_OPERATION);
7778 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007779
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00007780 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
7781 if (!programBinary)
7782 {
7783 return gl::error(GL_INVALID_OPERATION);
7784 }
7785
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00007786 if (!programBinary->setUniformMatrix4x3fv(location, count, transpose, value))
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00007787 {
7788 return gl::error(GL_INVALID_OPERATION);
7789 }
7790 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007791 }
7792 catch(std::bad_alloc&)
7793 {
7794 return gl::error(GL_OUT_OF_MEMORY);
7795 }
7796}
7797
7798void __stdcall glBlitFramebuffer(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter)
7799{
7800 EVENT("(GLint srcX0 = %d, GLint srcY0 = %d, GLint srcX1 = %d, GLint srcY1 = %d, GLint dstX0 = %d, "
7801 "GLint dstY0 = %d, GLint dstX1 = %d, GLint dstY1 = %d, GLbitfield mask = 0x%X, GLenum filter = 0x%X)",
7802 srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter);
7803
7804 try
7805 {
7806 gl::Context *context = gl::getNonLostContext();
7807
7808 if (context)
7809 {
7810 if (context->getClientVersion() < 3)
7811 {
7812 return gl::error(GL_INVALID_OPERATION);
7813 }
7814 }
7815
7816 UNIMPLEMENTED();
7817 }
7818 catch(std::bad_alloc&)
7819 {
7820 return gl::error(GL_OUT_OF_MEMORY);
7821 }
7822}
7823
7824void __stdcall glRenderbufferStorageMultisample(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height)
7825{
7826 EVENT("(GLenum target = 0x%X, GLsizei samples = %d, GLenum internalformat = 0x%X, GLsizei width = %d, GLsizei height = %d)",
7827 target, samples, internalformat, width, height);
7828
7829 try
7830 {
7831 gl::Context *context = gl::getNonLostContext();
7832
7833 if (context)
7834 {
7835 if (context->getClientVersion() < 3)
7836 {
7837 return gl::error(GL_INVALID_OPERATION);
7838 }
7839 }
7840
7841 UNIMPLEMENTED();
7842 }
7843 catch(std::bad_alloc&)
7844 {
7845 return gl::error(GL_OUT_OF_MEMORY);
7846 }
7847}
7848
7849void __stdcall glFramebufferTextureLayer(GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer)
7850{
7851 EVENT("(GLenum target = 0x%X, GLenum attachment = 0x%X, GLuint texture = %u, GLint level = %d, GLint layer = %d)",
7852 target, attachment, texture, level, layer);
7853
7854 try
7855 {
7856 gl::Context *context = gl::getNonLostContext();
7857
7858 if (context)
7859 {
7860 if (context->getClientVersion() < 3)
7861 {
7862 return gl::error(GL_INVALID_OPERATION);
7863 }
7864 }
7865
7866 UNIMPLEMENTED();
7867 }
7868 catch(std::bad_alloc&)
7869 {
7870 return gl::error(GL_OUT_OF_MEMORY);
7871 }
7872}
7873
7874GLvoid* __stdcall glMapBufferRange(GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access)
7875{
7876 EVENT("(GLenum target = 0x%X, GLintptr offset = %d, GLsizeiptr length = %d, GLbitfield access = 0x%X)",
7877 target, offset, length, access);
7878
7879 try
7880 {
7881 gl::Context *context = gl::getNonLostContext();
7882
7883 if (context)
7884 {
7885 if (context->getClientVersion() < 3)
7886 {
7887 return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLvoid*>(NULL));
7888 }
7889 }
7890
7891 UNIMPLEMENTED();
7892 }
7893 catch(std::bad_alloc&)
7894 {
7895 return gl::error(GL_OUT_OF_MEMORY, reinterpret_cast<GLvoid*>(NULL));
7896 }
7897
7898 return NULL;
7899}
7900
7901void __stdcall glFlushMappedBufferRange(GLenum target, GLintptr offset, GLsizeiptr length)
7902{
7903 EVENT("(GLenum target = 0x%X, GLintptr offset = %d, GLsizeiptr length = %d)", target, offset, length);
7904
7905 try
7906 {
7907 gl::Context *context = gl::getNonLostContext();
7908
7909 if (context)
7910 {
7911 if (context->getClientVersion() < 3)
7912 {
7913 return gl::error(GL_INVALID_OPERATION);
7914 }
7915 }
7916
7917 UNIMPLEMENTED();
7918 }
7919 catch(std::bad_alloc&)
7920 {
7921 return gl::error(GL_OUT_OF_MEMORY);
7922 }
7923}
7924
7925void __stdcall glBindVertexArray(GLuint array)
7926{
7927 EVENT("(GLuint array = %u)", array);
7928
7929 try
7930 {
7931 gl::Context *context = gl::getNonLostContext();
7932
7933 if (context)
7934 {
7935 if (context->getClientVersion() < 3)
7936 {
7937 return gl::error(GL_INVALID_OPERATION);
7938 }
7939 }
7940
7941 UNIMPLEMENTED();
7942 }
7943 catch(std::bad_alloc&)
7944 {
7945 return gl::error(GL_OUT_OF_MEMORY);
7946 }
7947}
7948
7949void __stdcall glDeleteVertexArrays(GLsizei n, const GLuint* arrays)
7950{
7951 EVENT("(GLsizei n = %d, const GLuint* arrays = 0x%0.8p)", n, arrays);
7952
7953 try
7954 {
7955 gl::Context *context = gl::getNonLostContext();
7956
7957 if (context)
7958 {
7959 if (context->getClientVersion() < 3)
7960 {
7961 return gl::error(GL_INVALID_OPERATION);
7962 }
7963 }
7964
7965 UNIMPLEMENTED();
7966 }
7967 catch(std::bad_alloc&)
7968 {
7969 return gl::error(GL_OUT_OF_MEMORY);
7970 }
7971}
7972
7973void __stdcall glGenVertexArrays(GLsizei n, GLuint* arrays)
7974{
7975 EVENT("(GLsizei n = %d, GLuint* arrays = 0x%0.8p)", n, arrays);
7976
7977 try
7978 {
7979 gl::Context *context = gl::getNonLostContext();
7980
7981 if (context)
7982 {
7983 if (context->getClientVersion() < 3)
7984 {
7985 return gl::error(GL_INVALID_OPERATION);
7986 }
7987 }
7988
7989 UNIMPLEMENTED();
7990 }
7991 catch(std::bad_alloc&)
7992 {
7993 return gl::error(GL_OUT_OF_MEMORY);
7994 }
7995}
7996
7997GLboolean __stdcall glIsVertexArray(GLuint array)
7998{
7999 EVENT("(GLuint array = %u)", array);
8000
8001 try
8002 {
8003 gl::Context *context = gl::getNonLostContext();
8004
8005 if (context)
8006 {
8007 if (context->getClientVersion() < 3)
8008 {
8009 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
8010 }
8011 }
8012
8013 UNIMPLEMENTED();
8014 }
8015 catch(std::bad_alloc&)
8016 {
8017 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
8018 }
8019
8020 return GL_FALSE;
8021}
8022
8023void __stdcall glGetIntegeri_v(GLenum target, GLuint index, GLint* data)
8024{
8025 EVENT("(GLenum target = 0x%X, GLuint index = %u, GLint* data = 0x%0.8p)",
8026 target, index, data);
8027
8028 try
8029 {
8030 gl::Context *context = gl::getNonLostContext();
8031
8032 if (context)
8033 {
8034 if (context->getClientVersion() < 3)
8035 {
8036 return gl::error(GL_INVALID_OPERATION);
8037 }
8038 }
8039
8040 UNIMPLEMENTED();
8041 }
8042 catch(std::bad_alloc&)
8043 {
8044 return gl::error(GL_OUT_OF_MEMORY);
8045 }
8046}
8047
8048void __stdcall glBeginTransformFeedback(GLenum primitiveMode)
8049{
8050 EVENT("(GLenum primitiveMode = 0x%X)", primitiveMode);
8051
8052 try
8053 {
8054 gl::Context *context = gl::getNonLostContext();
8055
8056 if (context)
8057 {
8058 if (context->getClientVersion() < 3)
8059 {
8060 return gl::error(GL_INVALID_OPERATION);
8061 }
8062 }
8063
8064 UNIMPLEMENTED();
8065 }
8066 catch(std::bad_alloc&)
8067 {
8068 return gl::error(GL_OUT_OF_MEMORY);
8069 }
8070}
8071
8072void __stdcall glEndTransformFeedback(void)
8073{
8074 EVENT("(void)");
8075
8076 try
8077 {
8078 gl::Context *context = gl::getNonLostContext();
8079
8080 if (context)
8081 {
8082 if (context->getClientVersion() < 3)
8083 {
8084 return gl::error(GL_INVALID_OPERATION);
8085 }
8086 }
8087
8088 UNIMPLEMENTED();
8089 }
8090 catch(std::bad_alloc&)
8091 {
8092 return gl::error(GL_OUT_OF_MEMORY);
8093 }
8094}
8095
8096void __stdcall glBindBufferRange(GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size)
8097{
8098 EVENT("(GLenum target = 0x%X, GLuint index = %u, GLuint buffer = %u, GLintptr offset = %d, GLsizeiptr size = %d)",
8099 target, index, buffer, offset, size);
8100
8101 try
8102 {
8103 gl::Context *context = gl::getNonLostContext();
8104
8105 if (context)
8106 {
8107 if (context->getClientVersion() < 3)
8108 {
8109 return gl::error(GL_INVALID_OPERATION);
8110 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008111
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00008112 switch (target)
8113 {
8114 case GL_TRANSFORM_FEEDBACK_BUFFER:
8115 if (index > context->getMaxTransformFeedbackBufferBindings())
8116 {
8117 return gl::error(GL_INVALID_VALUE);
8118 }
8119 break;
8120
8121 case GL_UNIFORM_BUFFER:
8122 if (index >= context->getMaximumCombinedUniformBufferBindings())
8123 {
8124 return gl::error(GL_INVALID_VALUE);
8125 }
8126 break;
8127
8128 default:
8129 return gl::error(GL_INVALID_ENUM);
8130 }
8131
8132 gl::Buffer *bufferObject = context->getBuffer(buffer);
8133 if (!bufferObject)
8134 {
8135 // Buffer index must not have been valid
8136 return gl::error(GL_INVALID_VALUE);
8137 }
8138
8139 if (size <= 0 || static_cast<unsigned int>(offset + size) > bufferObject->size())
8140 {
8141 return gl::error(GL_INVALID_VALUE);
8142 }
8143
8144 switch (target)
8145 {
8146 case GL_TRANSFORM_FEEDBACK_BUFFER:
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +00008147 context->bindIndexedTransformFeedbackBuffer(buffer, index, offset, size);
8148 context->bindGenericTransformFeedbackBuffer(buffer);
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00008149 break;
8150
8151 case GL_UNIFORM_BUFFER:
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +00008152 context->bindIndexedUniformBuffer(buffer, index, offset, size);
8153 context->bindGenericUniformBuffer(buffer);
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00008154 break;
8155
8156 default:
8157 UNREACHABLE();
8158 }
8159 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008160 }
8161 catch(std::bad_alloc&)
8162 {
8163 return gl::error(GL_OUT_OF_MEMORY);
8164 }
8165}
8166
8167void __stdcall glBindBufferBase(GLenum target, GLuint index, GLuint buffer)
8168{
8169 EVENT("(GLenum target = 0x%X, GLuint index = %u, GLuint buffer = %u)",
8170 target, index, buffer);
8171
8172 try
8173 {
8174 gl::Context *context = gl::getNonLostContext();
8175
8176 if (context)
8177 {
8178 if (context->getClientVersion() < 3)
8179 {
8180 return gl::error(GL_INVALID_OPERATION);
8181 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008182
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00008183 switch (target)
8184 {
8185 case GL_TRANSFORM_FEEDBACK_BUFFER:
8186 if (index > context->getMaxTransformFeedbackBufferBindings())
8187 {
8188 return gl::error(GL_INVALID_VALUE);
8189 }
8190 break;
8191
8192 case GL_UNIFORM_BUFFER:
8193 if (index > context->getMaximumCombinedUniformBufferBindings())
8194 {
8195 return gl::error(GL_INVALID_VALUE);
8196 }
8197 break;
8198
8199 default:
8200 return gl::error(GL_INVALID_ENUM);
8201 }
8202
8203 gl::Buffer *bufferObject = context->getBuffer(buffer);
8204 if (!bufferObject)
8205 {
8206 // Buffer index must not have been valid
8207 return gl::error(GL_INVALID_VALUE);
8208 }
8209
8210 switch (target)
8211 {
8212 case GL_TRANSFORM_FEEDBACK_BUFFER:
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +00008213 context->bindIndexedTransformFeedbackBuffer(buffer, index, 0, -1);
8214 context->bindGenericTransformFeedbackBuffer(buffer);
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00008215 break;
8216
8217 case GL_UNIFORM_BUFFER:
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +00008218 context->bindIndexedUniformBuffer(buffer, index, 0, -1);
8219 context->bindGenericUniformBuffer(buffer);
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00008220 break;
8221
8222 default:
8223 UNREACHABLE();
8224 }
8225 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008226 }
8227 catch(std::bad_alloc&)
8228 {
8229 return gl::error(GL_OUT_OF_MEMORY);
8230 }
8231}
8232
8233void __stdcall glTransformFeedbackVaryings(GLuint program, GLsizei count, const GLchar* const* varyings, GLenum bufferMode)
8234{
8235 EVENT("(GLuint program = %u, GLsizei count = %d, const GLchar* const* varyings = 0x%0.8p, GLenum bufferMode = 0x%X)",
8236 program, count, varyings, bufferMode);
8237
8238 try
8239 {
8240 gl::Context *context = gl::getNonLostContext();
8241
8242 if (context)
8243 {
8244 if (context->getClientVersion() < 3)
8245 {
8246 return gl::error(GL_INVALID_OPERATION);
8247 }
8248 }
8249
8250 UNIMPLEMENTED();
8251 }
8252 catch(std::bad_alloc&)
8253 {
8254 return gl::error(GL_OUT_OF_MEMORY);
8255 }
8256}
8257
8258void __stdcall glGetTransformFeedbackVarying(GLuint program, GLuint index, GLsizei bufSize, GLsizei* length, GLsizei* size, GLenum* type, GLchar* name)
8259{
8260 EVENT("(GLuint program = %u, GLuint index = %u, GLsizei bufSize = %d, GLsizei* length = 0x%0.8p, "
8261 "GLsizei* size = 0x%0.8p, GLenum* type = 0x%0.8p, GLchar* name = 0x%0.8p)",
8262 program, index, bufSize, length, size, type, name);
8263
8264 try
8265 {
8266 gl::Context *context = gl::getNonLostContext();
8267
8268 if (context)
8269 {
8270 if (context->getClientVersion() < 3)
8271 {
8272 return gl::error(GL_INVALID_OPERATION);
8273 }
8274 }
8275
8276 UNIMPLEMENTED();
8277 }
8278 catch(std::bad_alloc&)
8279 {
8280 return gl::error(GL_OUT_OF_MEMORY);
8281 }
8282}
8283
8284void __stdcall glVertexAttribIPointer(GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid* pointer)
8285{
8286 EVENT("(GLuint index = %u, GLint size = %d, GLenum type = 0x%X, GLsizei stride = %d, const GLvoid* pointer = 0x%0.8p)",
8287 index, size, type, stride, pointer);
8288
8289 try
8290 {
8291 gl::Context *context = gl::getNonLostContext();
8292
8293 if (context)
8294 {
8295 if (context->getClientVersion() < 3)
8296 {
8297 return gl::error(GL_INVALID_OPERATION);
8298 }
8299 }
8300
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00008301 if (index >= gl::MAX_VERTEX_ATTRIBS)
8302 {
8303 return gl::error(GL_INVALID_VALUE);
8304 }
8305
8306 if (size < 1 || size > 4)
8307 {
8308 return gl::error(GL_INVALID_VALUE);
8309 }
8310
8311 switch (type)
8312 {
8313 case GL_BYTE:
8314 case GL_UNSIGNED_BYTE:
8315 case GL_SHORT:
8316 case GL_UNSIGNED_SHORT:
8317 case GL_INT:
8318 case GL_UNSIGNED_INT:
shannon.woods%transgaming.com@gtempaccount.com1ab57be2013-04-13 03:38:39 +00008319 case GL_INT_2_10_10_10_REV:
8320 case GL_UNSIGNED_INT_2_10_10_10_REV:
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00008321 break;
8322 default:
8323 return gl::error(GL_INVALID_ENUM);
8324 }
8325
8326 if (stride < 0)
8327 {
8328 return gl::error(GL_INVALID_VALUE);
8329 }
8330
shannon.woods%transgaming.com@gtempaccount.com1ab57be2013-04-13 03:38:39 +00008331 if ((type == GL_INT_2_10_10_10_REV || type == GL_UNSIGNED_INT_2_10_10_10_REV) && size != 4)
8332 {
8333 return gl::error(GL_INVALID_OPERATION);
8334 }
8335
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00008336 if (context)
8337 {
8338 context->setVertexAttribState(index, context->getArrayBuffer(), size, type, false, true,
8339 stride, pointer);
8340 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008341 }
8342 catch(std::bad_alloc&)
8343 {
8344 return gl::error(GL_OUT_OF_MEMORY);
8345 }
8346}
8347
8348void __stdcall glGetVertexAttribIiv(GLuint index, GLenum pname, GLint* params)
8349{
8350 EVENT("(GLuint index = %u, GLenum pname = 0x%X, GLint* params = 0x%0.8p)",
8351 index, pname, params);
8352
8353 try
8354 {
8355 gl::Context *context = gl::getNonLostContext();
8356
8357 if (context)
8358 {
8359 if (context->getClientVersion() < 3)
8360 {
8361 return gl::error(GL_INVALID_OPERATION);
8362 }
8363 }
8364
8365 UNIMPLEMENTED();
8366 }
8367 catch(std::bad_alloc&)
8368 {
8369 return gl::error(GL_OUT_OF_MEMORY);
8370 }
8371}
8372
8373void __stdcall glGetVertexAttribIuiv(GLuint index, GLenum pname, GLuint* params)
8374{
8375 EVENT("(GLuint index = %u, GLenum pname = 0x%X, GLuint* params = 0x%0.8p)",
8376 index, pname, params);
8377
8378 try
8379 {
8380 gl::Context *context = gl::getNonLostContext();
8381
8382 if (context)
8383 {
8384 if (context->getClientVersion() < 3)
8385 {
8386 return gl::error(GL_INVALID_OPERATION);
8387 }
8388 }
8389
8390 UNIMPLEMENTED();
8391 }
8392 catch(std::bad_alloc&)
8393 {
8394 return gl::error(GL_OUT_OF_MEMORY);
8395 }
8396}
8397
8398void __stdcall glVertexAttribI4i(GLuint index, GLint x, GLint y, GLint z, GLint w)
8399{
8400 EVENT("(GLuint index = %u, GLint x = %d, GLint y = %d, GLint z = %d, GLint w = %d)",
8401 index, x, y, z, w);
8402
8403 try
8404 {
8405 gl::Context *context = gl::getNonLostContext();
8406
8407 if (context)
8408 {
8409 if (context->getClientVersion() < 3)
8410 {
8411 return gl::error(GL_INVALID_OPERATION);
8412 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008413
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00008414 if (index >= gl::MAX_VERTEX_ATTRIBS)
8415 {
8416 return gl::error(GL_INVALID_VALUE);
8417 }
8418
8419 GLint vals[4] = { x, y, z, w };
8420 context->setVertexAttribi(index, vals);
8421 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008422 }
8423 catch(std::bad_alloc&)
8424 {
8425 return gl::error(GL_OUT_OF_MEMORY);
8426 }
8427}
8428
8429void __stdcall glVertexAttribI4ui(GLuint index, GLuint x, GLuint y, GLuint z, GLuint w)
8430{
8431 EVENT("(GLuint index = %u, GLuint x = %u, GLuint y = %u, GLuint z = %u, GLuint w = %u)",
8432 index, x, y, z, w);
8433
8434 try
8435 {
8436 gl::Context *context = gl::getNonLostContext();
8437
8438 if (context)
8439 {
8440 if (context->getClientVersion() < 3)
8441 {
8442 return gl::error(GL_INVALID_OPERATION);
8443 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008444
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00008445 if (index >= gl::MAX_VERTEX_ATTRIBS)
8446 {
8447 return gl::error(GL_INVALID_VALUE);
8448 }
8449
8450 GLuint vals[4] = { x, y, z, w };
8451 context->setVertexAttribu(index, vals);
8452 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008453 }
8454 catch(std::bad_alloc&)
8455 {
8456 return gl::error(GL_OUT_OF_MEMORY);
8457 }
8458}
8459
8460void __stdcall glVertexAttribI4iv(GLuint index, const GLint* v)
8461{
8462 EVENT("(GLuint index = %u, const GLint* v = 0x%0.8p)", index, v);
8463
8464 try
8465 {
8466 gl::Context *context = gl::getNonLostContext();
8467
8468 if (context)
8469 {
8470 if (context->getClientVersion() < 3)
8471 {
8472 return gl::error(GL_INVALID_OPERATION);
8473 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008474
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00008475 if (index >= gl::MAX_VERTEX_ATTRIBS)
8476 {
8477 return gl::error(GL_INVALID_VALUE);
8478 }
8479
8480 context->setVertexAttribi(index, v);
8481 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008482 }
8483 catch(std::bad_alloc&)
8484 {
8485 return gl::error(GL_OUT_OF_MEMORY);
8486 }
8487}
8488
8489void __stdcall glVertexAttribI4uiv(GLuint index, const GLuint* v)
8490{
8491 EVENT("(GLuint index = %u, const GLuint* v = 0x%0.8p)", index, v);
8492
8493 try
8494 {
8495 gl::Context *context = gl::getNonLostContext();
8496
8497 if (context)
8498 {
8499 if (context->getClientVersion() < 3)
8500 {
8501 return gl::error(GL_INVALID_OPERATION);
8502 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008503
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00008504 if (index >= gl::MAX_VERTEX_ATTRIBS)
8505 {
8506 return gl::error(GL_INVALID_VALUE);
8507 }
8508
8509 context->setVertexAttribu(index, v);
8510 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008511 }
8512 catch(std::bad_alloc&)
8513 {
8514 return gl::error(GL_OUT_OF_MEMORY);
8515 }
8516}
8517
8518void __stdcall glGetUniformuiv(GLuint program, GLint location, GLuint* params)
8519{
8520 EVENT("(GLuint program = %u, GLint location = %d, GLuint* params = 0x%0.8p)",
8521 program, location, params);
8522
8523 try
8524 {
8525 gl::Context *context = gl::getNonLostContext();
8526
8527 if (context)
8528 {
8529 if (context->getClientVersion() < 3)
8530 {
8531 return gl::error(GL_INVALID_OPERATION);
8532 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008533
shannon.woods%transgaming.com@gtempaccount.come2290122013-04-13 03:41:07 +00008534 if (program == 0)
8535 {
8536 return gl::error(GL_INVALID_VALUE);
8537 }
8538
8539 gl::Program *programObject = context->getProgram(program);
8540
8541 if (!programObject || !programObject->isLinked())
8542 {
8543 return gl::error(GL_INVALID_OPERATION);
8544 }
8545
8546 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
8547 if (!programBinary)
8548 {
8549 return gl::error(GL_INVALID_OPERATION);
8550 }
8551
8552 if (!programBinary->getUniformuiv(location, NULL, params))
8553 {
8554 return gl::error(GL_INVALID_OPERATION);
8555 }
8556 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008557 }
8558 catch(std::bad_alloc&)
8559 {
8560 return gl::error(GL_OUT_OF_MEMORY);
8561 }
8562}
8563
8564GLint __stdcall glGetFragDataLocation(GLuint program, const GLchar *name)
8565{
8566 EVENT("(GLuint program = %u, const GLchar *name = 0x%0.8p)",
8567 program, name);
8568
8569 try
8570 {
8571 gl::Context *context = gl::getNonLostContext();
8572
8573 if (context)
8574 {
8575 if (context->getClientVersion() < 3)
8576 {
8577 return gl::error(GL_INVALID_OPERATION, 0);
8578 }
8579 }
8580
8581 UNIMPLEMENTED();
8582 }
8583 catch(std::bad_alloc&)
8584 {
8585 return gl::error(GL_OUT_OF_MEMORY, 0);
8586 }
8587
8588 return 0;
8589}
8590
8591void __stdcall glUniform1ui(GLint location, GLuint v0)
8592{
shannon.woods%transgaming.com@gtempaccount.com8431b9c2013-04-13 03:40:17 +00008593 glUniform1uiv(location, 1, &v0);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008594}
8595
8596void __stdcall glUniform2ui(GLint location, GLuint v0, GLuint v1)
8597{
shannon.woods%transgaming.com@gtempaccount.com8431b9c2013-04-13 03:40:17 +00008598 const GLuint xy[] = { v0, v1 };
8599 glUniform2uiv(location, 1, xy);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008600}
8601
8602void __stdcall glUniform3ui(GLint location, GLuint v0, GLuint v1, GLuint v2)
8603{
shannon.woods%transgaming.com@gtempaccount.com8431b9c2013-04-13 03:40:17 +00008604 const GLuint xyz[] = { v0, v1, v2 };
8605 glUniform3uiv(location, 1, xyz);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008606}
8607
8608void __stdcall glUniform4ui(GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3)
8609{
shannon.woods%transgaming.com@gtempaccount.com8431b9c2013-04-13 03:40:17 +00008610 const GLuint xyzw[] = { v0, v1, v2, v3 };
8611 glUniform4uiv(location, 1, xyzw);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008612}
8613
8614void __stdcall glUniform1uiv(GLint location, GLsizei count, const GLuint* value)
8615{
8616 EVENT("(GLint location = %d, GLsizei count = %d, const GLuint* value = 0x%0.8p)",
8617 location, count, value);
8618
8619 try
8620 {
8621 gl::Context *context = gl::getNonLostContext();
8622
8623 if (context)
8624 {
8625 if (context->getClientVersion() < 3)
8626 {
8627 return gl::error(GL_INVALID_OPERATION);
8628 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008629
shannon.woods%transgaming.com@gtempaccount.com50ea4ab2013-04-13 03:40:36 +00008630 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
8631 if (!programBinary)
8632 {
8633 return gl::error(GL_INVALID_OPERATION);
8634 }
8635
8636 if (!programBinary->setUniform1uiv(location, count, value))
8637 {
8638 return gl::error(GL_INVALID_OPERATION);
8639 }
8640 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008641 }
8642 catch(std::bad_alloc&)
8643 {
8644 return gl::error(GL_OUT_OF_MEMORY);
8645 }
8646}
8647
8648void __stdcall glUniform2uiv(GLint location, GLsizei count, const GLuint* value)
8649{
8650 EVENT("(GLint location = %d, GLsizei count = %d, const GLuint* value = 0x%0.8p)",
8651 location, count, value);
8652
8653 try
8654 {
8655 gl::Context *context = gl::getNonLostContext();
8656
8657 if (context)
8658 {
8659 if (context->getClientVersion() < 3)
8660 {
8661 return gl::error(GL_INVALID_OPERATION);
8662 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008663
shannon.woods%transgaming.com@gtempaccount.com50ea4ab2013-04-13 03:40:36 +00008664 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
8665 if (!programBinary)
8666 {
8667 return gl::error(GL_INVALID_OPERATION);
8668 }
8669
8670 if (!programBinary->setUniform2uiv(location, count, value))
8671 {
8672 return gl::error(GL_INVALID_OPERATION);
8673 }
8674 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008675 }
8676 catch(std::bad_alloc&)
8677 {
8678 return gl::error(GL_OUT_OF_MEMORY);
8679 }
8680}
8681
8682void __stdcall glUniform3uiv(GLint location, GLsizei count, const GLuint* value)
8683{
8684 EVENT("(GLint location = %d, GLsizei count = %d, const GLuint* value)",
8685 location, count, value);
8686
8687 try
8688 {
8689 gl::Context *context = gl::getNonLostContext();
8690
8691 if (context)
8692 {
8693 if (context->getClientVersion() < 3)
8694 {
8695 return gl::error(GL_INVALID_OPERATION);
8696 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008697
shannon.woods%transgaming.com@gtempaccount.com50ea4ab2013-04-13 03:40:36 +00008698 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
8699 if (!programBinary)
8700 {
8701 return gl::error(GL_INVALID_OPERATION);
8702 }
8703
8704 if (!programBinary->setUniform3uiv(location, count, value))
8705 {
8706 return gl::error(GL_INVALID_OPERATION);
8707 }
8708 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008709 }
8710 catch(std::bad_alloc&)
8711 {
8712 return gl::error(GL_OUT_OF_MEMORY);
8713 }
8714}
8715
8716void __stdcall glUniform4uiv(GLint location, GLsizei count, const GLuint* value)
8717{
8718 EVENT("(GLint location = %d, GLsizei count = %d, const GLuint* value = 0x%0.8p)",
8719 location, count, value);
8720
8721 try
8722 {
8723 gl::Context *context = gl::getNonLostContext();
8724
8725 if (context)
8726 {
8727 if (context->getClientVersion() < 3)
8728 {
8729 return gl::error(GL_INVALID_OPERATION);
8730 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008731
shannon.woods%transgaming.com@gtempaccount.com50ea4ab2013-04-13 03:40:36 +00008732 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
8733 if (!programBinary)
8734 {
8735 return gl::error(GL_INVALID_OPERATION);
8736 }
8737
8738 if (!programBinary->setUniform4uiv(location, count, value))
8739 {
8740 return gl::error(GL_INVALID_OPERATION);
8741 }
8742 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008743 }
8744 catch(std::bad_alloc&)
8745 {
8746 return gl::error(GL_OUT_OF_MEMORY);
8747 }
8748}
8749
8750void __stdcall glClearBufferiv(GLenum buffer, GLint drawbuffer, const GLint* value)
8751{
8752 EVENT("(GLenum buffer = 0x%X, GLint drawbuffer = %d, const GLint* value = 0x%0.8p)",
8753 buffer, drawbuffer, value);
8754
8755 try
8756 {
8757 gl::Context *context = gl::getNonLostContext();
8758
8759 if (context)
8760 {
8761 if (context->getClientVersion() < 3)
8762 {
8763 return gl::error(GL_INVALID_OPERATION);
8764 }
8765 }
8766
8767 UNIMPLEMENTED();
8768 }
8769 catch(std::bad_alloc&)
8770 {
8771 return gl::error(GL_OUT_OF_MEMORY);
8772 }
8773}
8774
8775void __stdcall glClearBufferuiv(GLenum buffer, GLint drawbuffer, const GLuint* value)
8776{
8777 EVENT("(GLenum buffer = 0x%X, GLint drawbuffer = %d, const GLuint* value = 0x%0.8p)",
8778 buffer, drawbuffer, value);
8779
8780 try
8781 {
8782 gl::Context *context = gl::getNonLostContext();
8783
8784 if (context)
8785 {
8786 if (context->getClientVersion() < 3)
8787 {
8788 return gl::error(GL_INVALID_OPERATION);
8789 }
8790 }
8791
8792 UNIMPLEMENTED();
8793 }
8794 catch(std::bad_alloc&)
8795 {
8796 return gl::error(GL_OUT_OF_MEMORY);
8797 }
8798}
8799
8800void __stdcall glClearBufferfv(GLenum buffer, GLint drawbuffer, const GLfloat* value)
8801{
8802 EVENT("(GLenum buffer = 0x%X, GLint drawbuffer = %d, const GLfloat* value = 0x%0.8p)",
8803 buffer, drawbuffer, value);
8804
8805 try
8806 {
8807 gl::Context *context = gl::getNonLostContext();
8808
8809 if (context)
8810 {
8811 if (context->getClientVersion() < 3)
8812 {
8813 return gl::error(GL_INVALID_OPERATION);
8814 }
8815 }
8816
8817 UNIMPLEMENTED();
8818 }
8819 catch(std::bad_alloc&)
8820 {
8821 return gl::error(GL_OUT_OF_MEMORY);
8822 }
8823}
8824
8825void __stdcall glClearBufferfi(GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil)
8826{
8827 EVENT("(GLenum buffer = 0x%X, GLint drawbuffer = %d, GLfloat depth, GLint stencil = %d)",
8828 buffer, drawbuffer, depth, stencil);
8829
8830 try
8831 {
8832 gl::Context *context = gl::getNonLostContext();
8833
8834 if (context)
8835 {
8836 if (context->getClientVersion() < 3)
8837 {
8838 return gl::error(GL_INVALID_OPERATION);
8839 }
8840 }
8841
8842 UNIMPLEMENTED();
8843 }
8844 catch(std::bad_alloc&)
8845 {
8846 return gl::error(GL_OUT_OF_MEMORY);
8847 }
8848}
8849
8850const GLubyte* __stdcall glGetStringi(GLenum name, GLuint index)
8851{
8852 EVENT("(GLenum name = 0x%X, GLuint index = %u)", name, index);
8853
8854 try
8855 {
8856 gl::Context *context = gl::getNonLostContext();
8857
8858 if (context)
8859 {
8860 if (context->getClientVersion() < 3)
8861 {
8862 return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLubyte*>(NULL));
8863 }
8864 }
8865
8866 UNIMPLEMENTED();
8867 }
8868 catch(std::bad_alloc&)
8869 {
8870 return gl::error(GL_OUT_OF_MEMORY, reinterpret_cast<GLubyte*>(NULL));
8871 }
8872
8873 return NULL;
8874}
8875
8876void __stdcall glCopyBufferSubData(GLenum readTarget, GLenum writeTarget, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size)
8877{
8878 EVENT("(GLenum readTarget = 0x%X, GLenum writeTarget = 0x%X, GLintptr readOffset = %d, GLintptr writeOffset = %d, GLsizeiptr size = %d)",
8879 readTarget, writeTarget, readOffset, writeOffset, size);
8880
8881 try
8882 {
8883 gl::Context *context = gl::getNonLostContext();
8884
8885 if (context)
8886 {
8887 if (context->getClientVersion() < 3)
8888 {
8889 return gl::error(GL_INVALID_OPERATION);
8890 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008891
shannon.woods%transgaming.com@gtempaccount.com296c3f22013-04-13 03:39:39 +00008892 gl::Buffer *readBuffer = NULL;
8893 switch (readTarget)
8894 {
8895 case GL_ARRAY_BUFFER:
8896 readBuffer = context->getArrayBuffer();
8897 break;
8898 case GL_COPY_READ_BUFFER:
8899 readBuffer = context->getCopyReadBuffer();
8900 break;
8901 case GL_COPY_WRITE_BUFFER:
8902 readBuffer = context->getCopyWriteBuffer();
8903 break;
8904 case GL_ELEMENT_ARRAY_BUFFER:
8905 readBuffer = context->getElementArrayBuffer();
8906 break;
8907 case GL_PIXEL_PACK_BUFFER:
8908 readBuffer = context->getPixelPackBuffer();
8909 break;
8910 case GL_PIXEL_UNPACK_BUFFER:
8911 readBuffer = context->getPixelUnpackBuffer();
8912 break;
8913 case GL_TRANSFORM_FEEDBACK_BUFFER:
8914 readBuffer = context->getGenericTransformFeedbackBuffer();
8915 break;
8916 case GL_UNIFORM_BUFFER:
8917 readBuffer = context->getGenericUniformBuffer();
8918 break;
8919 default:
8920 return gl::error(GL_INVALID_ENUM);
8921 }
8922
8923 gl::Buffer *writeBuffer = NULL;
8924 switch (writeTarget)
8925 {
8926 case GL_ARRAY_BUFFER:
8927 writeBuffer = context->getArrayBuffer();
8928 break;
8929 case GL_COPY_READ_BUFFER:
8930 writeBuffer = context->getCopyReadBuffer();
8931 break;
8932 case GL_COPY_WRITE_BUFFER:
8933 writeBuffer = context->getCopyWriteBuffer();
8934 break;
8935 case GL_ELEMENT_ARRAY_BUFFER:
8936 writeBuffer = context->getElementArrayBuffer();
8937 break;
8938 case GL_PIXEL_PACK_BUFFER:
8939 writeBuffer = context->getPixelPackBuffer();
8940 break;
8941 case GL_PIXEL_UNPACK_BUFFER:
8942 writeBuffer = context->getPixelUnpackBuffer();
8943 break;
8944 case GL_TRANSFORM_FEEDBACK_BUFFER:
8945 writeBuffer = context->getGenericTransformFeedbackBuffer();
8946 break;
8947 case GL_UNIFORM_BUFFER:
8948 writeBuffer = context->getGenericUniformBuffer();
8949 break;
8950 default:
8951 return gl::error(GL_INVALID_ENUM);
8952 }
8953
8954 if (!readBuffer || !writeBuffer)
8955 {
8956 return gl::error(GL_INVALID_OPERATION);
8957 }
8958
8959 if (readOffset < 0 || writeOffset < 0 || size < 0 ||
8960 static_cast<unsigned int>(readOffset + size) > readBuffer->size() ||
8961 static_cast<unsigned int>(writeOffset + size) > writeBuffer->size())
8962 {
8963 return gl::error(GL_INVALID_VALUE);
8964 }
8965
8966 if (readBuffer == writeBuffer && abs(readOffset - writeOffset) < size)
8967 {
8968 return gl::error(GL_INVALID_VALUE);
8969 }
8970
8971 // TODO: Verify that readBuffer and writeBuffer are not currently mapped (GL_INVALID_OPERATION)
8972
shannon.woods%transgaming.com@gtempaccount.comc53376a2013-04-13 03:41:23 +00008973 // if size is zero, the copy is a successful no-op
8974 if (size > 0)
8975 {
8976 writeBuffer->copyBufferSubData(readBuffer, readOffset, writeOffset, size);
8977 }
shannon.woods%transgaming.com@gtempaccount.com296c3f22013-04-13 03:39:39 +00008978 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008979 }
8980 catch(std::bad_alloc&)
8981 {
8982 return gl::error(GL_OUT_OF_MEMORY);
8983 }
8984}
8985
8986void __stdcall glGetUniformIndices(GLuint program, GLsizei uniformCount, const GLchar* const* uniformNames, GLuint* uniformIndices)
8987{
8988 EVENT("(GLuint program = %u, GLsizei uniformCount = %d, const GLchar* const* uniformNames = 0x%0.8p, GLuint* uniformIndices = 0x%0.8p)",
8989 program, uniformCount, uniformNames, uniformIndices);
8990
8991 try
8992 {
8993 gl::Context *context = gl::getNonLostContext();
8994
8995 if (context)
8996 {
8997 if (context->getClientVersion() < 3)
8998 {
8999 return gl::error(GL_INVALID_OPERATION);
9000 }
9001 }
9002
9003 UNIMPLEMENTED();
9004 }
9005 catch(std::bad_alloc&)
9006 {
9007 return gl::error(GL_OUT_OF_MEMORY);
9008 }
9009}
9010
9011void __stdcall glGetActiveUniformsiv(GLuint program, GLsizei uniformCount, const GLuint* uniformIndices, GLenum pname, GLint* params)
9012{
9013 EVENT("(GLuint program = %u, GLsizei uniformCount = %d, const GLuint* uniformIndices = 0x%0.8p, GLenum pname = 0x%X, GLint* params = 0x%0.8p)",
9014 program, uniformCount, uniformIndices, pname, params);
9015
9016 try
9017 {
9018 gl::Context *context = gl::getNonLostContext();
9019
9020 if (context)
9021 {
9022 if (context->getClientVersion() < 3)
9023 {
9024 return gl::error(GL_INVALID_OPERATION);
9025 }
9026 }
9027
9028 UNIMPLEMENTED();
9029 }
9030 catch(std::bad_alloc&)
9031 {
9032 return gl::error(GL_OUT_OF_MEMORY);
9033 }
9034}
9035
9036GLuint __stdcall glGetUniformBlockIndex(GLuint program, const GLchar* uniformBlockName)
9037{
9038 EVENT("(GLuint program = %u, const GLchar* uniformBlockName = 0x%0.8p)", program, uniformBlockName);
9039
9040 try
9041 {
9042 gl::Context *context = gl::getNonLostContext();
9043
9044 if (context)
9045 {
9046 if (context->getClientVersion() < 3)
9047 {
9048 return gl::error(GL_INVALID_OPERATION, 0);
9049 }
9050 }
9051
9052 UNIMPLEMENTED();
9053 }
9054 catch(std::bad_alloc&)
9055 {
9056 return gl::error(GL_OUT_OF_MEMORY, 0);
9057 }
9058
9059 return 0;
9060}
9061
9062void __stdcall glGetActiveUniformBlockiv(GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint* params)
9063{
9064 EVENT("(GLuint program = %u, GLuint uniformBlockIndex = %u, GLenum pname = 0x%X, GLint* params = 0x%0.8p)",
9065 program, uniformBlockIndex, pname, params);
9066
9067 try
9068 {
9069 gl::Context *context = gl::getNonLostContext();
9070
9071 if (context)
9072 {
9073 if (context->getClientVersion() < 3)
9074 {
9075 return gl::error(GL_INVALID_OPERATION);
9076 }
9077 }
9078
9079 UNIMPLEMENTED();
9080 }
9081 catch(std::bad_alloc&)
9082 {
9083 return gl::error(GL_OUT_OF_MEMORY);
9084 }
9085}
9086
9087void __stdcall glGetActiveUniformBlockName(GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei* length, GLchar* uniformBlockName)
9088{
9089 EVENT("(GLuint program = %u, GLuint uniformBlockIndex = %u, GLsizei bufSize = %d, GLsizei* length = 0x%0.8p, GLchar* uniformBlockName = 0x%0.8p)",
9090 program, uniformBlockIndex, bufSize, length, uniformBlockName);
9091
9092 try
9093 {
9094 gl::Context *context = gl::getNonLostContext();
9095
9096 if (context)
9097 {
9098 if (context->getClientVersion() < 3)
9099 {
9100 return gl::error(GL_INVALID_OPERATION);
9101 }
9102 }
9103
9104 UNIMPLEMENTED();
9105 }
9106 catch(std::bad_alloc&)
9107 {
9108 return gl::error(GL_OUT_OF_MEMORY);
9109 }
9110}
9111
9112void __stdcall glUniformBlockBinding(GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding)
9113{
9114 EVENT("(GLuint program = %u, GLuint uniformBlockIndex = %u, GLuint uniformBlockBinding = %u)",
9115 program, uniformBlockIndex, uniformBlockBinding);
9116
9117 try
9118 {
9119 gl::Context *context = gl::getNonLostContext();
9120
9121 if (context)
9122 {
9123 if (context->getClientVersion() < 3)
9124 {
9125 return gl::error(GL_INVALID_OPERATION);
9126 }
9127 }
9128
9129 UNIMPLEMENTED();
9130 }
9131 catch(std::bad_alloc&)
9132 {
9133 return gl::error(GL_OUT_OF_MEMORY);
9134 }
9135}
9136
9137void __stdcall glDrawArraysInstanced(GLenum mode, GLint first, GLsizei count, GLsizei instanceCount)
9138{
9139 EVENT("(GLenum mode = 0x%X, GLint first = %d, GLsizei count = %d, GLsizei instanceCount = %d)",
9140 mode, first, count, instanceCount);
9141
9142 try
9143 {
9144 gl::Context *context = gl::getNonLostContext();
9145
9146 if (context)
9147 {
9148 if (context->getClientVersion() < 3)
9149 {
9150 return gl::error(GL_INVALID_OPERATION);
9151 }
9152 }
9153
9154 UNIMPLEMENTED();
9155 }
9156 catch(std::bad_alloc&)
9157 {
9158 return gl::error(GL_OUT_OF_MEMORY);
9159 }
9160}
9161
9162void __stdcall glDrawElementsInstanced(GLenum mode, GLsizei count, GLenum type, const GLvoid* indices, GLsizei instanceCount)
9163{
9164 EVENT("(GLenum mode = 0x%X, GLsizei count = %d, GLenum type = 0x%X, const GLvoid* indices = 0x%0.8p, GLsizei instanceCount = %d)",
9165 mode, count, type, indices, instanceCount);
9166
9167 try
9168 {
9169 gl::Context *context = gl::getNonLostContext();
9170
9171 if (context)
9172 {
9173 if (context->getClientVersion() < 3)
9174 {
9175 return gl::error(GL_INVALID_OPERATION);
9176 }
9177 }
9178
9179 UNIMPLEMENTED();
9180 }
9181 catch(std::bad_alloc&)
9182 {
9183 return gl::error(GL_OUT_OF_MEMORY);
9184 }
9185}
9186
9187GLsync __stdcall glFenceSync(GLenum condition, GLbitfield flags)
9188{
9189 EVENT("(GLenum condition = 0x%X, GLbitfield flags = 0x%X)", condition, flags);
9190
9191 try
9192 {
9193 gl::Context *context = gl::getNonLostContext();
9194
9195 if (context)
9196 {
9197 if (context->getClientVersion() < 3)
9198 {
9199 return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLsync>(NULL));
9200 }
9201 }
9202
9203 UNIMPLEMENTED();
9204 }
9205 catch(std::bad_alloc&)
9206 {
9207 return gl::error(GL_OUT_OF_MEMORY, reinterpret_cast<GLsync>(NULL));
9208 }
9209
9210 return NULL;
9211}
9212
9213GLboolean __stdcall glIsSync(GLsync sync)
9214{
9215 EVENT("(GLsync sync = 0x%0.8p)", sync);
9216
9217 try
9218 {
9219 gl::Context *context = gl::getNonLostContext();
9220
9221 if (context)
9222 {
9223 if (context->getClientVersion() < 3)
9224 {
9225 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
9226 }
9227 }
9228
9229 UNIMPLEMENTED();
9230 }
9231 catch(std::bad_alloc&)
9232 {
9233 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
9234 }
9235
9236 return GL_FALSE;
9237}
9238
9239void __stdcall glDeleteSync(GLsync sync)
9240{
9241 EVENT("(GLsync sync = 0x%0.8p)", sync);
9242
9243 try
9244 {
9245 gl::Context *context = gl::getNonLostContext();
9246
9247 if (context)
9248 {
9249 if (context->getClientVersion() < 3)
9250 {
9251 return gl::error(GL_INVALID_OPERATION);
9252 }
9253 }
9254
9255 UNIMPLEMENTED();
9256 }
9257 catch(std::bad_alloc&)
9258 {
9259 return gl::error(GL_OUT_OF_MEMORY);
9260 }
9261}
9262
9263GLenum __stdcall glClientWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout)
9264{
9265 EVENT("(GLsync sync = 0x%0.8p, GLbitfield flags = 0x%X, GLuint64 timeout = %llu)",
9266 sync, flags, timeout);
9267
9268 try
9269 {
9270 gl::Context *context = gl::getNonLostContext();
9271
9272 if (context)
9273 {
9274 if (context->getClientVersion() < 3)
9275 {
9276 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
9277 }
9278 }
9279
9280 UNIMPLEMENTED();
9281 }
9282 catch(std::bad_alloc&)
9283 {
9284 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
9285 }
9286
9287 return GL_FALSE;
9288}
9289
9290void __stdcall glWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout)
9291{
9292 EVENT("(GLsync sync = 0x%0.8p, GLbitfield flags = 0x%X, GLuint64 timeout = %llu)",
9293 sync, flags, timeout);
9294
9295 try
9296 {
9297 gl::Context *context = gl::getNonLostContext();
9298
9299 if (context)
9300 {
9301 if (context->getClientVersion() < 3)
9302 {
9303 return gl::error(GL_INVALID_OPERATION);
9304 }
9305 }
9306
9307 UNIMPLEMENTED();
9308 }
9309 catch(std::bad_alloc&)
9310 {
9311 return gl::error(GL_OUT_OF_MEMORY);
9312 }
9313}
9314
9315void __stdcall glGetInteger64v(GLenum pname, GLint64* params)
9316{
9317 EVENT("(GLenum pname = 0x%X, GLint64* params = 0x%0.8p)",
9318 pname, params);
9319
9320 try
9321 {
9322 gl::Context *context = gl::getNonLostContext();
9323
9324 if (context)
9325 {
9326 if (context->getClientVersion() < 3)
9327 {
9328 return gl::error(GL_INVALID_OPERATION);
9329 }
9330 }
9331
9332 UNIMPLEMENTED();
9333 }
9334 catch(std::bad_alloc&)
9335 {
9336 return gl::error(GL_OUT_OF_MEMORY);
9337 }
9338}
9339
9340void __stdcall glGetSynciv(GLsync sync, GLenum pname, GLsizei bufSize, GLsizei* length, GLint* values)
9341{
9342 EVENT("(GLsync sync = 0x%0.8p, GLenum pname = 0x%X, GLsizei bufSize = %d, GLsizei* length = 0x%0.8p, GLint* values = 0x%0.8p)",
9343 sync, pname, bufSize, length, values);
9344
9345 try
9346 {
9347 gl::Context *context = gl::getNonLostContext();
9348
9349 if (context)
9350 {
9351 if (context->getClientVersion() < 3)
9352 {
9353 return gl::error(GL_INVALID_OPERATION);
9354 }
9355 }
9356
9357 UNIMPLEMENTED();
9358 }
9359 catch(std::bad_alloc&)
9360 {
9361 return gl::error(GL_OUT_OF_MEMORY);
9362 }
9363}
9364
9365void __stdcall glGetInteger64i_v(GLenum target, GLuint index, GLint64* data)
9366{
9367 EVENT("(GLenum target = 0x%X, GLuint index = %u, GLint64* data = 0x%0.8p)",
9368 target, index, data);
9369
9370 try
9371 {
9372 gl::Context *context = gl::getNonLostContext();
9373
9374 if (context)
9375 {
9376 if (context->getClientVersion() < 3)
9377 {
9378 return gl::error(GL_INVALID_OPERATION);
9379 }
9380 }
9381
9382 UNIMPLEMENTED();
9383 }
9384 catch(std::bad_alloc&)
9385 {
9386 return gl::error(GL_OUT_OF_MEMORY);
9387 }
9388}
9389
9390void __stdcall glGetBufferParameteri64v(GLenum target, GLenum pname, GLint64* params)
9391{
9392 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLint64* params = 0x%0.8p)",
9393 target, pname, params);
9394
9395 try
9396 {
9397 gl::Context *context = gl::getNonLostContext();
9398
9399 if (context)
9400 {
9401 if (context->getClientVersion() < 3)
9402 {
9403 return gl::error(GL_INVALID_OPERATION);
9404 }
9405 }
9406
9407 UNIMPLEMENTED();
9408 }
9409 catch(std::bad_alloc&)
9410 {
9411 return gl::error(GL_OUT_OF_MEMORY);
9412 }
9413}
9414
9415void __stdcall glGenSamplers(GLsizei count, GLuint* samplers)
9416{
9417 EVENT("(GLsizei count = %d, GLuint* samplers = 0x%0.8p)", count, samplers);
9418
9419 try
9420 {
9421 gl::Context *context = gl::getNonLostContext();
9422
9423 if (context)
9424 {
9425 if (context->getClientVersion() < 3)
9426 {
9427 return gl::error(GL_INVALID_OPERATION);
9428 }
9429 }
9430
9431 UNIMPLEMENTED();
9432 }
9433 catch(std::bad_alloc&)
9434 {
9435 return gl::error(GL_OUT_OF_MEMORY);
9436 }
9437}
9438
9439void __stdcall glDeleteSamplers(GLsizei count, const GLuint* samplers)
9440{
9441 EVENT("(GLsizei count = %d, const GLuint* samplers = 0x%0.8p)", count, samplers);
9442
9443 try
9444 {
9445 gl::Context *context = gl::getNonLostContext();
9446
9447 if (context)
9448 {
9449 if (context->getClientVersion() < 3)
9450 {
9451 return gl::error(GL_INVALID_OPERATION);
9452 }
9453 }
9454
9455 UNIMPLEMENTED();
9456 }
9457 catch(std::bad_alloc&)
9458 {
9459 return gl::error(GL_OUT_OF_MEMORY);
9460 }
9461}
9462
9463GLboolean __stdcall glIsSampler(GLuint sampler)
9464{
9465 EVENT("(GLuint sampler = %u)", sampler);
9466
9467 try
9468 {
9469 gl::Context *context = gl::getNonLostContext();
9470
9471 if (context)
9472 {
9473 if (context->getClientVersion() < 3)
9474 {
9475 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
9476 }
9477 }
9478
9479 UNIMPLEMENTED();
9480 }
9481 catch(std::bad_alloc&)
9482 {
9483 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
9484 }
9485
9486 return GL_FALSE;
9487}
9488
9489void __stdcall glBindSampler(GLuint unit, GLuint sampler)
9490{
9491 EVENT("(GLuint unit = %u, GLuint sampler = %u)", unit, sampler);
9492
9493 try
9494 {
9495 gl::Context *context = gl::getNonLostContext();
9496
9497 if (context)
9498 {
9499 if (context->getClientVersion() < 3)
9500 {
9501 return gl::error(GL_INVALID_OPERATION);
9502 }
9503 }
9504
9505 UNIMPLEMENTED();
9506 }
9507 catch(std::bad_alloc&)
9508 {
9509 return gl::error(GL_OUT_OF_MEMORY);
9510 }
9511}
9512
9513void __stdcall glSamplerParameteri(GLuint sampler, GLenum pname, GLint param)
9514{
9515 EVENT("(GLuint sampler = %u, GLenum pname = 0x%X, GLint param = %d)", sampler, pname, param);
9516
9517 try
9518 {
9519 gl::Context *context = gl::getNonLostContext();
9520
9521 if (context)
9522 {
9523 if (context->getClientVersion() < 3)
9524 {
9525 return gl::error(GL_INVALID_OPERATION);
9526 }
9527 }
9528
9529 UNIMPLEMENTED();
9530 }
9531 catch(std::bad_alloc&)
9532 {
9533 return gl::error(GL_OUT_OF_MEMORY);
9534 }
9535}
9536
9537void __stdcall glSamplerParameteriv(GLuint sampler, GLenum pname, const GLint* param)
9538{
9539 EVENT("(GLuint sampler = %u, GLenum pname = 0x%X, const GLint* param = 0x%0.8p)",
9540 sampler, pname, param);
9541
9542 try
9543 {
9544 gl::Context *context = gl::getNonLostContext();
9545
9546 if (context)
9547 {
9548 if (context->getClientVersion() < 3)
9549 {
9550 return gl::error(GL_INVALID_OPERATION);
9551 }
9552 }
9553
9554 UNIMPLEMENTED();
9555 }
9556 catch(std::bad_alloc&)
9557 {
9558 return gl::error(GL_OUT_OF_MEMORY);
9559 }
9560}
9561
9562void __stdcall glSamplerParameterf(GLuint sampler, GLenum pname, GLfloat param)
9563{
9564 EVENT("(GLuint sampler = %u, GLenum pname = 0x%X, GLfloat param = %g)", sampler, pname, param);
9565
9566 try
9567 {
9568 gl::Context *context = gl::getNonLostContext();
9569
9570 if (context)
9571 {
9572 if (context->getClientVersion() < 3)
9573 {
9574 return gl::error(GL_INVALID_OPERATION);
9575 }
9576 }
9577
9578 UNIMPLEMENTED();
9579 }
9580 catch(std::bad_alloc&)
9581 {
9582 return gl::error(GL_OUT_OF_MEMORY);
9583 }
9584}
9585
9586void __stdcall glSamplerParameterfv(GLuint sampler, GLenum pname, const GLfloat* param)
9587{
9588 EVENT("(GLuint sampler = %u, GLenum pname = 0x%X, const GLfloat* param = 0x%0.8p)", sampler, pname, param);
9589
9590 try
9591 {
9592 gl::Context *context = gl::getNonLostContext();
9593
9594 if (context)
9595 {
9596 if (context->getClientVersion() < 3)
9597 {
9598 return gl::error(GL_INVALID_OPERATION);
9599 }
9600 }
9601
9602 UNIMPLEMENTED();
9603 }
9604 catch(std::bad_alloc&)
9605 {
9606 return gl::error(GL_OUT_OF_MEMORY);
9607 }
9608}
9609
9610void __stdcall glGetSamplerParameteriv(GLuint sampler, GLenum pname, GLint* params)
9611{
9612 EVENT("(GLuint sampler = %u, GLenum pname = 0x%X, GLint* params = 0x%0.8p)", sampler, pname, params);
9613
9614 try
9615 {
9616 gl::Context *context = gl::getNonLostContext();
9617
9618 if (context)
9619 {
9620 if (context->getClientVersion() < 3)
9621 {
9622 return gl::error(GL_INVALID_OPERATION);
9623 }
9624 }
9625
9626 UNIMPLEMENTED();
9627 }
9628 catch(std::bad_alloc&)
9629 {
9630 return gl::error(GL_OUT_OF_MEMORY);
9631 }
9632}
9633
9634void __stdcall glGetSamplerParameterfv(GLuint sampler, GLenum pname, GLfloat* params)
9635{
9636 EVENT("(GLuint sample = %ur, GLenum pname = 0x%X, GLfloat* params = 0x%0.8p)", sampler, pname, params);
9637
9638 try
9639 {
9640 gl::Context *context = gl::getNonLostContext();
9641
9642 if (context)
9643 {
9644 if (context->getClientVersion() < 3)
9645 {
9646 return gl::error(GL_INVALID_OPERATION);
9647 }
9648 }
9649
9650 UNIMPLEMENTED();
9651 }
9652 catch(std::bad_alloc&)
9653 {
9654 return gl::error(GL_OUT_OF_MEMORY);
9655 }
9656}
9657
9658void __stdcall glVertexAttribDivisor(GLuint index, GLuint divisor)
9659{
9660 EVENT("(GLuint index = %u, GLuint divisor = %u)", index, divisor);
9661
9662 try
9663 {
shannon.woods%transgaming.com@gtempaccount.com8736bd62013-04-13 03:35:41 +00009664 if (index >= gl::MAX_VERTEX_ATTRIBS)
9665 {
9666 return gl::error(GL_INVALID_VALUE);
9667 }
9668
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009669 gl::Context *context = gl::getNonLostContext();
9670
9671 if (context)
9672 {
9673 if (context->getClientVersion() < 3)
9674 {
9675 return gl::error(GL_INVALID_OPERATION);
9676 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009677
shannon.woods%transgaming.com@gtempaccount.com8736bd62013-04-13 03:35:41 +00009678 context->setVertexAttribDivisor(index, divisor);
9679 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009680 }
9681 catch(std::bad_alloc&)
9682 {
9683 return gl::error(GL_OUT_OF_MEMORY);
9684 }
9685}
9686
9687void __stdcall glBindTransformFeedback(GLenum target, GLuint id)
9688{
9689 EVENT("(GLenum target = 0x%X, GLuint id = %u)", target, id);
9690
9691 try
9692 {
9693 gl::Context *context = gl::getNonLostContext();
9694
9695 if (context)
9696 {
9697 if (context->getClientVersion() < 3)
9698 {
9699 return gl::error(GL_INVALID_OPERATION);
9700 }
9701 }
9702
9703 UNIMPLEMENTED();
9704 }
9705 catch(std::bad_alloc&)
9706 {
9707 return gl::error(GL_OUT_OF_MEMORY);
9708 }
9709}
9710
9711void __stdcall glDeleteTransformFeedbacks(GLsizei n, const GLuint* ids)
9712{
9713 EVENT("(GLsizei n = %d, const GLuint* ids = 0x%0.8p)", n, ids);
9714
9715 try
9716 {
9717 gl::Context *context = gl::getNonLostContext();
9718
9719 if (context)
9720 {
9721 if (context->getClientVersion() < 3)
9722 {
9723 return gl::error(GL_INVALID_OPERATION);
9724 }
9725 }
9726
9727 UNIMPLEMENTED();
9728 }
9729 catch(std::bad_alloc&)
9730 {
9731 return gl::error(GL_OUT_OF_MEMORY);
9732 }
9733}
9734
9735void __stdcall glGenTransformFeedbacks(GLsizei n, GLuint* ids)
9736{
9737 EVENT("(GLsizei n = %d, GLuint* ids = 0x%0.8p)", n, ids);
9738
9739 try
9740 {
9741 gl::Context *context = gl::getNonLostContext();
9742
9743 if (context)
9744 {
9745 if (context->getClientVersion() < 3)
9746 {
9747 return gl::error(GL_INVALID_OPERATION);
9748 }
9749 }
9750
9751 UNIMPLEMENTED();
9752 }
9753 catch(std::bad_alloc&)
9754 {
9755 return gl::error(GL_OUT_OF_MEMORY);
9756 }
9757}
9758
9759GLboolean __stdcall glIsTransformFeedback(GLuint id)
9760{
9761 EVENT("(GLuint id = %u)", id);
9762
9763 try
9764 {
9765 gl::Context *context = gl::getNonLostContext();
9766
9767 if (context)
9768 {
9769 if (context->getClientVersion() < 3)
9770 {
9771 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
9772 }
9773 }
9774
9775 UNIMPLEMENTED();
9776 }
9777 catch(std::bad_alloc&)
9778 {
9779 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
9780 }
9781
9782 return GL_FALSE;
9783}
9784
9785void __stdcall glPauseTransformFeedback(void)
9786{
9787 EVENT("(void)");
9788
9789 try
9790 {
9791 gl::Context *context = gl::getNonLostContext();
9792
9793 if (context)
9794 {
9795 if (context->getClientVersion() < 3)
9796 {
9797 return gl::error(GL_INVALID_OPERATION);
9798 }
9799 }
9800
9801 UNIMPLEMENTED();
9802 }
9803 catch(std::bad_alloc&)
9804 {
9805 return gl::error(GL_OUT_OF_MEMORY);
9806 }
9807}
9808
9809void __stdcall glResumeTransformFeedback(void)
9810{
9811 EVENT("(void)");
9812
9813 try
9814 {
9815 gl::Context *context = gl::getNonLostContext();
9816
9817 if (context)
9818 {
9819 if (context->getClientVersion() < 3)
9820 {
9821 return gl::error(GL_INVALID_OPERATION);
9822 }
9823 }
9824
9825 UNIMPLEMENTED();
9826 }
9827 catch(std::bad_alloc&)
9828 {
9829 return gl::error(GL_OUT_OF_MEMORY);
9830 }
9831}
9832
9833void __stdcall glGetProgramBinary(GLuint program, GLsizei bufSize, GLsizei* length, GLenum* binaryFormat, GLvoid* binary)
9834{
9835 EVENT("(GLuint program = %u, GLsizei bufSize = %d, GLsizei* length = 0x%0.8p, GLenum* binaryFormat = 0x%0.8p, GLvoid* binary = 0x%0.8p)",
9836 program, bufSize, length, binaryFormat, binary);
9837
9838 try
9839 {
9840 gl::Context *context = gl::getNonLostContext();
9841
9842 if (context)
9843 {
9844 if (context->getClientVersion() < 3)
9845 {
9846 return gl::error(GL_INVALID_OPERATION);
9847 }
9848 }
9849
9850 UNIMPLEMENTED();
9851 }
9852 catch(std::bad_alloc&)
9853 {
9854 return gl::error(GL_OUT_OF_MEMORY);
9855 }
9856}
9857
9858void __stdcall glProgramBinary(GLuint program, GLenum binaryFormat, const GLvoid* binary, GLsizei length)
9859{
9860 EVENT("(GLuint program = %u, GLenum binaryFormat = 0x%X, const GLvoid* binary = 0x%0.8p, GLsizei length = %d)",
9861 program, binaryFormat, binary, length);
9862
9863 try
9864 {
9865 gl::Context *context = gl::getNonLostContext();
9866
9867 if (context)
9868 {
9869 if (context->getClientVersion() < 3)
9870 {
9871 return gl::error(GL_INVALID_OPERATION);
9872 }
9873 }
9874
9875 UNIMPLEMENTED();
9876 }
9877 catch(std::bad_alloc&)
9878 {
9879 return gl::error(GL_OUT_OF_MEMORY);
9880 }
9881}
9882
9883void __stdcall glProgramParameteri(GLuint program, GLenum pname, GLint value)
9884{
9885 EVENT("(GLuint program = %u, GLenum pname = 0x%X, GLint value = %d)",
9886 program, pname, value);
9887
9888 try
9889 {
9890 gl::Context *context = gl::getNonLostContext();
9891
9892 if (context)
9893 {
9894 if (context->getClientVersion() < 3)
9895 {
9896 return gl::error(GL_INVALID_OPERATION);
9897 }
9898 }
9899
9900 UNIMPLEMENTED();
9901 }
9902 catch(std::bad_alloc&)
9903 {
9904 return gl::error(GL_OUT_OF_MEMORY);
9905 }
9906}
9907
9908void __stdcall glInvalidateFramebuffer(GLenum target, GLsizei numAttachments, const GLenum* attachments)
9909{
9910 EVENT("(GLenum target = 0x%X, GLsizei numAttachments = %d, const GLenum* attachments = 0x%0.8p)",
9911 target, numAttachments, attachments);
9912
9913 try
9914 {
9915 gl::Context *context = gl::getNonLostContext();
9916
9917 if (context)
9918 {
9919 if (context->getClientVersion() < 3)
9920 {
9921 return gl::error(GL_INVALID_OPERATION);
9922 }
9923 }
9924
9925 UNIMPLEMENTED();
9926 }
9927 catch(std::bad_alloc&)
9928 {
9929 return gl::error(GL_OUT_OF_MEMORY);
9930 }
9931}
9932
9933void __stdcall glInvalidateSubFramebuffer(GLenum target, GLsizei numAttachments, const GLenum* attachments, GLint x, GLint y, GLsizei width, GLsizei height)
9934{
9935 EVENT("(GLenum target = 0x%X, GLsizei numAttachments = %d, const GLenum* attachments = 0x%0.8p, GLint x = %d, "
9936 "GLint y = %d, GLsizei width = %d, GLsizei height = %d)",
9937 target, numAttachments, attachments, x, y, width, height);
9938
9939 try
9940 {
9941 gl::Context *context = gl::getNonLostContext();
9942
9943 if (context)
9944 {
9945 if (context->getClientVersion() < 3)
9946 {
9947 return gl::error(GL_INVALID_OPERATION);
9948 }
9949 }
9950
9951 UNIMPLEMENTED();
9952 }
9953 catch(std::bad_alloc&)
9954 {
9955 return gl::error(GL_OUT_OF_MEMORY);
9956 }
9957}
9958
9959void __stdcall glTexStorage2D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height)
9960{
9961 EVENT("(GLenum target = 0x%X, GLsizei levels = %d, GLenum internalformat = 0x%X, GLsizei width = %d, GLsizei height = %d)",
9962 target, levels, internalformat, width, height);
9963
9964 try
9965 {
9966 gl::Context *context = gl::getNonLostContext();
9967
9968 if (context)
9969 {
9970 if (context->getClientVersion() < 3)
9971 {
9972 return gl::error(GL_INVALID_OPERATION);
9973 }
9974 }
9975
9976 UNIMPLEMENTED();
9977 }
9978 catch(std::bad_alloc&)
9979 {
9980 return gl::error(GL_OUT_OF_MEMORY);
9981 }
9982}
9983
9984void __stdcall glTexStorage3D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth)
9985{
9986 EVENT("(GLenum target = 0x%X, GLsizei levels = %d, GLenum internalformat = 0x%X, GLsizei width = %d, "
9987 "GLsizei height = %d, GLsizei depth = %d)",
9988 target, levels, internalformat, width, height, depth);
9989
9990 try
9991 {
9992 gl::Context *context = gl::getNonLostContext();
9993
9994 if (context)
9995 {
9996 if (context->getClientVersion() < 3)
9997 {
9998 return gl::error(GL_INVALID_OPERATION);
9999 }
shannon.woods%transgaming.com@gtempaccount.com14eb55e2013-04-13 03:35:06 +000010000 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +000010001 }
10002 catch(std::bad_alloc&)
10003 {
10004 return gl::error(GL_OUT_OF_MEMORY);
10005 }
10006}
10007
10008void __stdcall glGetInternalformativ(GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize, GLint* params)
10009{
10010 EVENT("(GLenum target = 0x%X, GLenum internalformat = 0x%X, GLenum pname = 0x%X, GLsizei bufSize = %d, "
10011 "GLint* params = 0x%0.8p)",
10012 target, internalformat, pname, bufSize, params);
10013
10014 try
10015 {
10016 gl::Context *context = gl::getNonLostContext();
10017
10018 if (context)
10019 {
10020 if (context->getClientVersion() < 3)
10021 {
10022 return gl::error(GL_INVALID_OPERATION);
10023 }
10024 }
10025
10026 UNIMPLEMENTED();
10027 }
10028 catch(std::bad_alloc&)
10029 {
10030 return gl::error(GL_OUT_OF_MEMORY);
10031 }
10032}
10033
10034// Extension functions
10035
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +000010036void __stdcall glBlitFramebufferANGLE(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1,
10037 GLbitfield mask, GLenum filter)
10038{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +000010039 EVENT("(GLint srcX0 = %d, GLint srcY0 = %d, GLint srcX1 = %d, GLint srcY1 = %d, "
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +000010040 "GLint dstX0 = %d, GLint dstY0 = %d, GLint dstX1 = %d, GLint dstY1 = %d, "
10041 "GLbitfield mask = 0x%X, GLenum filter = 0x%X)",
10042 srcX0, srcY0, srcX1, srcX1, dstX0, dstY0, dstX1, dstY1, mask, filter);
10043
10044 try
10045 {
10046 switch (filter)
10047 {
10048 case GL_NEAREST:
10049 break;
10050 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010051 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +000010052 }
10053
10054 if ((mask & ~(GL_COLOR_BUFFER_BIT | GL_STENCIL_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)) != 0)
10055 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010056 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +000010057 }
10058
10059 if (srcX1 - srcX0 != dstX1 - dstX0 || srcY1 - srcY0 != dstY1 - dstY0)
10060 {
10061 ERR("Scaling and flipping in BlitFramebufferANGLE not supported by this implementation");
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010062 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +000010063 }
10064
daniel@transgaming.com9d788502011-11-09 17:46:55 +000010065 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +000010066
10067 if (context)
10068 {
10069 if (context->getReadFramebufferHandle() == context->getDrawFramebufferHandle())
10070 {
10071 ERR("Blits with the same source and destination framebuffer are not supported by this implementation.");
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010072 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +000010073 }
10074
10075 context->blitFramebuffer(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask);
10076 }
10077 }
10078 catch(std::bad_alloc&)
10079 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010080 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +000010081 }
10082}
10083
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +000010084void __stdcall glTexImage3DOES(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth,
10085 GLint border, GLenum format, GLenum type, const GLvoid* pixels)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000010086{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +000010087 EVENT("(GLenum target = 0x%X, GLint level = %d, GLenum internalformat = 0x%X, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +000010088 "GLsizei width = %d, GLsizei height = %d, GLsizei depth = %d, GLint border = %d, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +000010089 "GLenum format = 0x%X, GLenum type = 0x%x, const GLvoid* pixels = 0x%0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000010090 target, level, internalformat, width, height, depth, border, format, type, pixels);
10091
10092 try
10093 {
10094 UNIMPLEMENTED(); // FIXME
10095 }
10096 catch(std::bad_alloc&)
10097 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010098 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000010099 }
10100}
daniel@transgaming.comce3d0f22010-05-04 03:35:14 +000010101
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010102void __stdcall glGetProgramBinaryOES(GLuint program, GLsizei bufSize, GLsizei *length,
10103 GLenum *binaryFormat, void *binary)
10104{
apatrick@chromium.org90080e32012-07-09 22:15:33 +000010105 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 +000010106 program, bufSize, length, binaryFormat, binary);
10107
10108 try
10109 {
10110 gl::Context *context = gl::getNonLostContext();
10111
10112 if (context)
10113 {
10114 gl::Program *programObject = context->getProgram(program);
10115
daniel@transgaming.com716056c2012-07-24 18:38:59 +000010116 if (!programObject || !programObject->isLinked())
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010117 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010118 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010119 }
10120
10121 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
10122
10123 if (!programBinary)
10124 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010125 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010126 }
10127
apatrick@chromium.org90080e32012-07-09 22:15:33 +000010128 if (!programBinary->save(binary, bufSize, length))
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010129 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010130 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010131 }
apatrick@chromium.org90080e32012-07-09 22:15:33 +000010132
10133 *binaryFormat = GL_PROGRAM_BINARY_ANGLE;
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010134 }
10135 }
10136 catch(std::bad_alloc&)
10137 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010138 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010139 }
10140}
10141
10142void __stdcall glProgramBinaryOES(GLuint program, GLenum binaryFormat,
10143 const void *binary, GLint length)
10144{
10145 EVENT("(GLenum program = 0x%X, binaryFormat = 0x%x, binary = 0x%0.8p, length = %d)",
10146 program, binaryFormat, binary, length);
10147
10148 try
10149 {
10150 gl::Context *context = gl::getNonLostContext();
10151
10152 if (context)
10153 {
10154 if (binaryFormat != GL_PROGRAM_BINARY_ANGLE)
10155 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010156 return gl::error(GL_INVALID_ENUM);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010157 }
10158
10159 gl::Program *programObject = context->getProgram(program);
10160
10161 if (!programObject)
10162 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010163 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010164 }
10165
daniel@transgaming.com95d29422012-07-24 18:36:10 +000010166 context->setProgramBinary(program, binary, length);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010167 }
10168 }
10169 catch(std::bad_alloc&)
10170 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010171 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010172 }
10173}
10174
shannon.woods%transgaming.com@gtempaccount.com4059a382013-04-13 03:31:16 +000010175void __stdcall glDrawBuffersEXT(GLsizei n, const GLenum *bufs)
10176{
10177 EVENT("(GLenum n = %d, bufs = 0x%0.8p)", n, bufs);
10178
10179 try
10180 {
10181 gl::Context *context = gl::getNonLostContext();
10182
10183 if (context)
10184 {
10185 if (n < 0 || (unsigned int)n > context->getMaximumRenderTargets())
10186 {
10187 return gl::error(GL_INVALID_VALUE);
10188 }
10189
10190 if (context->getDrawFramebufferHandle() == 0)
10191 {
shannon.woods%transgaming.com@gtempaccount.com2fa73c52013-04-13 03:37:20 +000010192 if (n != 1)
shannon.woods%transgaming.com@gtempaccount.com4059a382013-04-13 03:31:16 +000010193 {
10194 return gl::error(GL_INVALID_OPERATION);
10195 }
10196
shannon.woods%transgaming.com@gtempaccount.com2fa73c52013-04-13 03:37:20 +000010197 if (bufs[0] != GL_NONE && bufs[0] != GL_BACK)
shannon.woods%transgaming.com@gtempaccount.com4059a382013-04-13 03:31:16 +000010198 {
shannon.woods%transgaming.com@gtempaccount.com2fa73c52013-04-13 03:37:20 +000010199 return gl::error(GL_INVALID_OPERATION);
shannon.woods%transgaming.com@gtempaccount.com4059a382013-04-13 03:31:16 +000010200 }
10201 }
10202 else
10203 {
10204 for (int colorAttachment = 0; colorAttachment < n; colorAttachment++)
10205 {
10206 const GLenum attachment = GL_COLOR_ATTACHMENT0_EXT + colorAttachment;
10207 if (bufs[colorAttachment] != GL_NONE && bufs[colorAttachment] != attachment)
10208 {
10209 return gl::error(GL_INVALID_OPERATION);
10210 }
10211 }
10212 }
10213
10214 gl::Framebuffer *framebuffer = context->getDrawFramebuffer();
10215
10216 for (int colorAttachment = 0; colorAttachment < n; colorAttachment++)
10217 {
10218 framebuffer->setDrawBufferState(colorAttachment, bufs[colorAttachment]);
10219 }
shannon.woods%transgaming.com@gtempaccount.com2fa73c52013-04-13 03:37:20 +000010220
10221 for (int colorAttachment = n; colorAttachment < (int)context->getMaximumRenderTargets(); colorAttachment++)
10222 {
10223 framebuffer->setDrawBufferState(colorAttachment, GL_NONE);
10224 }
shannon.woods%transgaming.com@gtempaccount.com4059a382013-04-13 03:31:16 +000010225 }
10226 }
10227 catch (std::bad_alloc&)
10228 {
10229 return gl::error(GL_OUT_OF_MEMORY);
10230 }
10231}
10232
daniel@transgaming.comce3d0f22010-05-04 03:35:14 +000010233__eglMustCastToProperFunctionPointerType __stdcall glGetProcAddress(const char *procname)
10234{
10235 struct Extension
10236 {
10237 const char *name;
10238 __eglMustCastToProperFunctionPointerType address;
10239 };
10240
10241 static const Extension glExtensions[] =
10242 {
10243 {"glTexImage3DOES", (__eglMustCastToProperFunctionPointerType)glTexImage3DOES},
daniel@transgaming.com01868132010-08-24 19:21:17 +000010244 {"glBlitFramebufferANGLE", (__eglMustCastToProperFunctionPointerType)glBlitFramebufferANGLE},
daniel@transgaming.com1fe96c92011-01-14 15:08:44 +000010245 {"glRenderbufferStorageMultisampleANGLE", (__eglMustCastToProperFunctionPointerType)glRenderbufferStorageMultisampleANGLE},
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +000010246 {"glDeleteFencesNV", (__eglMustCastToProperFunctionPointerType)glDeleteFencesNV},
10247 {"glGenFencesNV", (__eglMustCastToProperFunctionPointerType)glGenFencesNV},
10248 {"glIsFenceNV", (__eglMustCastToProperFunctionPointerType)glIsFenceNV},
10249 {"glTestFenceNV", (__eglMustCastToProperFunctionPointerType)glTestFenceNV},
10250 {"glGetFenceivNV", (__eglMustCastToProperFunctionPointerType)glGetFenceivNV},
10251 {"glFinishFenceNV", (__eglMustCastToProperFunctionPointerType)glFinishFenceNV},
10252 {"glSetFenceNV", (__eglMustCastToProperFunctionPointerType)glSetFenceNV},
zmo@google.coma574f782011-10-03 21:45:23 +000010253 {"glGetTranslatedShaderSourceANGLE", (__eglMustCastToProperFunctionPointerType)glGetTranslatedShaderSourceANGLE},
daniel@transgaming.com0bd1f2f2011-11-11 04:19:03 +000010254 {"glTexStorage2DEXT", (__eglMustCastToProperFunctionPointerType)glTexStorage2DEXT},
daniel@transgaming.com709ed112011-11-12 03:18:10 +000010255 {"glGetGraphicsResetStatusEXT", (__eglMustCastToProperFunctionPointerType)glGetGraphicsResetStatusEXT},
10256 {"glReadnPixelsEXT", (__eglMustCastToProperFunctionPointerType)glReadnPixelsEXT},
10257 {"glGetnUniformfvEXT", (__eglMustCastToProperFunctionPointerType)glGetnUniformfvEXT},
10258 {"glGetnUniformivEXT", (__eglMustCastToProperFunctionPointerType)glGetnUniformivEXT},
daniel@transgaming.com86bdb822012-01-20 18:24:39 +000010259 {"glGenQueriesEXT", (__eglMustCastToProperFunctionPointerType)glGenQueriesEXT},
10260 {"glDeleteQueriesEXT", (__eglMustCastToProperFunctionPointerType)glDeleteQueriesEXT},
10261 {"glIsQueryEXT", (__eglMustCastToProperFunctionPointerType)glIsQueryEXT},
10262 {"glBeginQueryEXT", (__eglMustCastToProperFunctionPointerType)glBeginQueryEXT},
10263 {"glEndQueryEXT", (__eglMustCastToProperFunctionPointerType)glEndQueryEXT},
10264 {"glGetQueryivEXT", (__eglMustCastToProperFunctionPointerType)glGetQueryivEXT},
10265 {"glGetQueryObjectuivEXT", (__eglMustCastToProperFunctionPointerType)glGetQueryObjectuivEXT},
shannon.woods%transgaming.com@gtempaccount.com77d94722013-04-13 03:34:22 +000010266 {"glDrawBuffersEXT", (__eglMustCastToProperFunctionPointerType)glDrawBuffersEXT},
daniel@transgaming.comdce02fd2012-01-27 15:39:51 +000010267 {"glVertexAttribDivisorANGLE", (__eglMustCastToProperFunctionPointerType)glVertexAttribDivisorANGLE},
10268 {"glDrawArraysInstancedANGLE", (__eglMustCastToProperFunctionPointerType)glDrawArraysInstancedANGLE},
10269 {"glDrawElementsInstancedANGLE", (__eglMustCastToProperFunctionPointerType)glDrawElementsInstancedANGLE},
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010270 {"glGetProgramBinaryOES", (__eglMustCastToProperFunctionPointerType)glGetProgramBinaryOES},
10271 {"glProgramBinaryOES", (__eglMustCastToProperFunctionPointerType)glProgramBinaryOES}, };
daniel@transgaming.comce3d0f22010-05-04 03:35:14 +000010272
shannon.woods@transgaming.comd438fd42013-02-28 23:17:45 +000010273 for (unsigned int ext = 0; ext < ArraySize(glExtensions); ext++)
daniel@transgaming.comce3d0f22010-05-04 03:35:14 +000010274 {
10275 if (strcmp(procname, glExtensions[ext].name) == 0)
10276 {
10277 return (__eglMustCastToProperFunctionPointerType)glExtensions[ext].address;
10278 }
10279 }
10280
10281 return NULL;
10282}
10283
daniel@transgaming.com17f548c2011-11-09 17:47:02 +000010284// Non-public functions used by EGL
10285
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +000010286bool __stdcall glBindTexImage(egl::Surface *surface)
jbauman@chromium.orgae345802011-03-30 22:04:25 +000010287{
10288 EVENT("(egl::Surface* surface = 0x%0.8p)",
10289 surface);
10290
10291 try
10292 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +000010293 gl::Context *context = gl::getNonLostContext();
jbauman@chromium.orgae345802011-03-30 22:04:25 +000010294
10295 if (context)
10296 {
10297 gl::Texture2D *textureObject = context->getTexture2D();
10298
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +000010299 if (textureObject->isImmutable())
10300 {
10301 return false;
10302 }
10303
jbauman@chromium.orgae345802011-03-30 22:04:25 +000010304 if (textureObject)
10305 {
10306 textureObject->bindTexImage(surface);
10307 }
10308 }
10309 }
10310 catch(std::bad_alloc&)
10311 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010312 return gl::error(GL_OUT_OF_MEMORY, false);
jbauman@chromium.orgae345802011-03-30 22:04:25 +000010313 }
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +000010314
10315 return true;
jbauman@chromium.orgae345802011-03-30 22:04:25 +000010316}
10317
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000010318}