blob: 156562e3943fe56d21699ce51bd9b0808a1fccaa [file] [log] [blame]
shannon.woods@transgaming.combdf2d802013-02-28 23:16:20 +00001#include "precompiled.h"
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002//
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00003// Copyright (c) 2002-2012 The ANGLE Project Authors. All rights reserved.
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004// Use of this source code is governed by a BSD-style license that can be
5// found in the LICENSE file.
6//
7
8// libGLESv2.cpp: Implements the exported OpenGL ES 2.0 functions.
9
daniel@transgaming.coma0ce7e62011-01-25 14:47:16 +000010#include "common/version.h"
daniel@transgaming.combbf56f72010-04-20 18:52:13 +000011
12#include "libGLESv2/main.h"
daniel@transgaming.combbf56f72010-04-20 18:52:13 +000013#include "libGLESv2/utilities.h"
14#include "libGLESv2/Buffer.h"
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +000015#include "libGLESv2/Fence.h"
daniel@transgaming.combbf56f72010-04-20 18:52:13 +000016#include "libGLESv2/Framebuffer.h"
shannon.woods@transgaming.com486d9e92013-02-28 23:15:41 +000017#include "libGLESv2/Renderbuffer.h"
daniel@transgaming.combbf56f72010-04-20 18:52:13 +000018#include "libGLESv2/Program.h"
apatrick@chromium.orgea09f9b2012-06-08 00:45:32 +000019#include "libGLESv2/ProgramBinary.h"
daniel@transgaming.combbf56f72010-04-20 18:52:13 +000020#include "libGLESv2/Texture.h"
daniel@transgaming.com86bdb822012-01-20 18:24:39 +000021#include "libGLESv2/Query.h"
shannon.woods@transgaming.com486d9e92013-02-28 23:15:41 +000022#include "libGLESv2/Context.h"
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000023
daniel@transgaming.com4f9ef0d2011-05-30 23:51:19 +000024bool validImageSize(GLint level, GLsizei width, GLsizei height)
25{
26 if (level < 0 || width < 0 || height < 0)
27 {
28 return false;
29 }
30
31 if (gl::getContext() && gl::getContext()->supportsNonPower2Texture())
32 {
33 return true;
34 }
35
36 if (level == 0)
37 {
38 return true;
39 }
40
41 if (gl::isPow2(width) && gl::isPow2(height))
42 {
43 return true;
44 }
45
46 return false;
47}
48
daniel@transgaming.com8833dd22012-06-05 19:49:58 +000049// Verify that format/type are one of the combinations from table 3.4.
50bool checkTextureFormatType(GLenum format, GLenum type)
51{
52 // validate <format> by itself (used as secondary key below)
53 switch (format)
54 {
55 case GL_RGBA:
56 case GL_BGRA_EXT:
57 case GL_RGB:
58 case GL_ALPHA:
59 case GL_LUMINANCE:
60 case GL_LUMINANCE_ALPHA:
61 case GL_DEPTH_COMPONENT:
62 case GL_DEPTH_STENCIL_OES:
63 break;
64 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000065 return gl::error(GL_INVALID_ENUM, false);
daniel@transgaming.com8833dd22012-06-05 19:49:58 +000066 }
67
68 // invalid <type> -> sets INVALID_ENUM
69 // invalid <format>+<type> combination -> sets INVALID_OPERATION
70 switch (type)
71 {
72 case GL_UNSIGNED_BYTE:
73 switch (format)
74 {
75 case GL_RGBA:
76 case GL_BGRA_EXT:
77 case GL_RGB:
78 case GL_ALPHA:
79 case GL_LUMINANCE:
80 case GL_LUMINANCE_ALPHA:
81 return true;
82 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000083 return gl::error(GL_INVALID_OPERATION, false);
daniel@transgaming.com8833dd22012-06-05 19:49:58 +000084 }
85
86 case GL_FLOAT:
87 case GL_HALF_FLOAT_OES:
88 switch (format)
89 {
90 case GL_RGBA:
91 case GL_RGB:
92 case GL_ALPHA:
93 case GL_LUMINANCE:
94 case GL_LUMINANCE_ALPHA:
95 return true;
96 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000097 return gl::error(GL_INVALID_OPERATION, false);
daniel@transgaming.com8833dd22012-06-05 19:49:58 +000098 }
99
100 case GL_UNSIGNED_SHORT_4_4_4_4:
101 case GL_UNSIGNED_SHORT_5_5_5_1:
102 switch (format)
103 {
104 case GL_RGBA:
105 return true;
106 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000107 return gl::error(GL_INVALID_OPERATION, false);
daniel@transgaming.com8833dd22012-06-05 19:49:58 +0000108 }
109
110 case GL_UNSIGNED_SHORT_5_6_5:
111 switch (format)
112 {
113 case GL_RGB:
114 return true;
115 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000116 return gl::error(GL_INVALID_OPERATION, false);
daniel@transgaming.com8833dd22012-06-05 19:49:58 +0000117 }
118
119 case GL_UNSIGNED_SHORT:
120 case GL_UNSIGNED_INT:
121 switch (format)
122 {
123 case GL_DEPTH_COMPONENT:
124 return true;
125 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000126 return gl::error(GL_INVALID_OPERATION, false);
daniel@transgaming.com8833dd22012-06-05 19:49:58 +0000127 }
128
129 case GL_UNSIGNED_INT_24_8_OES:
130 switch (format)
131 {
132 case GL_DEPTH_STENCIL_OES:
133 return true;
134 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000135 return gl::error(GL_INVALID_OPERATION, false);
daniel@transgaming.com8833dd22012-06-05 19:49:58 +0000136 }
137
138 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000139 return gl::error(GL_INVALID_ENUM, false);
daniel@transgaming.com8833dd22012-06-05 19:49:58 +0000140 }
141}
daniel@transgaming.com6452adf2012-10-17 18:22:35 +0000142
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +0000143bool validateSubImageParams2D(bool compressed, GLsizei width, GLsizei height,
daniel@transgaming.com6452adf2012-10-17 18:22:35 +0000144 GLint xoffset, GLint yoffset, GLint level, GLenum format, GLenum type,
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +0000145 gl::Texture2D *texture)
daniel@transgaming.com343373a2011-11-29 19:42:32 +0000146{
147 if (!texture)
148 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000149 return gl::error(GL_INVALID_OPERATION, false);
daniel@transgaming.com343373a2011-11-29 19:42:32 +0000150 }
151
daniel@transgaming.com92f49922012-05-09 15:49:19 +0000152 if (compressed != texture->isCompressed(level))
daniel@transgaming.com343373a2011-11-29 19:42:32 +0000153 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000154 return gl::error(GL_INVALID_OPERATION, false);
daniel@transgaming.com343373a2011-11-29 19:42:32 +0000155 }
156
daniel@transgaming.com6452adf2012-10-17 18:22:35 +0000157 if (format != GL_NONE)
daniel@transgaming.com343373a2011-11-29 19:42:32 +0000158 {
daniel@transgaming.com6452adf2012-10-17 18:22:35 +0000159 GLenum internalformat = gl::ConvertSizedInternalFormat(format, type);
160 if (internalformat != texture->getInternalFormat(level))
161 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000162 return gl::error(GL_INVALID_OPERATION, false);
daniel@transgaming.com6452adf2012-10-17 18:22:35 +0000163 }
daniel@transgaming.com343373a2011-11-29 19:42:32 +0000164 }
165
166 if (compressed)
167 {
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +0000168 if ((width % 4 != 0 && width != texture->getWidth(0)) ||
169 (height % 4 != 0 && height != texture->getHeight(0)))
170 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000171 return gl::error(GL_INVALID_OPERATION, false);
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +0000172 }
173 }
174
175 if (xoffset + width > texture->getWidth(level) ||
176 yoffset + height > texture->getHeight(level))
177 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000178 return gl::error(GL_INVALID_VALUE, false);
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +0000179 }
180
181 return true;
182}
183
184bool validateSubImageParamsCube(bool compressed, GLsizei width, GLsizei height,
daniel@transgaming.com6452adf2012-10-17 18:22:35 +0000185 GLint xoffset, GLint yoffset, GLenum target, GLint level, GLenum format, GLenum type,
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +0000186 gl::TextureCubeMap *texture)
187{
188 if (!texture)
189 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000190 return gl::error(GL_INVALID_OPERATION, false);
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +0000191 }
192
daniel@transgaming.com4df88e82012-05-09 15:49:24 +0000193 if (compressed != texture->isCompressed(target, level))
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +0000194 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000195 return gl::error(GL_INVALID_OPERATION, false);
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +0000196 }
197
daniel@transgaming.com6452adf2012-10-17 18:22:35 +0000198 if (format != GL_NONE)
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +0000199 {
daniel@transgaming.com6452adf2012-10-17 18:22:35 +0000200 GLenum internalformat = gl::ConvertSizedInternalFormat(format, type);
201 if (internalformat != texture->getInternalFormat(target, level))
202 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000203 return gl::error(GL_INVALID_OPERATION, false);
daniel@transgaming.com6452adf2012-10-17 18:22:35 +0000204 }
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +0000205 }
206
207 if (compressed)
208 {
daniel@transgaming.com4df88e82012-05-09 15:49:24 +0000209 if ((width % 4 != 0 && width != texture->getWidth(target, 0)) ||
210 (height % 4 != 0 && height != texture->getHeight(target, 0)))
daniel@transgaming.com343373a2011-11-29 19:42:32 +0000211 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000212 return gl::error(GL_INVALID_OPERATION, false);
daniel@transgaming.com343373a2011-11-29 19:42:32 +0000213 }
214 }
215
daniel@transgaming.com4df88e82012-05-09 15:49:24 +0000216 if (xoffset + width > texture->getWidth(target, level) ||
217 yoffset + height > texture->getHeight(target, level))
daniel@transgaming.com343373a2011-11-29 19:42:32 +0000218 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000219 return gl::error(GL_INVALID_VALUE, false);
daniel@transgaming.com343373a2011-11-29 19:42:32 +0000220 }
221
222 return true;
223}
224
daniel@transgaming.comb7915a52011-11-12 03:14:20 +0000225// check for combinations of format and type that are valid for ReadPixels
226bool validReadFormatType(GLenum format, GLenum type)
227{
228 switch (format)
229 {
230 case GL_RGBA:
231 switch (type)
232 {
233 case GL_UNSIGNED_BYTE:
234 break;
235 default:
236 return false;
237 }
238 break;
239 case GL_BGRA_EXT:
240 switch (type)
241 {
242 case GL_UNSIGNED_BYTE:
243 case GL_UNSIGNED_SHORT_4_4_4_4_REV_EXT:
244 case GL_UNSIGNED_SHORT_1_5_5_5_REV_EXT:
245 break;
246 default:
247 return false;
248 }
249 break;
daniel@transgaming.comb7915a52011-11-12 03:14:20 +0000250 default:
251 return false;
252 }
253 return true;
254}
255
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000256extern "C"
257{
258
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +0000259// OpenGL ES 2.0 functions
260
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000261void __stdcall glActiveTexture(GLenum texture)
262{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000263 EVENT("(GLenum texture = 0x%X)", texture);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000264
265 try
266 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000267 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000268
269 if (context)
270 {
daniel@transgaming.com3f74c7a2011-05-11 15:36:51 +0000271 if (texture < GL_TEXTURE0 || texture > GL_TEXTURE0 + context->getMaximumCombinedTextureImageUnits() - 1)
272 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000273 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com3f74c7a2011-05-11 15:36:51 +0000274 }
275
daniel@transgaming.com428d1582010-05-04 03:35:25 +0000276 context->setActiveSampler(texture - GL_TEXTURE0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000277 }
278 }
279 catch(std::bad_alloc&)
280 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000281 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000282 }
283}
284
285void __stdcall glAttachShader(GLuint program, GLuint shader)
286{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000287 EVENT("(GLuint program = %d, GLuint shader = %d)", program, shader);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000288
289 try
290 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000291 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000292
293 if (context)
294 {
295 gl::Program *programObject = context->getProgram(program);
296 gl::Shader *shaderObject = context->getShader(shader);
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +0000297
daniel@transgaming.come9d6ed02010-04-13 03:26:23 +0000298 if (!programObject)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000299 {
daniel@transgaming.come9d6ed02010-04-13 03:26:23 +0000300 if (context->getShader(program))
301 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000302 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.come9d6ed02010-04-13 03:26:23 +0000303 }
304 else
305 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000306 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.come9d6ed02010-04-13 03:26:23 +0000307 }
308 }
309
310 if (!shaderObject)
311 {
312 if (context->getProgram(shader))
313 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000314 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.come9d6ed02010-04-13 03:26:23 +0000315 }
316 else
317 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000318 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.come9d6ed02010-04-13 03:26:23 +0000319 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000320 }
321
322 if (!programObject->attachShader(shaderObject))
323 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000324 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000325 }
326 }
327 }
328 catch(std::bad_alloc&)
329 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000330 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000331 }
332}
333
daniel@transgaming.com86bdb822012-01-20 18:24:39 +0000334void __stdcall glBeginQueryEXT(GLenum target, GLuint id)
335{
336 EVENT("(GLenum target = 0x%X, GLuint %d)", target, id);
337
338 try
339 {
340 switch (target)
341 {
342 case GL_ANY_SAMPLES_PASSED_EXT:
343 case GL_ANY_SAMPLES_PASSED_CONSERVATIVE_EXT:
344 break;
345 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000346 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +0000347 }
348
349 if (id == 0)
350 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000351 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +0000352 }
353
354 gl::Context *context = gl::getNonLostContext();
355
356 if (context)
357 {
358 context->beginQuery(target, id);
359 }
360 }
361 catch(std::bad_alloc&)
362 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000363 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +0000364 }
365}
366
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +0000367void __stdcall glBindAttribLocation(GLuint program, GLuint index, const GLchar* name)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000368{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000369 EVENT("(GLuint program = %d, GLuint index = %d, const GLchar* name = 0x%0.8p)", program, index, name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000370
371 try
372 {
373 if (index >= gl::MAX_VERTEX_ATTRIBS)
374 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000375 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000376 }
377
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000378 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000379
380 if (context)
381 {
382 gl::Program *programObject = context->getProgram(program);
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +0000383
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000384 if (!programObject)
385 {
daniel@transgaming.com98079832010-04-13 03:26:29 +0000386 if (context->getShader(program))
387 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000388 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com98079832010-04-13 03:26:29 +0000389 }
390 else
391 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000392 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com98079832010-04-13 03:26:29 +0000393 }
394 }
395
396 if (strncmp(name, "gl_", 3) == 0)
397 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000398 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000399 }
400
401 programObject->bindAttributeLocation(index, name);
402 }
403 }
404 catch(std::bad_alloc&)
405 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000406 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000407 }
408}
409
410void __stdcall glBindBuffer(GLenum target, GLuint buffer)
411{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000412 EVENT("(GLenum target = 0x%X, GLuint buffer = %d)", target, buffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000413
414 try
415 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000416 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000417
418 if (context)
419 {
420 switch (target)
421 {
422 case GL_ARRAY_BUFFER:
423 context->bindArrayBuffer(buffer);
424 return;
425 case GL_ELEMENT_ARRAY_BUFFER:
426 context->bindElementArrayBuffer(buffer);
427 return;
428 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000429 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000430 }
431 }
432 }
433 catch(std::bad_alloc&)
434 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000435 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000436 }
437}
438
439void __stdcall glBindFramebuffer(GLenum target, GLuint framebuffer)
440{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000441 EVENT("(GLenum target = 0x%X, GLuint framebuffer = %d)", target, framebuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000442
443 try
444 {
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +0000445 if (target != GL_FRAMEBUFFER && target != GL_DRAW_FRAMEBUFFER_ANGLE && target != GL_READ_FRAMEBUFFER_ANGLE)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000446 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000447 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000448 }
449
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000450 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000451
452 if (context)
453 {
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +0000454 if (target == GL_READ_FRAMEBUFFER_ANGLE || target == GL_FRAMEBUFFER)
455 {
456 context->bindReadFramebuffer(framebuffer);
457 }
458
459 if (target == GL_DRAW_FRAMEBUFFER_ANGLE || target == GL_FRAMEBUFFER)
460 {
461 context->bindDrawFramebuffer(framebuffer);
462 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000463 }
464 }
465 catch(std::bad_alloc&)
466 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000467 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000468 }
469}
470
471void __stdcall glBindRenderbuffer(GLenum target, GLuint renderbuffer)
472{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000473 EVENT("(GLenum target = 0x%X, GLuint renderbuffer = %d)", target, renderbuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000474
475 try
476 {
477 if (target != GL_RENDERBUFFER)
478 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000479 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000480 }
481
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000482 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000483
484 if (context)
485 {
486 context->bindRenderbuffer(renderbuffer);
487 }
488 }
489 catch(std::bad_alloc&)
490 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000491 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000492 }
493}
494
495void __stdcall glBindTexture(GLenum target, GLuint texture)
496{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000497 EVENT("(GLenum target = 0x%X, GLuint texture = %d)", target, texture);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000498
499 try
500 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000501 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000502
503 if (context)
504 {
505 gl::Texture *textureObject = context->getTexture(texture);
506
507 if (textureObject && textureObject->getTarget() != target && texture != 0)
508 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000509 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000510 }
511
512 switch (target)
513 {
514 case GL_TEXTURE_2D:
515 context->bindTexture2D(texture);
516 return;
517 case GL_TEXTURE_CUBE_MAP:
518 context->bindTextureCubeMap(texture);
519 return;
520 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000521 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000522 }
523 }
524 }
525 catch(std::bad_alloc&)
526 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000527 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000528 }
529}
530
531void __stdcall glBlendColor(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha)
532{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000533 EVENT("(GLclampf red = %f, GLclampf green = %f, GLclampf blue = %f, GLclampf alpha = %f)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +0000534 red, green, blue, alpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000535
536 try
537 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000538 gl::Context* context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000539
540 if (context)
541 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +0000542 context->setBlendColor(gl::clamp01(red), gl::clamp01(green), gl::clamp01(blue), gl::clamp01(alpha));
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000543 }
544 }
545 catch(std::bad_alloc&)
546 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000547 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000548 }
549}
550
551void __stdcall glBlendEquation(GLenum mode)
552{
553 glBlendEquationSeparate(mode, mode);
554}
555
556void __stdcall glBlendEquationSeparate(GLenum modeRGB, GLenum modeAlpha)
557{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000558 EVENT("(GLenum modeRGB = 0x%X, GLenum modeAlpha = 0x%X)", modeRGB, modeAlpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000559
560 try
561 {
562 switch (modeRGB)
563 {
564 case GL_FUNC_ADD:
565 case GL_FUNC_SUBTRACT:
566 case GL_FUNC_REVERSE_SUBTRACT:
567 break;
568 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000569 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000570 }
571
572 switch (modeAlpha)
573 {
574 case GL_FUNC_ADD:
575 case GL_FUNC_SUBTRACT:
576 case GL_FUNC_REVERSE_SUBTRACT:
577 break;
578 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000579 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000580 }
581
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000582 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000583
584 if (context)
585 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +0000586 context->setBlendEquation(modeRGB, modeAlpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000587 }
588 }
589 catch(std::bad_alloc&)
590 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000591 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000592 }
593}
594
595void __stdcall glBlendFunc(GLenum sfactor, GLenum dfactor)
596{
597 glBlendFuncSeparate(sfactor, dfactor, sfactor, dfactor);
598}
599
600void __stdcall glBlendFuncSeparate(GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha)
601{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000602 EVENT("(GLenum srcRGB = 0x%X, GLenum dstRGB = 0x%X, GLenum srcAlpha = 0x%X, GLenum dstAlpha = 0x%X)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +0000603 srcRGB, dstRGB, srcAlpha, dstAlpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000604
605 try
606 {
607 switch (srcRGB)
608 {
609 case GL_ZERO:
610 case GL_ONE:
611 case GL_SRC_COLOR:
612 case GL_ONE_MINUS_SRC_COLOR:
613 case GL_DST_COLOR:
614 case GL_ONE_MINUS_DST_COLOR:
615 case GL_SRC_ALPHA:
616 case GL_ONE_MINUS_SRC_ALPHA:
617 case GL_DST_ALPHA:
618 case GL_ONE_MINUS_DST_ALPHA:
619 case GL_CONSTANT_COLOR:
620 case GL_ONE_MINUS_CONSTANT_COLOR:
621 case GL_CONSTANT_ALPHA:
622 case GL_ONE_MINUS_CONSTANT_ALPHA:
623 case GL_SRC_ALPHA_SATURATE:
624 break;
625 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000626 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000627 }
628
629 switch (dstRGB)
630 {
631 case GL_ZERO:
632 case GL_ONE:
633 case GL_SRC_COLOR:
634 case GL_ONE_MINUS_SRC_COLOR:
635 case GL_DST_COLOR:
636 case GL_ONE_MINUS_DST_COLOR:
637 case GL_SRC_ALPHA:
638 case GL_ONE_MINUS_SRC_ALPHA:
639 case GL_DST_ALPHA:
640 case GL_ONE_MINUS_DST_ALPHA:
641 case GL_CONSTANT_COLOR:
642 case GL_ONE_MINUS_CONSTANT_COLOR:
643 case GL_CONSTANT_ALPHA:
644 case GL_ONE_MINUS_CONSTANT_ALPHA:
645 break;
646 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000647 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000648 }
649
650 switch (srcAlpha)
651 {
652 case GL_ZERO:
653 case GL_ONE:
654 case GL_SRC_COLOR:
655 case GL_ONE_MINUS_SRC_COLOR:
656 case GL_DST_COLOR:
657 case GL_ONE_MINUS_DST_COLOR:
658 case GL_SRC_ALPHA:
659 case GL_ONE_MINUS_SRC_ALPHA:
660 case GL_DST_ALPHA:
661 case GL_ONE_MINUS_DST_ALPHA:
662 case GL_CONSTANT_COLOR:
663 case GL_ONE_MINUS_CONSTANT_COLOR:
664 case GL_CONSTANT_ALPHA:
665 case GL_ONE_MINUS_CONSTANT_ALPHA:
666 case GL_SRC_ALPHA_SATURATE:
667 break;
668 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000669 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000670 }
671
672 switch (dstAlpha)
673 {
674 case GL_ZERO:
675 case GL_ONE:
676 case GL_SRC_COLOR:
677 case GL_ONE_MINUS_SRC_COLOR:
678 case GL_DST_COLOR:
679 case GL_ONE_MINUS_DST_COLOR:
680 case GL_SRC_ALPHA:
681 case GL_ONE_MINUS_SRC_ALPHA:
682 case GL_DST_ALPHA:
683 case GL_ONE_MINUS_DST_ALPHA:
684 case GL_CONSTANT_COLOR:
685 case GL_ONE_MINUS_CONSTANT_COLOR:
686 case GL_CONSTANT_ALPHA:
687 case GL_ONE_MINUS_CONSTANT_ALPHA:
688 break;
689 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000690 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000691 }
692
daniel@transgaming.comfe453652010-03-16 06:23:28 +0000693 bool constantColorUsed = (srcRGB == GL_CONSTANT_COLOR || srcRGB == GL_ONE_MINUS_CONSTANT_COLOR ||
694 dstRGB == GL_CONSTANT_COLOR || dstRGB == GL_ONE_MINUS_CONSTANT_COLOR);
695
696 bool constantAlphaUsed = (srcRGB == GL_CONSTANT_ALPHA || srcRGB == GL_ONE_MINUS_CONSTANT_ALPHA ||
697 dstRGB == GL_CONSTANT_ALPHA || dstRGB == GL_ONE_MINUS_CONSTANT_ALPHA);
698
699 if (constantColorUsed && constantAlphaUsed)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000700 {
daniel@transgaming.comfe453652010-03-16 06:23:28 +0000701 ERR("Simultaneous use of GL_CONSTANT_ALPHA/GL_ONE_MINUS_CONSTANT_ALPHA and GL_CONSTANT_COLOR/GL_ONE_MINUS_CONSTANT_COLOR invalid under WebGL");
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000702 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000703 }
704
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000705 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000706
707 if (context)
708 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +0000709 context->setBlendFactors(srcRGB, dstRGB, srcAlpha, dstAlpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000710 }
711 }
712 catch(std::bad_alloc&)
713 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000714 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000715 }
716}
717
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +0000718void __stdcall glBufferData(GLenum target, GLsizeiptr size, const GLvoid* data, GLenum usage)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000719{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000720 EVENT("(GLenum target = 0x%X, GLsizeiptr size = %d, const GLvoid* data = 0x%0.8p, GLenum usage = %d)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +0000721 target, size, data, usage);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000722
723 try
724 {
725 if (size < 0)
726 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000727 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000728 }
729
shannon.woods%transgaming.com@gtempaccount.comf2db40b2013-04-13 03:37:09 +0000730 gl::Context *context = gl::getNonLostContext();
731
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000732 switch (usage)
733 {
734 case GL_STREAM_DRAW:
735 case GL_STATIC_DRAW:
736 case GL_DYNAMIC_DRAW:
737 break;
shannon.woods%transgaming.com@gtempaccount.comf2db40b2013-04-13 03:37:09 +0000738
739 case GL_STREAM_READ:
740 case GL_STREAM_COPY:
741 case GL_STATIC_READ:
742 case GL_STATIC_COPY:
743 case GL_DYNAMIC_READ:
744 case GL_DYNAMIC_COPY:
745 if (context && context->getClientVersion() < 3)
746 {
747 return gl::error(GL_INVALID_ENUM);
748 }
749 break;
750
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000751 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000752 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000753 }
754
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000755 if (context)
756 {
757 gl::Buffer *buffer;
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +0000758
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000759 switch (target)
760 {
761 case GL_ARRAY_BUFFER:
762 buffer = context->getArrayBuffer();
763 break;
764 case GL_ELEMENT_ARRAY_BUFFER:
765 buffer = context->getElementArrayBuffer();
766 break;
767 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000768 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000769 }
770
771 if (!buffer)
772 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000773 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000774 }
775
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +0000776 buffer->bufferData(data, size, usage);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000777 }
778 }
779 catch(std::bad_alloc&)
780 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000781 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000782 }
783}
784
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +0000785void __stdcall glBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid* data)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000786{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000787 EVENT("(GLenum target = 0x%X, GLintptr offset = %d, GLsizeiptr size = %d, const GLvoid* data = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +0000788 target, offset, size, data);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000789
790 try
791 {
daniel@transgaming.comdefa1c32010-05-18 18:51:45 +0000792 if (size < 0 || offset < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000793 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000794 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000795 }
796
daniel@transgaming.comd4620a32010-03-21 04:31:28 +0000797 if (data == NULL)
798 {
799 return;
800 }
801
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000802 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +0000803
804 if (context)
805 {
806 gl::Buffer *buffer;
807
808 switch (target)
809 {
810 case GL_ARRAY_BUFFER:
811 buffer = context->getArrayBuffer();
812 break;
813 case GL_ELEMENT_ARRAY_BUFFER:
814 buffer = context->getElementArrayBuffer();
815 break;
816 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000817 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +0000818 }
819
820 if (!buffer)
821 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000822 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +0000823 }
824
daniel@transgaming.comdefa1c32010-05-18 18:51:45 +0000825 if ((size_t)size + offset > buffer->size())
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +0000826 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000827 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +0000828 }
daniel@transgaming.comdefa1c32010-05-18 18:51:45 +0000829
830 buffer->bufferSubData(data, size, offset);
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +0000831 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000832 }
833 catch(std::bad_alloc&)
834 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000835 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000836 }
837}
838
839GLenum __stdcall glCheckFramebufferStatus(GLenum target)
840{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000841 EVENT("(GLenum target = 0x%X)", target);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000842
843 try
844 {
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +0000845 if (target != GL_FRAMEBUFFER && target != GL_DRAW_FRAMEBUFFER_ANGLE && target != GL_READ_FRAMEBUFFER_ANGLE)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000846 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000847 return gl::error(GL_INVALID_ENUM, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000848 }
849
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000850 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000851
852 if (context)
853 {
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +0000854 gl::Framebuffer *framebuffer = NULL;
855 if (target == GL_READ_FRAMEBUFFER_ANGLE)
856 {
857 framebuffer = context->getReadFramebuffer();
858 }
859 else
860 {
861 framebuffer = context->getDrawFramebuffer();
862 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000863
864 return framebuffer->completeness();
865 }
866 }
867 catch(std::bad_alloc&)
868 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000869 return gl::error(GL_OUT_OF_MEMORY, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000870 }
871
872 return 0;
873}
874
875void __stdcall glClear(GLbitfield mask)
876{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +0000877 EVENT("(GLbitfield mask = 0x%X)", mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000878
879 try
880 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000881 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000882
883 if (context)
884 {
885 context->clear(mask);
886 }
887 }
888 catch(std::bad_alloc&)
889 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000890 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000891 }
892}
893
894void __stdcall glClearColor(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha)
895{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000896 EVENT("(GLclampf red = %f, GLclampf green = %f, GLclampf blue = %f, GLclampf alpha = %f)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +0000897 red, green, blue, alpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000898
899 try
900 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000901 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000902
903 if (context)
904 {
905 context->setClearColor(red, green, blue, alpha);
906 }
907 }
908 catch(std::bad_alloc&)
909 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000910 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000911 }
912}
913
914void __stdcall glClearDepthf(GLclampf depth)
915{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000916 EVENT("(GLclampf depth = %f)", depth);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000917
918 try
919 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000920 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000921
922 if (context)
923 {
924 context->setClearDepth(depth);
925 }
926 }
927 catch(std::bad_alloc&)
928 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000929 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000930 }
931}
932
933void __stdcall glClearStencil(GLint s)
934{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000935 EVENT("(GLint s = %d)", s);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000936
937 try
938 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000939 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000940
941 if (context)
942 {
943 context->setClearStencil(s);
944 }
945 }
946 catch(std::bad_alloc&)
947 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000948 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000949 }
950}
951
952void __stdcall glColorMask(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha)
953{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +0000954 EVENT("(GLboolean red = %d, GLboolean green = %u, GLboolean blue = %u, GLboolean alpha = %u)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +0000955 red, green, blue, alpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000956
957 try
958 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000959 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000960
961 if (context)
962 {
daniel@transgaming.coma36f98e2010-05-18 18:51:09 +0000963 context->setColorMask(red == GL_TRUE, green == GL_TRUE, blue == GL_TRUE, alpha == GL_TRUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000964 }
965 }
966 catch(std::bad_alloc&)
967 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000968 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000969 }
970}
971
972void __stdcall glCompileShader(GLuint shader)
973{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000974 EVENT("(GLuint shader = %d)", shader);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000975
976 try
977 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000978 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000979
980 if (context)
981 {
982 gl::Shader *shaderObject = context->getShader(shader);
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +0000983
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000984 if (!shaderObject)
985 {
daniel@transgaming.com0cefaf42010-04-13 03:26:36 +0000986 if (context->getProgram(shader))
987 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000988 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com0cefaf42010-04-13 03:26:36 +0000989 }
990 else
991 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000992 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com0cefaf42010-04-13 03:26:36 +0000993 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000994 }
995
996 shaderObject->compile();
997 }
998 }
999 catch(std::bad_alloc&)
1000 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001001 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001002 }
1003}
1004
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00001005void __stdcall glCompressedTexImage2D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height,
1006 GLint border, GLsizei imageSize, const GLvoid* data)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001007{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001008 EVENT("(GLenum target = 0x%X, GLint level = %d, GLenum internalformat = 0x%X, GLsizei width = %d, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00001009 "GLsizei height = %d, GLint border = %d, GLsizei imageSize = %d, const GLvoid* data = 0x%0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001010 target, level, internalformat, width, height, border, imageSize, data);
1011
1012 try
1013 {
daniel@transgaming.com4f9ef0d2011-05-30 23:51:19 +00001014 if (!validImageSize(level, width, height) || border != 0 || imageSize < 0)
daniel@transgaming.com41430492010-03-11 20:36:18 +00001015 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001016 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com41430492010-03-11 20:36:18 +00001017 }
1018
daniel@transgaming.com01868132010-08-24 19:21:17 +00001019 switch (internalformat)
1020 {
1021 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
1022 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
gman@chromium.org50c526d2011-08-10 05:19:44 +00001023 case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
1024 case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
daniel@transgaming.com01868132010-08-24 19:21:17 +00001025 break;
1026 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001027 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com01868132010-08-24 19:21:17 +00001028 }
1029
1030 if (border != 0)
1031 {
shannon.woods@transgaming.com0efef902013-02-28 23:21:09 +00001032 return gl::error(GL_INVALID_OPERATION);
1033 }
1034
1035 if (width != 1 && width != 2 && width % 4 != 0)
1036 {
1037 return gl::error(GL_INVALID_OPERATION);
1038 }
1039
1040 if (height != 1 && height != 2 && height % 4 != 0)
1041 {
1042 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com01868132010-08-24 19:21:17 +00001043 }
1044
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001045 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com01868132010-08-24 19:21:17 +00001046
1047 if (context)
1048 {
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001049 if (level > context->getMaximumTextureLevel())
1050 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001051 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001052 }
1053
1054 switch (target)
1055 {
1056 case GL_TEXTURE_2D:
1057 if (width > (context->getMaximumTextureDimension() >> level) ||
1058 height > (context->getMaximumTextureDimension() >> level))
1059 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001060 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001061 }
1062 break;
1063 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
1064 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
1065 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
1066 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
1067 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
1068 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
1069 if (width != height)
1070 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001071 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001072 }
1073
1074 if (width > (context->getMaximumCubeTextureDimension() >> level) ||
1075 height > (context->getMaximumCubeTextureDimension() >> level))
1076 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001077 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001078 }
1079 break;
1080 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001081 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001082 }
1083
gman@chromium.org50c526d2011-08-10 05:19:44 +00001084 switch (internalformat) {
1085 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
1086 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
1087 if (!context->supportsDXT1Textures())
1088 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001089 return gl::error(GL_INVALID_ENUM); // in this case, it's as though the internal format switch failed
gman@chromium.org50c526d2011-08-10 05:19:44 +00001090 }
1091 break;
1092 case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
1093 if (!context->supportsDXT3Textures())
1094 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001095 return gl::error(GL_INVALID_ENUM); // in this case, it's as though the internal format switch failed
gman@chromium.org50c526d2011-08-10 05:19:44 +00001096 }
1097 break;
1098 case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
1099 if (!context->supportsDXT5Textures())
1100 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001101 return gl::error(GL_INVALID_ENUM); // in this case, it's as though the internal format switch failed
gman@chromium.org50c526d2011-08-10 05:19:44 +00001102 }
1103 break;
1104 default: UNREACHABLE();
daniel@transgaming.com01868132010-08-24 19:21:17 +00001105 }
1106
1107 if (imageSize != gl::ComputeCompressedSize(width, height, internalformat))
1108 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001109 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com01868132010-08-24 19:21:17 +00001110 }
1111
1112 if (target == GL_TEXTURE_2D)
1113 {
1114 gl::Texture2D *texture = context->getTexture2D();
1115
1116 if (!texture)
1117 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001118 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com01868132010-08-24 19:21:17 +00001119 }
1120
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00001121 if (texture->isImmutable())
1122 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001123 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00001124 }
1125
daniel@transgaming.com01868132010-08-24 19:21:17 +00001126 texture->setCompressedImage(level, internalformat, width, height, imageSize, data);
1127 }
1128 else
1129 {
1130 gl::TextureCubeMap *texture = context->getTextureCubeMap();
1131
1132 if (!texture)
1133 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001134 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com01868132010-08-24 19:21:17 +00001135 }
1136
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00001137 if (texture->isImmutable())
1138 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001139 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00001140 }
1141
daniel@transgaming.com01868132010-08-24 19:21:17 +00001142 switch (target)
1143 {
1144 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
1145 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
1146 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
1147 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
1148 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
1149 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
1150 texture->setCompressedImage(target, level, internalformat, width, height, imageSize, data);
1151 break;
1152 default: UNREACHABLE();
1153 }
1154 }
1155 }
1156
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001157 }
1158 catch(std::bad_alloc&)
1159 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001160 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001161 }
1162}
1163
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00001164void __stdcall glCompressedTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height,
1165 GLenum format, GLsizei imageSize, const GLvoid* data)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001166{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001167 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001168 "GLsizei width = %d, GLsizei height = %d, GLenum format = 0x%X, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00001169 "GLsizei imageSize = %d, const GLvoid* data = 0x%0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001170 target, level, xoffset, yoffset, width, height, format, imageSize, data);
1171
1172 try
1173 {
apatrick@chromium.org551022e2012-01-23 19:56:54 +00001174 if (!gl::IsInternalTextureTarget(target))
daniel@transgaming.com41430492010-03-11 20:36:18 +00001175 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001176 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com41430492010-03-11 20:36:18 +00001177 }
1178
daniel@transgaming.com4f9ef0d2011-05-30 23:51:19 +00001179 if (xoffset < 0 || yoffset < 0 || !validImageSize(level, width, height) || imageSize < 0)
daniel@transgaming.com41430492010-03-11 20:36:18 +00001180 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001181 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com41430492010-03-11 20:36:18 +00001182 }
1183
daniel@transgaming.com01868132010-08-24 19:21:17 +00001184 switch (format)
daniel@transgaming.com41430492010-03-11 20:36:18 +00001185 {
daniel@transgaming.com01868132010-08-24 19:21:17 +00001186 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
1187 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
gman@chromium.org50c526d2011-08-10 05:19:44 +00001188 case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
1189 case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
daniel@transgaming.com01868132010-08-24 19:21:17 +00001190 break;
1191 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001192 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com41430492010-03-11 20:36:18 +00001193 }
1194
daniel@transgaming.com01868132010-08-24 19:21:17 +00001195 if (width == 0 || height == 0 || data == NULL)
1196 {
1197 return;
1198 }
1199
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001200 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com01868132010-08-24 19:21:17 +00001201
1202 if (context)
1203 {
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001204 if (level > context->getMaximumTextureLevel())
1205 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001206 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001207 }
1208
gman@chromium.org50c526d2011-08-10 05:19:44 +00001209 switch (format) {
1210 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
1211 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
1212 if (!context->supportsDXT1Textures())
1213 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001214 return gl::error(GL_INVALID_ENUM); // in this case, it's as though the internal format switch failed
gman@chromium.org50c526d2011-08-10 05:19:44 +00001215 }
1216 break;
1217 case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
1218 if (!context->supportsDXT3Textures())
1219 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001220 return gl::error(GL_INVALID_ENUM); // in this case, it's as though the internal format switch failed
gman@chromium.org50c526d2011-08-10 05:19:44 +00001221 }
1222 break;
1223 case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
1224 if (!context->supportsDXT5Textures())
1225 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001226 return gl::error(GL_INVALID_ENUM); // in this case, it's as though the internal format switch failed
gman@chromium.org50c526d2011-08-10 05:19:44 +00001227 }
1228 break;
1229 default: UNREACHABLE();
daniel@transgaming.com01868132010-08-24 19:21:17 +00001230 }
1231
1232 if (imageSize != gl::ComputeCompressedSize(width, height, format))
1233 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001234 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com01868132010-08-24 19:21:17 +00001235 }
1236
1237 if (xoffset % 4 != 0 || yoffset % 4 != 0)
1238 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001239 return gl::error(GL_INVALID_OPERATION); // we wait to check the offsets until this point, because the multiple-of-four restriction
gman@chromium.org50c526d2011-08-10 05:19:44 +00001240 // does not exist unless DXT textures are supported.
daniel@transgaming.com01868132010-08-24 19:21:17 +00001241 }
1242
1243 if (target == GL_TEXTURE_2D)
1244 {
1245 gl::Texture2D *texture = context->getTexture2D();
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00001246 if (validateSubImageParams2D(true, width, height, xoffset, yoffset, level, format, GL_NONE, texture))
daniel@transgaming.com01868132010-08-24 19:21:17 +00001247 {
daniel@transgaming.com343373a2011-11-29 19:42:32 +00001248 texture->subImageCompressed(level, xoffset, yoffset, width, height, format, imageSize, data);
daniel@transgaming.com01868132010-08-24 19:21:17 +00001249 }
daniel@transgaming.com01868132010-08-24 19:21:17 +00001250 }
1251 else if (gl::IsCubemapTextureTarget(target))
1252 {
1253 gl::TextureCubeMap *texture = context->getTextureCubeMap();
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00001254 if (validateSubImageParamsCube(true, width, height, xoffset, yoffset, target, level, format, GL_NONE, texture))
daniel@transgaming.com01868132010-08-24 19:21:17 +00001255 {
daniel@transgaming.com343373a2011-11-29 19:42:32 +00001256 texture->subImageCompressed(target, level, xoffset, yoffset, width, height, format, imageSize, data);
daniel@transgaming.com01868132010-08-24 19:21:17 +00001257 }
daniel@transgaming.com01868132010-08-24 19:21:17 +00001258 }
1259 else
1260 {
1261 UNREACHABLE();
1262 }
1263 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001264 }
1265 catch(std::bad_alloc&)
1266 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001267 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001268 }
1269}
1270
1271void __stdcall glCopyTexImage2D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border)
1272{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001273 EVENT("(GLenum target = 0x%X, GLint level = %d, GLenum internalformat = 0x%X, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001274 "GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d, GLint border = %d)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001275 target, level, internalformat, x, y, width, height, border);
1276
1277 try
1278 {
daniel@transgaming.com4f9ef0d2011-05-30 23:51:19 +00001279 if (!validImageSize(level, width, height))
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001280 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001281 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001282 }
1283
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001284 if (border != 0)
1285 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001286 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001287 }
1288
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001289 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001290
1291 if (context)
1292 {
daniel@transgaming.com32b11442011-11-19 02:42:48 +00001293 if (level > context->getMaximumTextureLevel())
1294 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001295 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com32b11442011-11-19 02:42:48 +00001296 }
1297
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001298 switch (target)
1299 {
1300 case GL_TEXTURE_2D:
1301 if (width > (context->getMaximumTextureDimension() >> level) ||
1302 height > (context->getMaximumTextureDimension() >> level))
1303 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001304 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001305 }
1306 break;
1307 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
1308 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
1309 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
1310 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
1311 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
1312 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
1313 if (width != height)
1314 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001315 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001316 }
1317
1318 if (width > (context->getMaximumCubeTextureDimension() >> level) ||
1319 height > (context->getMaximumCubeTextureDimension() >> level))
1320 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001321 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001322 }
1323 break;
1324 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001325 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001326 }
1327
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00001328 gl::Framebuffer *framebuffer = context->getReadFramebuffer();
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001329
daniel@transgaming.combbc57792010-07-28 19:21:05 +00001330 if (framebuffer->completeness() != GL_FRAMEBUFFER_COMPLETE)
1331 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001332 return gl::error(GL_INVALID_FRAMEBUFFER_OPERATION);
daniel@transgaming.combbc57792010-07-28 19:21:05 +00001333 }
1334
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00001335 if (context->getReadFramebufferHandle() != 0 && framebuffer->getSamples() != 0)
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00001336 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001337 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00001338 }
1339
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00001340 gl::Renderbuffer *source = framebuffer->getReadColorbuffer();
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +00001341 GLenum colorbufferFormat = source->getInternalFormat();
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001342
1343 // [OpenGL ES 2.0.24] table 3.9
1344 switch (internalformat)
1345 {
1346 case GL_ALPHA:
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00001347 if (colorbufferFormat != GL_ALPHA8_EXT &&
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001348 colorbufferFormat != GL_RGBA4 &&
1349 colorbufferFormat != GL_RGB5_A1 &&
shannon.woods@transgaming.com28e7ba02013-02-28 23:09:28 +00001350 colorbufferFormat != GL_BGRA8_EXT &&
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001351 colorbufferFormat != GL_RGBA8_OES)
1352 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001353 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001354 }
1355 break;
1356 case GL_LUMINANCE:
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00001357 case GL_RGB:
1358 if (colorbufferFormat != GL_RGB565 &&
1359 colorbufferFormat != GL_RGB8_OES &&
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001360 colorbufferFormat != GL_RGBA4 &&
1361 colorbufferFormat != GL_RGB5_A1 &&
shannon.woods@transgaming.com28e7ba02013-02-28 23:09:28 +00001362 colorbufferFormat != GL_BGRA8_EXT &&
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001363 colorbufferFormat != GL_RGBA8_OES)
1364 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001365 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001366 }
1367 break;
1368 case GL_LUMINANCE_ALPHA:
1369 case GL_RGBA:
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00001370 if (colorbufferFormat != GL_RGBA4 &&
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001371 colorbufferFormat != GL_RGB5_A1 &&
shannon.woods@transgaming.com28e7ba02013-02-28 23:09:28 +00001372 colorbufferFormat != GL_BGRA8_EXT &&
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001373 colorbufferFormat != GL_RGBA8_OES)
1374 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001375 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001376 }
1377 break;
1378 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
1379 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
gman@chromium.org50c526d2011-08-10 05:19:44 +00001380 if (context->supportsDXT1Textures())
1381 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001382 return gl::error(GL_INVALID_OPERATION);
gman@chromium.org50c526d2011-08-10 05:19:44 +00001383 }
1384 else
1385 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001386 return gl::error(GL_INVALID_ENUM);
gman@chromium.org50c526d2011-08-10 05:19:44 +00001387 }
1388 break;
1389 case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
1390 if (context->supportsDXT3Textures())
1391 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001392 return gl::error(GL_INVALID_OPERATION);
gman@chromium.org50c526d2011-08-10 05:19:44 +00001393 }
1394 else
1395 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001396 return gl::error(GL_INVALID_ENUM);
gman@chromium.org50c526d2011-08-10 05:19:44 +00001397 }
1398 break;
1399 case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
1400 if (context->supportsDXT5Textures())
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001401 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001402 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001403 }
1404 else
1405 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001406 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001407 }
1408 break;
daniel@transgaming.com0c854682012-05-31 01:14:11 +00001409 case GL_DEPTH_COMPONENT:
1410 case GL_DEPTH_COMPONENT16:
1411 case GL_DEPTH_COMPONENT32_OES:
1412 case GL_DEPTH_STENCIL_OES:
1413 case GL_DEPTH24_STENCIL8_OES:
1414 if (context->supportsDepthTextures())
1415 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001416 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com0c854682012-05-31 01:14:11 +00001417 }
1418 else
1419 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001420 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com0c854682012-05-31 01:14:11 +00001421 }
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001422 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001423 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001424 }
1425
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001426 if (target == GL_TEXTURE_2D)
1427 {
1428 gl::Texture2D *texture = context->getTexture2D();
1429
1430 if (!texture)
1431 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001432 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001433 }
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00001434
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00001435 if (texture->isImmutable())
1436 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001437 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00001438 }
1439
apatrick@chromium.orgb31f5322011-01-19 19:02:52 +00001440 texture->copyImage(level, internalformat, x, y, width, height, framebuffer);
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001441 }
daniel@transgaming.com19ffc242010-05-04 03:35:21 +00001442 else if (gl::IsCubemapTextureTarget(target))
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001443 {
1444 gl::TextureCubeMap *texture = context->getTextureCubeMap();
1445
1446 if (!texture)
1447 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001448 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001449 }
1450
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00001451 if (texture->isImmutable())
1452 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001453 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00001454 }
1455
apatrick@chromium.orgb31f5322011-01-19 19:02:52 +00001456 texture->copyImage(target, level, internalformat, x, y, width, height, framebuffer);
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001457 }
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001458 else UNREACHABLE();
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001459 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001460 }
1461 catch(std::bad_alloc&)
1462 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001463 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001464 }
1465}
1466
1467void __stdcall glCopyTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height)
1468{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001469 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001470 "GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001471 target, level, xoffset, yoffset, x, y, width, height);
1472
1473 try
1474 {
apatrick@chromium.org551022e2012-01-23 19:56:54 +00001475 if (!gl::IsInternalTextureTarget(target))
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001476 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001477 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001478 }
1479
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001480 if (level < 0 || xoffset < 0 || yoffset < 0 || width < 0 || height < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001481 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001482 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001483 }
1484
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001485 if (std::numeric_limits<GLsizei>::max() - xoffset < width || std::numeric_limits<GLsizei>::max() - yoffset < height)
1486 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001487 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001488 }
1489
1490 if (width == 0 || height == 0)
1491 {
1492 return;
1493 }
1494
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001495 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001496
1497 if (context)
1498 {
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001499 if (level > context->getMaximumTextureLevel())
1500 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001501 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001502 }
1503
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00001504 gl::Framebuffer *framebuffer = context->getReadFramebuffer();
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001505
daniel@transgaming.combbc57792010-07-28 19:21:05 +00001506 if (framebuffer->completeness() != GL_FRAMEBUFFER_COMPLETE)
1507 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001508 return gl::error(GL_INVALID_FRAMEBUFFER_OPERATION);
daniel@transgaming.combbc57792010-07-28 19:21:05 +00001509 }
1510
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00001511 if (context->getReadFramebufferHandle() != 0 && framebuffer->getSamples() != 0)
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00001512 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001513 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00001514 }
1515
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00001516 gl::Renderbuffer *source = framebuffer->getReadColorbuffer();
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +00001517 GLenum colorbufferFormat = source->getInternalFormat();
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001518 gl::Texture *texture = NULL;
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +00001519 GLenum textureFormat = GL_RGBA;
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001520
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001521 if (target == GL_TEXTURE_2D)
1522 {
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +00001523 gl::Texture2D *tex2d = context->getTexture2D();
1524
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00001525 if (!validateSubImageParams2D(false, width, height, xoffset, yoffset, level, GL_NONE, GL_NONE, tex2d))
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +00001526 {
1527 return; // error already registered by validateSubImageParams
1528 }
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00001529 textureFormat = gl::ExtractFormat(tex2d->getInternalFormat(level));
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +00001530 texture = tex2d;
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001531 }
daniel@transgaming.com19ffc242010-05-04 03:35:21 +00001532 else if (gl::IsCubemapTextureTarget(target))
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001533 {
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +00001534 gl::TextureCubeMap *texcube = context->getTextureCubeMap();
1535
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00001536 if (!validateSubImageParamsCube(false, width, height, xoffset, yoffset, target, level, GL_NONE, GL_NONE, texcube))
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +00001537 {
1538 return; // error already registered by validateSubImageParams
1539 }
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00001540 textureFormat = gl::ExtractFormat(texcube->getInternalFormat(target, level));
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +00001541 texture = texcube;
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001542 }
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001543 else UNREACHABLE();
1544
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001545 // [OpenGL ES 2.0.24] table 3.9
1546 switch (textureFormat)
1547 {
1548 case GL_ALPHA:
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00001549 if (colorbufferFormat != GL_ALPHA8_EXT &&
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001550 colorbufferFormat != GL_RGBA4 &&
1551 colorbufferFormat != GL_RGB5_A1 &&
1552 colorbufferFormat != GL_RGBA8_OES)
1553 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001554 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001555 }
1556 break;
1557 case GL_LUMINANCE:
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00001558 case GL_RGB:
1559 if (colorbufferFormat != GL_RGB565 &&
1560 colorbufferFormat != GL_RGB8_OES &&
1561 colorbufferFormat != GL_RGBA4 &&
1562 colorbufferFormat != GL_RGB5_A1 &&
1563 colorbufferFormat != GL_RGBA8_OES)
1564 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001565 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00001566 }
1567 break;
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001568 case GL_LUMINANCE_ALPHA:
1569 case GL_RGBA:
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00001570 if (colorbufferFormat != GL_RGBA4 &&
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001571 colorbufferFormat != GL_RGB5_A1 &&
1572 colorbufferFormat != GL_RGBA8_OES)
1573 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001574 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001575 }
1576 break;
1577 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
1578 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
gman@chromium.org50c526d2011-08-10 05:19:44 +00001579 case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
1580 case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001581 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com0c854682012-05-31 01:14:11 +00001582 case GL_DEPTH_COMPONENT:
1583 case GL_DEPTH_STENCIL_OES:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001584 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001585 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001586 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001587 }
1588
apatrick@chromium.orgb31f5322011-01-19 19:02:52 +00001589 texture->copySubImage(target, level, xoffset, yoffset, x, y, width, height, framebuffer);
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001590 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001591 }
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001592
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001593 catch(std::bad_alloc&)
1594 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001595 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001596 }
1597}
1598
1599GLuint __stdcall glCreateProgram(void)
1600{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001601 EVENT("()");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001602
1603 try
1604 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001605 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001606
1607 if (context)
1608 {
1609 return context->createProgram();
1610 }
1611 }
1612 catch(std::bad_alloc&)
1613 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001614 return gl::error(GL_OUT_OF_MEMORY, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001615 }
1616
1617 return 0;
1618}
1619
1620GLuint __stdcall glCreateShader(GLenum type)
1621{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001622 EVENT("(GLenum type = 0x%X)", type);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001623
1624 try
1625 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001626 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001627
1628 if (context)
1629 {
1630 switch (type)
1631 {
1632 case GL_FRAGMENT_SHADER:
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00001633 case GL_VERTEX_SHADER:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001634 return context->createShader(type);
1635 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001636 return gl::error(GL_INVALID_ENUM, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001637 }
1638 }
1639 }
1640 catch(std::bad_alloc&)
1641 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001642 return gl::error(GL_OUT_OF_MEMORY, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001643 }
1644
1645 return 0;
1646}
1647
1648void __stdcall glCullFace(GLenum mode)
1649{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001650 EVENT("(GLenum mode = 0x%X)", mode);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001651
1652 try
1653 {
1654 switch (mode)
1655 {
1656 case GL_FRONT:
1657 case GL_BACK:
1658 case GL_FRONT_AND_BACK:
1659 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001660 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001661
1662 if (context)
1663 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00001664 context->setCullMode(mode);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001665 }
1666 }
1667 break;
1668 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001669 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001670 }
1671 }
1672 catch(std::bad_alloc&)
1673 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001674 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001675 }
1676}
1677
1678void __stdcall glDeleteBuffers(GLsizei n, const GLuint* buffers)
1679{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001680 EVENT("(GLsizei n = %d, const GLuint* buffers = 0x%0.8p)", n, buffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001681
1682 try
1683 {
1684 if (n < 0)
1685 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001686 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001687 }
1688
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001689 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001690
1691 if (context)
1692 {
1693 for (int i = 0; i < n; i++)
1694 {
1695 context->deleteBuffer(buffers[i]);
1696 }
1697 }
1698 }
1699 catch(std::bad_alloc&)
1700 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001701 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001702 }
1703}
1704
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001705void __stdcall glDeleteFencesNV(GLsizei n, const GLuint* fences)
1706{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001707 EVENT("(GLsizei n = %d, const GLuint* fences = 0x%0.8p)", n, fences);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001708
1709 try
1710 {
1711 if (n < 0)
1712 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001713 return gl::error(GL_INVALID_VALUE);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001714 }
1715
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001716 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001717
1718 if (context)
1719 {
1720 for (int i = 0; i < n; i++)
1721 {
1722 context->deleteFence(fences[i]);
1723 }
1724 }
1725 }
1726 catch(std::bad_alloc&)
1727 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001728 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001729 }
1730}
1731
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001732void __stdcall glDeleteFramebuffers(GLsizei n, const GLuint* framebuffers)
1733{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001734 EVENT("(GLsizei n = %d, const GLuint* framebuffers = 0x%0.8p)", n, framebuffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001735
1736 try
1737 {
1738 if (n < 0)
1739 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001740 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001741 }
1742
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001743 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001744
1745 if (context)
1746 {
1747 for (int i = 0; i < n; i++)
1748 {
1749 if (framebuffers[i] != 0)
1750 {
1751 context->deleteFramebuffer(framebuffers[i]);
1752 }
1753 }
1754 }
1755 }
1756 catch(std::bad_alloc&)
1757 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001758 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001759 }
1760}
1761
1762void __stdcall glDeleteProgram(GLuint program)
1763{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001764 EVENT("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001765
1766 try
1767 {
daniel@transgaming.com75401e62010-04-13 03:26:39 +00001768 if (program == 0)
1769 {
1770 return;
1771 }
1772
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001773 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001774
1775 if (context)
1776 {
daniel@transgaming.com75401e62010-04-13 03:26:39 +00001777 if (!context->getProgram(program))
1778 {
1779 if(context->getShader(program))
1780 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001781 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com75401e62010-04-13 03:26:39 +00001782 }
1783 else
1784 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001785 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com75401e62010-04-13 03:26:39 +00001786 }
1787 }
1788
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001789 context->deleteProgram(program);
1790 }
1791 }
1792 catch(std::bad_alloc&)
1793 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001794 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001795 }
1796}
1797
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00001798void __stdcall glDeleteQueriesEXT(GLsizei n, const GLuint *ids)
1799{
1800 EVENT("(GLsizei n = %d, const GLuint *ids = 0x%0.8p)", n, ids);
1801
1802 try
1803 {
1804 if (n < 0)
1805 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001806 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00001807 }
1808
1809 gl::Context *context = gl::getNonLostContext();
1810
1811 if (context)
1812 {
1813 for (int i = 0; i < n; i++)
1814 {
1815 context->deleteQuery(ids[i]);
1816 }
1817 }
1818 }
1819 catch(std::bad_alloc&)
1820 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001821 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00001822 }
1823}
1824
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001825void __stdcall glDeleteRenderbuffers(GLsizei n, const GLuint* renderbuffers)
1826{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001827 EVENT("(GLsizei n = %d, const GLuint* renderbuffers = 0x%0.8p)", n, renderbuffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001828
1829 try
1830 {
1831 if (n < 0)
1832 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001833 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001834 }
1835
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001836 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001837
1838 if (context)
1839 {
daniel@transgaming.come2b22122010-03-11 19:22:14 +00001840 for (int i = 0; i < n; i++)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001841 {
1842 context->deleteRenderbuffer(renderbuffers[i]);
1843 }
1844 }
1845 }
1846 catch(std::bad_alloc&)
1847 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001848 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001849 }
1850}
1851
1852void __stdcall glDeleteShader(GLuint shader)
1853{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001854 EVENT("(GLuint shader = %d)", shader);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001855
1856 try
1857 {
daniel@transgaming.com75401e62010-04-13 03:26:39 +00001858 if (shader == 0)
1859 {
1860 return;
1861 }
1862
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001863 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001864
1865 if (context)
1866 {
daniel@transgaming.com75401e62010-04-13 03:26:39 +00001867 if (!context->getShader(shader))
1868 {
1869 if(context->getProgram(shader))
1870 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001871 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com75401e62010-04-13 03:26:39 +00001872 }
1873 else
1874 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001875 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com75401e62010-04-13 03:26:39 +00001876 }
1877 }
1878
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001879 context->deleteShader(shader);
1880 }
1881 }
1882 catch(std::bad_alloc&)
1883 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001884 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001885 }
1886}
1887
1888void __stdcall glDeleteTextures(GLsizei n, const GLuint* textures)
1889{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001890 EVENT("(GLsizei n = %d, const GLuint* textures = 0x%0.8p)", n, textures);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001891
1892 try
1893 {
1894 if (n < 0)
1895 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001896 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001897 }
1898
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001899 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001900
1901 if (context)
1902 {
1903 for (int i = 0; i < n; i++)
1904 {
1905 if (textures[i] != 0)
1906 {
1907 context->deleteTexture(textures[i]);
1908 }
1909 }
1910 }
1911 }
1912 catch(std::bad_alloc&)
1913 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001914 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001915 }
1916}
1917
1918void __stdcall glDepthFunc(GLenum func)
1919{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001920 EVENT("(GLenum func = 0x%X)", func);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001921
1922 try
1923 {
1924 switch (func)
1925 {
1926 case GL_NEVER:
1927 case GL_ALWAYS:
1928 case GL_LESS:
1929 case GL_LEQUAL:
1930 case GL_EQUAL:
1931 case GL_GREATER:
1932 case GL_GEQUAL:
1933 case GL_NOTEQUAL:
1934 break;
1935 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001936 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001937 }
1938
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001939 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001940
1941 if (context)
1942 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00001943 context->setDepthFunc(func);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001944 }
1945 }
1946 catch(std::bad_alloc&)
1947 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001948 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001949 }
1950}
1951
1952void __stdcall glDepthMask(GLboolean flag)
1953{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00001954 EVENT("(GLboolean flag = %u)", flag);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001955
1956 try
1957 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001958 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001959
1960 if (context)
1961 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00001962 context->setDepthMask(flag != GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001963 }
1964 }
1965 catch(std::bad_alloc&)
1966 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001967 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001968 }
1969}
1970
1971void __stdcall glDepthRangef(GLclampf zNear, GLclampf zFar)
1972{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001973 EVENT("(GLclampf zNear = %f, GLclampf zFar = %f)", zNear, zFar);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001974
1975 try
1976 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001977 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001978
1979 if (context)
1980 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00001981 context->setDepthRange(zNear, zFar);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001982 }
1983 }
1984 catch(std::bad_alloc&)
1985 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001986 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001987 }
1988}
1989
1990void __stdcall glDetachShader(GLuint program, GLuint shader)
1991{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001992 EVENT("(GLuint program = %d, GLuint shader = %d)", program, shader);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001993
1994 try
1995 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001996 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001997
1998 if (context)
1999 {
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00002000
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002001 gl::Program *programObject = context->getProgram(program);
2002 gl::Shader *shaderObject = context->getShader(shader);
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00002003
2004 if (!programObject)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002005 {
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00002006 gl::Shader *shaderByProgramHandle;
2007 shaderByProgramHandle = context->getShader(program);
2008 if (!shaderByProgramHandle)
2009 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002010 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00002011 }
2012 else
2013 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002014 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00002015 }
2016 }
2017
2018 if (!shaderObject)
2019 {
2020 gl::Program *programByShaderHandle = context->getProgram(shader);
2021 if (!programByShaderHandle)
2022 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002023 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00002024 }
2025 else
2026 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002027 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00002028 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002029 }
2030
2031 if (!programObject->detachShader(shaderObject))
2032 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002033 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002034 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002035 }
2036 }
2037 catch(std::bad_alloc&)
2038 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002039 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002040 }
2041}
2042
2043void __stdcall glDisable(GLenum cap)
2044{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002045 EVENT("(GLenum cap = 0x%X)", cap);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002046
2047 try
2048 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002049 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002050
2051 if (context)
2052 {
2053 switch (cap)
2054 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00002055 case GL_CULL_FACE: context->setCullFace(false); break;
2056 case GL_POLYGON_OFFSET_FILL: context->setPolygonOffsetFill(false); break;
2057 case GL_SAMPLE_ALPHA_TO_COVERAGE: context->setSampleAlphaToCoverage(false); break;
2058 case GL_SAMPLE_COVERAGE: context->setSampleCoverage(false); break;
2059 case GL_SCISSOR_TEST: context->setScissorTest(false); break;
2060 case GL_STENCIL_TEST: context->setStencilTest(false); break;
2061 case GL_DEPTH_TEST: context->setDepthTest(false); break;
2062 case GL_BLEND: context->setBlend(false); break;
2063 case GL_DITHER: context->setDither(false); break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002064 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002065 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002066 }
2067 }
2068 }
2069 catch(std::bad_alloc&)
2070 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002071 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002072 }
2073}
2074
2075void __stdcall glDisableVertexAttribArray(GLuint index)
2076{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002077 EVENT("(GLuint index = %d)", index);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002078
2079 try
2080 {
2081 if (index >= gl::MAX_VERTEX_ATTRIBS)
2082 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002083 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002084 }
2085
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002086 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002087
2088 if (context)
2089 {
daniel@transgaming.com83921382011-01-08 05:46:00 +00002090 context->setEnableVertexAttribArray(index, false);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002091 }
2092 }
2093 catch(std::bad_alloc&)
2094 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002095 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002096 }
2097}
2098
2099void __stdcall glDrawArrays(GLenum mode, GLint first, GLsizei count)
2100{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002101 EVENT("(GLenum mode = 0x%X, GLint first = %d, GLsizei count = %d)", mode, first, count);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002102
2103 try
2104 {
2105 if (count < 0 || first < 0)
2106 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002107 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002108 }
2109
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002110 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002111
2112 if (context)
2113 {
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00002114 context->drawArrays(mode, first, count, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002115 }
2116 }
2117 catch(std::bad_alloc&)
2118 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002119 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002120 }
2121}
2122
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002123void __stdcall glDrawArraysInstancedANGLE(GLenum mode, GLint first, GLsizei count, GLsizei primcount)
2124{
2125 EVENT("(GLenum mode = 0x%X, GLint first = %d, GLsizei count = %d, GLsizei primcount = %d)", mode, first, count, primcount);
2126
2127 try
2128 {
2129 if (count < 0 || first < 0 || primcount < 0)
2130 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002131 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002132 }
2133
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00002134 if (primcount > 0)
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002135 {
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00002136 gl::Context *context = gl::getNonLostContext();
2137
2138 if (context)
2139 {
2140 context->drawArrays(mode, first, count, primcount);
2141 }
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002142 }
2143 }
2144 catch(std::bad_alloc&)
2145 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002146 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002147 }
2148}
2149
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00002150void __stdcall glDrawElements(GLenum mode, GLsizei count, GLenum type, const GLvoid* indices)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002151{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002152 EVENT("(GLenum mode = 0x%X, GLsizei count = %d, GLenum type = 0x%X, const GLvoid* indices = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00002153 mode, count, type, indices);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002154
2155 try
2156 {
2157 if (count < 0)
2158 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002159 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002160 }
2161
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002162 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002163
2164 if (context)
2165 {
daniel@transgaming.com83921382011-01-08 05:46:00 +00002166 switch (type)
2167 {
2168 case GL_UNSIGNED_BYTE:
2169 case GL_UNSIGNED_SHORT:
2170 break;
2171 case GL_UNSIGNED_INT:
2172 if (!context->supports32bitIndices())
2173 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002174 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com83921382011-01-08 05:46:00 +00002175 }
2176 break;
2177 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002178 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com83921382011-01-08 05:46:00 +00002179 }
2180
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00002181 context->drawElements(mode, count, type, indices, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002182 }
2183 }
2184 catch(std::bad_alloc&)
2185 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002186 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002187 }
2188}
2189
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002190void __stdcall glDrawElementsInstancedANGLE(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLsizei primcount)
2191{
2192 EVENT("(GLenum mode = 0x%X, GLsizei count = %d, GLenum type = 0x%X, const GLvoid* indices = 0x%0.8p, GLsizei primcount = %d)",
2193 mode, count, type, indices, primcount);
2194
2195 try
2196 {
2197 if (count < 0 || primcount < 0)
2198 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002199 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002200 }
2201
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00002202 if (primcount > 0)
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002203 {
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00002204 gl::Context *context = gl::getNonLostContext();
2205
2206 if (context)
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002207 {
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00002208 switch (type)
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002209 {
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00002210 case GL_UNSIGNED_BYTE:
2211 case GL_UNSIGNED_SHORT:
2212 break;
2213 case GL_UNSIGNED_INT:
2214 if (!context->supports32bitIndices())
2215 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002216 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00002217 }
2218 break;
2219 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002220 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002221 }
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00002222
2223 context->drawElements(mode, count, type, indices, primcount);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002224 }
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002225 }
2226 }
2227 catch(std::bad_alloc&)
2228 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002229 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002230 }
2231}
2232
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002233void __stdcall glEnable(GLenum cap)
2234{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002235 EVENT("(GLenum cap = 0x%X)", cap);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002236
2237 try
2238 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002239 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002240
2241 if (context)
2242 {
2243 switch (cap)
2244 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00002245 case GL_CULL_FACE: context->setCullFace(true); break;
2246 case GL_POLYGON_OFFSET_FILL: context->setPolygonOffsetFill(true); break;
2247 case GL_SAMPLE_ALPHA_TO_COVERAGE: context->setSampleAlphaToCoverage(true); break;
2248 case GL_SAMPLE_COVERAGE: context->setSampleCoverage(true); break;
2249 case GL_SCISSOR_TEST: context->setScissorTest(true); break;
2250 case GL_STENCIL_TEST: context->setStencilTest(true); break;
2251 case GL_DEPTH_TEST: context->setDepthTest(true); break;
2252 case GL_BLEND: context->setBlend(true); break;
2253 case GL_DITHER: context->setDither(true); break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002254 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002255 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002256 }
2257 }
2258 }
2259 catch(std::bad_alloc&)
2260 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002261 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002262 }
2263}
2264
2265void __stdcall glEnableVertexAttribArray(GLuint index)
2266{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002267 EVENT("(GLuint index = %d)", index);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002268
2269 try
2270 {
2271 if (index >= gl::MAX_VERTEX_ATTRIBS)
2272 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002273 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002274 }
2275
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002276 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002277
2278 if (context)
2279 {
daniel@transgaming.com83921382011-01-08 05:46:00 +00002280 context->setEnableVertexAttribArray(index, true);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002281 }
2282 }
2283 catch(std::bad_alloc&)
2284 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002285 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002286 }
2287}
2288
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00002289void __stdcall glEndQueryEXT(GLenum target)
2290{
2291 EVENT("GLenum target = 0x%X)", target);
2292
2293 try
2294 {
2295 switch (target)
2296 {
2297 case GL_ANY_SAMPLES_PASSED_EXT:
2298 case GL_ANY_SAMPLES_PASSED_CONSERVATIVE_EXT:
2299 break;
2300 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002301 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00002302 }
2303
2304 gl::Context *context = gl::getNonLostContext();
2305
2306 if (context)
2307 {
2308 context->endQuery(target);
2309 }
2310 }
2311 catch(std::bad_alloc&)
2312 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002313 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00002314 }
2315}
2316
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002317void __stdcall glFinishFenceNV(GLuint fence)
2318{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002319 EVENT("(GLuint fence = %d)", fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002320
2321 try
2322 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002323 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002324
2325 if (context)
2326 {
2327 gl::Fence* fenceObject = context->getFence(fence);
2328
2329 if (fenceObject == NULL)
2330 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002331 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002332 }
2333
2334 fenceObject->finishFence();
2335 }
2336 }
2337 catch(std::bad_alloc&)
2338 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002339 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002340 }
2341}
2342
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002343void __stdcall glFinish(void)
2344{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002345 EVENT("()");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002346
2347 try
2348 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002349 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002350
2351 if (context)
2352 {
daniel@transgaming.com0d86aa72011-10-26 02:35:10 +00002353 context->sync(true);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002354 }
2355 }
2356 catch(std::bad_alloc&)
2357 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002358 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002359 }
2360}
2361
2362void __stdcall glFlush(void)
2363{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002364 EVENT("()");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002365
2366 try
2367 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002368 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002369
2370 if (context)
2371 {
daniel@transgaming.com0d86aa72011-10-26 02:35:10 +00002372 context->sync(false);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002373 }
2374 }
2375 catch(std::bad_alloc&)
2376 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002377 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002378 }
2379}
2380
2381void __stdcall glFramebufferRenderbuffer(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer)
2382{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002383 EVENT("(GLenum target = 0x%X, GLenum attachment = 0x%X, GLenum renderbuffertarget = 0x%X, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00002384 "GLuint renderbuffer = %d)", target, attachment, renderbuffertarget, renderbuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002385
2386 try
2387 {
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002388 if ((target != GL_FRAMEBUFFER && target != GL_DRAW_FRAMEBUFFER_ANGLE && target != GL_READ_FRAMEBUFFER_ANGLE)
daniel@transgaming.com2fa45512011-10-04 18:43:18 +00002389 || (renderbuffertarget != GL_RENDERBUFFER && renderbuffer != 0))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002390 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002391 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002392 }
2393
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002394 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002395
2396 if (context)
2397 {
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002398 gl::Framebuffer *framebuffer = NULL;
2399 GLuint framebufferHandle = 0;
2400 if (target == GL_READ_FRAMEBUFFER_ANGLE)
2401 {
2402 framebuffer = context->getReadFramebuffer();
2403 framebufferHandle = context->getReadFramebufferHandle();
2404 }
daniel@transgaming.com2fa45512011-10-04 18:43:18 +00002405 else
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002406 {
2407 framebuffer = context->getDrawFramebuffer();
2408 framebufferHandle = context->getDrawFramebufferHandle();
2409 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002410
daniel@transgaming.com2fa45512011-10-04 18:43:18 +00002411 if (!framebuffer || (framebufferHandle == 0 && renderbuffer != 0))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002412 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002413 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002414 }
2415
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002416 if (attachment >= GL_COLOR_ATTACHMENT0_EXT && attachment <= GL_COLOR_ATTACHMENT15_EXT)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002417 {
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002418 const unsigned int colorAttachment = (attachment - GL_COLOR_ATTACHMENT0_EXT);
2419
2420 if (colorAttachment >= context->getMaximumRenderTargets())
2421 {
2422 return gl::error(GL_INVALID_VALUE);
2423 }
2424
2425 framebuffer->setColorbuffer(colorAttachment, GL_RENDERBUFFER, renderbuffer);
2426 }
2427 else
2428 {
2429 switch (attachment)
2430 {
2431 case GL_DEPTH_ATTACHMENT:
2432 framebuffer->setDepthbuffer(GL_RENDERBUFFER, renderbuffer);
2433 break;
2434 case GL_STENCIL_ATTACHMENT:
2435 framebuffer->setStencilbuffer(GL_RENDERBUFFER, renderbuffer);
2436 break;
2437 default:
2438 return gl::error(GL_INVALID_ENUM);
2439 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002440 }
2441 }
2442 }
2443 catch(std::bad_alloc&)
2444 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002445 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002446 }
2447}
2448
2449void __stdcall glFramebufferTexture2D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level)
2450{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002451 EVENT("(GLenum target = 0x%X, GLenum attachment = 0x%X, GLenum textarget = 0x%X, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00002452 "GLuint texture = %d, GLint level = %d)", target, attachment, textarget, texture, level);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002453
2454 try
2455 {
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002456 if (target != GL_FRAMEBUFFER && target != GL_DRAW_FRAMEBUFFER_ANGLE && target != GL_READ_FRAMEBUFFER_ANGLE)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002457 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002458 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002459 }
2460
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002461 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002462
2463 if (context)
2464 {
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002465 if (attachment >= GL_COLOR_ATTACHMENT0_EXT && attachment <= GL_COLOR_ATTACHMENT15_EXT)
2466 {
2467 const unsigned int colorAttachment = (attachment - GL_COLOR_ATTACHMENT0_EXT);
2468
2469 if (colorAttachment >= context->getMaximumRenderTargets())
2470 {
2471 return gl::error(GL_INVALID_VALUE);
2472 }
2473 }
2474 else
2475 {
2476 switch (attachment)
2477 {
2478 case GL_DEPTH_ATTACHMENT:
2479 case GL_STENCIL_ATTACHMENT:
2480 break;
2481 default:
2482 return gl::error(GL_INVALID_ENUM);
2483 }
2484 }
2485
daniel@transgaming.com93a81472010-04-20 18:52:58 +00002486 if (texture == 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002487 {
daniel@transgaming.com93a81472010-04-20 18:52:58 +00002488 textarget = GL_NONE;
2489 }
2490 else
2491 {
2492 gl::Texture *tex = context->getTexture(texture);
2493
2494 if (tex == NULL)
2495 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002496 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com93a81472010-04-20 18:52:58 +00002497 }
2498
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002499 switch (textarget)
2500 {
2501 case GL_TEXTURE_2D:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002502 {
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00002503 if (tex->getTarget() != GL_TEXTURE_2D)
2504 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002505 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00002506 }
2507 gl::Texture2D *tex2d = static_cast<gl::Texture2D *>(tex);
daniel@transgaming.com92f49922012-05-09 15:49:19 +00002508 if (tex2d->isCompressed(0))
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00002509 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002510 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00002511 }
2512 break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002513 }
daniel@transgaming.com93a81472010-04-20 18:52:58 +00002514
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002515 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002516 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002517 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002518 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002519 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002520 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
daniel@transgaming.com93a81472010-04-20 18:52:58 +00002521 {
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00002522 if (tex->getTarget() != GL_TEXTURE_CUBE_MAP)
2523 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002524 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00002525 }
2526 gl::TextureCubeMap *texcube = static_cast<gl::TextureCubeMap *>(tex);
daniel@transgaming.com4df88e82012-05-09 15:49:24 +00002527 if (texcube->isCompressed(textarget, level))
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00002528 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002529 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00002530 }
2531 break;
daniel@transgaming.com93a81472010-04-20 18:52:58 +00002532 }
daniel@transgaming.com93a81472010-04-20 18:52:58 +00002533
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002534 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002535 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002536 }
2537
2538 if (level != 0)
2539 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002540 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002541 }
2542 }
2543
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002544 gl::Framebuffer *framebuffer = NULL;
2545 GLuint framebufferHandle = 0;
2546 if (target == GL_READ_FRAMEBUFFER_ANGLE)
2547 {
2548 framebuffer = context->getReadFramebuffer();
2549 framebufferHandle = context->getReadFramebufferHandle();
2550 }
2551 else
2552 {
2553 framebuffer = context->getDrawFramebuffer();
2554 framebufferHandle = context->getDrawFramebufferHandle();
2555 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002556
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002557 if (framebufferHandle == 0 || !framebuffer)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002558 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002559 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002560 }
2561
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002562 if (attachment >= GL_COLOR_ATTACHMENT0_EXT && attachment <= GL_COLOR_ATTACHMENT15_EXT)
daniel@transgaming.comfbc09532010-04-26 15:33:41 +00002563 {
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002564 const unsigned int colorAttachment = (attachment - GL_COLOR_ATTACHMENT0_EXT);
2565
2566 if (colorAttachment >= context->getMaximumRenderTargets())
2567 {
2568 return gl::error(GL_INVALID_VALUE);
2569 }
2570
2571 framebuffer->setColorbuffer(colorAttachment, textarget, texture);
2572 }
2573 else
2574 {
2575 switch (attachment)
2576 {
2577 case GL_DEPTH_ATTACHMENT: framebuffer->setDepthbuffer(textarget, texture); break;
2578 case GL_STENCIL_ATTACHMENT: framebuffer->setStencilbuffer(textarget, texture); break;
2579 }
daniel@transgaming.comfbc09532010-04-26 15:33:41 +00002580 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002581 }
2582 }
2583 catch(std::bad_alloc&)
2584 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002585 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002586 }
2587}
2588
2589void __stdcall glFrontFace(GLenum mode)
2590{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002591 EVENT("(GLenum mode = 0x%X)", mode);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002592
2593 try
2594 {
2595 switch (mode)
2596 {
2597 case GL_CW:
2598 case GL_CCW:
2599 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002600 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002601
2602 if (context)
2603 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00002604 context->setFrontFace(mode);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002605 }
2606 }
2607 break;
2608 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002609 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002610 }
2611 }
2612 catch(std::bad_alloc&)
2613 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002614 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002615 }
2616}
2617
2618void __stdcall glGenBuffers(GLsizei n, GLuint* buffers)
2619{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002620 EVENT("(GLsizei n = %d, GLuint* buffers = 0x%0.8p)", n, buffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002621
2622 try
2623 {
2624 if (n < 0)
2625 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002626 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002627 }
2628
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002629 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002630
2631 if (context)
2632 {
2633 for (int i = 0; i < n; i++)
2634 {
2635 buffers[i] = context->createBuffer();
2636 }
2637 }
2638 }
2639 catch(std::bad_alloc&)
2640 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002641 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002642 }
2643}
2644
2645void __stdcall glGenerateMipmap(GLenum target)
2646{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002647 EVENT("(GLenum target = 0x%X)", target);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002648
2649 try
2650 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002651 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com8fd99e22010-04-20 18:52:00 +00002652
2653 if (context)
2654 {
daniel@transgaming.com8fd99e22010-04-20 18:52:00 +00002655 switch (target)
2656 {
2657 case GL_TEXTURE_2D:
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00002658 {
2659 gl::Texture2D *tex2d = context->getTexture2D();
2660
daniel@transgaming.com92f49922012-05-09 15:49:19 +00002661 if (tex2d->isCompressed(0))
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00002662 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002663 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00002664 }
daniel@transgaming.com0c854682012-05-31 01:14:11 +00002665 if (tex2d->isDepth(0))
2666 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002667 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com0c854682012-05-31 01:14:11 +00002668 }
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00002669
2670 tex2d->generateMipmaps();
2671 break;
2672 }
daniel@transgaming.com8fd99e22010-04-20 18:52:00 +00002673
2674 case GL_TEXTURE_CUBE_MAP:
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00002675 {
2676 gl::TextureCubeMap *texcube = context->getTextureCubeMap();
2677
daniel@transgaming.com4df88e82012-05-09 15:49:24 +00002678 if (texcube->isCompressed(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0))
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00002679 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002680 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00002681 }
2682
2683 texcube->generateMipmaps();
2684 break;
2685 }
daniel@transgaming.com8fd99e22010-04-20 18:52:00 +00002686
2687 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002688 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com8fd99e22010-04-20 18:52:00 +00002689 }
daniel@transgaming.com8fd99e22010-04-20 18:52:00 +00002690 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002691 }
2692 catch(std::bad_alloc&)
2693 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002694 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002695 }
2696}
2697
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002698void __stdcall glGenFencesNV(GLsizei n, GLuint* fences)
2699{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002700 EVENT("(GLsizei n = %d, GLuint* fences = 0x%0.8p)", n, fences);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002701
2702 try
2703 {
2704 if (n < 0)
2705 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002706 return gl::error(GL_INVALID_VALUE);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002707 }
2708
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002709 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002710
2711 if (context)
2712 {
2713 for (int i = 0; i < n; i++)
2714 {
2715 fences[i] = context->createFence();
2716 }
2717 }
2718 }
2719 catch(std::bad_alloc&)
2720 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002721 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002722 }
2723}
2724
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002725void __stdcall glGenFramebuffers(GLsizei n, GLuint* framebuffers)
2726{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002727 EVENT("(GLsizei n = %d, GLuint* framebuffers = 0x%0.8p)", n, framebuffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002728
2729 try
2730 {
2731 if (n < 0)
2732 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002733 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002734 }
2735
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002736 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002737
2738 if (context)
2739 {
2740 for (int i = 0; i < n; i++)
2741 {
2742 framebuffers[i] = context->createFramebuffer();
2743 }
2744 }
2745 }
2746 catch(std::bad_alloc&)
2747 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002748 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002749 }
2750}
2751
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00002752void __stdcall glGenQueriesEXT(GLsizei n, GLuint* ids)
2753{
2754 EVENT("(GLsizei n = %d, GLuint* ids = 0x%0.8p)", n, ids);
2755
2756 try
2757 {
2758 if (n < 0)
2759 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002760 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00002761 }
2762
2763 gl::Context *context = gl::getNonLostContext();
2764
2765 if (context)
2766 {
2767 for (int i = 0; i < n; i++)
2768 {
2769 ids[i] = context->createQuery();
2770 }
2771 }
2772 }
2773 catch(std::bad_alloc&)
2774 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002775 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00002776 }
2777}
2778
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002779void __stdcall glGenRenderbuffers(GLsizei n, GLuint* renderbuffers)
2780{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002781 EVENT("(GLsizei n = %d, GLuint* renderbuffers = 0x%0.8p)", n, renderbuffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002782
2783 try
2784 {
2785 if (n < 0)
2786 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002787 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002788 }
2789
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002790 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002791
2792 if (context)
2793 {
2794 for (int i = 0; i < n; i++)
2795 {
2796 renderbuffers[i] = context->createRenderbuffer();
2797 }
2798 }
2799 }
2800 catch(std::bad_alloc&)
2801 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002802 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002803 }
2804}
2805
2806void __stdcall glGenTextures(GLsizei n, GLuint* textures)
2807{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002808 EVENT("(GLsizei n = %d, GLuint* textures = 0x%0.8p)", n, textures);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002809
2810 try
2811 {
2812 if (n < 0)
2813 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002814 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002815 }
2816
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002817 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002818
2819 if (context)
2820 {
2821 for (int i = 0; i < n; i++)
2822 {
2823 textures[i] = context->createTexture();
2824 }
2825 }
2826 }
2827 catch(std::bad_alloc&)
2828 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002829 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002830 }
2831}
2832
daniel@transgaming.com85423182010-04-22 13:35:27 +00002833void __stdcall glGetActiveAttrib(GLuint program, GLuint index, GLsizei bufsize, GLsizei *length, GLint *size, GLenum *type, GLchar *name)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002834{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002835 EVENT("(GLuint program = %d, GLuint index = %d, GLsizei bufsize = %d, GLsizei *length = 0x%0.8p, "
daniel@transgaming.com85423182010-04-22 13:35:27 +00002836 "GLint *size = 0x%0.8p, GLenum *type = %0.8p, GLchar *name = %0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002837 program, index, bufsize, length, size, type, name);
2838
2839 try
2840 {
2841 if (bufsize < 0)
2842 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002843 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002844 }
2845
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002846 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com85423182010-04-22 13:35:27 +00002847
2848 if (context)
2849 {
2850 gl::Program *programObject = context->getProgram(program);
2851
2852 if (!programObject)
2853 {
2854 if (context->getShader(program))
2855 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002856 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com85423182010-04-22 13:35:27 +00002857 }
2858 else
2859 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002860 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com85423182010-04-22 13:35:27 +00002861 }
2862 }
2863
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00002864 if (index >= (GLuint)programObject->getActiveAttributeCount())
daniel@transgaming.com85423182010-04-22 13:35:27 +00002865 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002866 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com85423182010-04-22 13:35:27 +00002867 }
2868
2869 programObject->getActiveAttribute(index, bufsize, length, size, type, name);
2870 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002871 }
2872 catch(std::bad_alloc&)
2873 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002874 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002875 }
2876}
2877
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00002878void __stdcall glGetActiveUniform(GLuint program, GLuint index, GLsizei bufsize, GLsizei* length, GLint* size, GLenum* type, GLchar* name)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002879{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002880 EVENT("(GLuint program = %d, GLuint index = %d, GLsizei bufsize = %d, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00002881 "GLsizei* length = 0x%0.8p, GLint* size = 0x%0.8p, GLenum* type = 0x%0.8p, GLchar* name = 0x%0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002882 program, index, bufsize, length, size, type, name);
2883
2884 try
2885 {
2886 if (bufsize < 0)
2887 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002888 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002889 }
2890
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002891 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00002892
2893 if (context)
2894 {
2895 gl::Program *programObject = context->getProgram(program);
2896
2897 if (!programObject)
2898 {
2899 if (context->getShader(program))
2900 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002901 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00002902 }
2903 else
2904 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002905 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00002906 }
2907 }
2908
2909 if (index >= (GLuint)programObject->getActiveUniformCount())
2910 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002911 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00002912 }
2913
2914 programObject->getActiveUniform(index, bufsize, length, size, type, name);
2915 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002916 }
2917 catch(std::bad_alloc&)
2918 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002919 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002920 }
2921}
2922
2923void __stdcall glGetAttachedShaders(GLuint program, GLsizei maxcount, GLsizei* count, GLuint* shaders)
2924{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002925 EVENT("(GLuint program = %d, GLsizei maxcount = %d, GLsizei* count = 0x%0.8p, GLuint* shaders = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00002926 program, maxcount, count, shaders);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002927
2928 try
2929 {
2930 if (maxcount < 0)
2931 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002932 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002933 }
2934
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002935 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com6c785212010-03-30 03:36:17 +00002936
2937 if (context)
2938 {
2939 gl::Program *programObject = context->getProgram(program);
2940
2941 if (!programObject)
2942 {
daniel@transgaming.com23953e32010-04-13 19:53:31 +00002943 if (context->getShader(program))
2944 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002945 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com23953e32010-04-13 19:53:31 +00002946 }
2947 else
2948 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002949 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com23953e32010-04-13 19:53:31 +00002950 }
daniel@transgaming.com6c785212010-03-30 03:36:17 +00002951 }
2952
2953 return programObject->getAttachedShaders(maxcount, count, shaders);
2954 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002955 }
2956 catch(std::bad_alloc&)
2957 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002958 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002959 }
2960}
2961
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00002962int __stdcall glGetAttribLocation(GLuint program, const GLchar* name)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002963{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002964 EVENT("(GLuint program = %d, const GLchar* name = %s)", program, name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002965
2966 try
2967 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002968 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002969
2970 if (context)
2971 {
daniel@transgaming.combb274c32010-04-13 03:26:21 +00002972
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002973 gl::Program *programObject = context->getProgram(program);
2974
2975 if (!programObject)
2976 {
daniel@transgaming.combb274c32010-04-13 03:26:21 +00002977 if (context->getShader(program))
2978 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002979 return gl::error(GL_INVALID_OPERATION, -1);
daniel@transgaming.combb274c32010-04-13 03:26:21 +00002980 }
2981 else
2982 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002983 return gl::error(GL_INVALID_VALUE, -1);
daniel@transgaming.combb274c32010-04-13 03:26:21 +00002984 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002985 }
2986
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00002987 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
daniel@transgaming.com716056c2012-07-24 18:38:59 +00002988 if (!programObject->isLinked() || !programBinary)
daniel@transgaming.comcf4aa872010-04-13 03:26:27 +00002989 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002990 return gl::error(GL_INVALID_OPERATION, -1);
daniel@transgaming.comcf4aa872010-04-13 03:26:27 +00002991 }
2992
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00002993 return programBinary->getAttributeLocation(name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002994 }
2995 }
2996 catch(std::bad_alloc&)
2997 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002998 return gl::error(GL_OUT_OF_MEMORY, -1);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002999 }
3000
3001 return -1;
3002}
3003
3004void __stdcall glGetBooleanv(GLenum pname, GLboolean* params)
3005{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003006 EVENT("(GLenum pname = 0x%X, GLboolean* params = 0x%0.8p)", pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003007
3008 try
3009 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003010 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003011
3012 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003013 {
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003014 if (!(context->getBooleanv(pname, params)))
3015 {
3016 GLenum nativeType;
3017 unsigned int numParams = 0;
3018 if (!context->getQueryParameterInfo(pname, &nativeType, &numParams))
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003019 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003020
3021 if (numParams == 0)
3022 return; // it is known that the pname is valid, but there are no parameters to return
3023
3024 if (nativeType == GL_FLOAT)
3025 {
3026 GLfloat *floatParams = NULL;
3027 floatParams = new GLfloat[numParams];
3028
3029 context->getFloatv(pname, floatParams);
3030
3031 for (unsigned int i = 0; i < numParams; ++i)
3032 {
3033 if (floatParams[i] == 0.0f)
3034 params[i] = GL_FALSE;
3035 else
3036 params[i] = GL_TRUE;
3037 }
3038
3039 delete [] floatParams;
3040 }
3041 else if (nativeType == GL_INT)
3042 {
3043 GLint *intParams = NULL;
3044 intParams = new GLint[numParams];
3045
3046 context->getIntegerv(pname, intParams);
3047
3048 for (unsigned int i = 0; i < numParams; ++i)
3049 {
3050 if (intParams[i] == 0)
3051 params[i] = GL_FALSE;
3052 else
3053 params[i] = GL_TRUE;
3054 }
3055
3056 delete [] intParams;
3057 }
3058 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003059 }
3060 }
3061 catch(std::bad_alloc&)
3062 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003063 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003064 }
3065}
3066
3067void __stdcall glGetBufferParameteriv(GLenum target, GLenum pname, GLint* params)
3068{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003069 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLint* params = 0x%0.8p)", target, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003070
3071 try
3072 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003073 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comaa0ccbd2010-04-15 20:45:05 +00003074
3075 if (context)
3076 {
3077 gl::Buffer *buffer;
3078
3079 switch (target)
3080 {
3081 case GL_ARRAY_BUFFER:
3082 buffer = context->getArrayBuffer();
3083 break;
3084 case GL_ELEMENT_ARRAY_BUFFER:
3085 buffer = context->getElementArrayBuffer();
3086 break;
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003087 default: return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comaa0ccbd2010-04-15 20:45:05 +00003088 }
3089
3090 if (!buffer)
3091 {
3092 // A null buffer means that "0" is bound to the requested buffer target
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003093 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comaa0ccbd2010-04-15 20:45:05 +00003094 }
3095
3096 switch (pname)
3097 {
3098 case GL_BUFFER_USAGE:
3099 *params = buffer->usage();
3100 break;
3101 case GL_BUFFER_SIZE:
3102 *params = buffer->size();
3103 break;
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003104 default: return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comaa0ccbd2010-04-15 20:45:05 +00003105 }
3106 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003107 }
3108 catch(std::bad_alloc&)
3109 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003110 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003111 }
3112}
3113
3114GLenum __stdcall glGetError(void)
3115{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003116 EVENT("()");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003117
3118 gl::Context *context = gl::getContext();
3119
3120 if (context)
3121 {
daniel@transgaming.com82b28912011-12-12 21:01:35 +00003122 return context->getError();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003123 }
3124
3125 return GL_NO_ERROR;
3126}
3127
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00003128void __stdcall glGetFenceivNV(GLuint fence, GLenum pname, GLint *params)
3129{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003130 EVENT("(GLuint fence = %d, GLenum pname = 0x%X, GLint *params = 0x%0.8p)", fence, pname, params);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00003131
3132 try
3133 {
3134
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003135 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00003136
3137 if (context)
3138 {
3139 gl::Fence *fenceObject = context->getFence(fence);
3140
3141 if (fenceObject == NULL)
3142 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003143 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00003144 }
3145
3146 fenceObject->getFenceiv(pname, params);
3147 }
3148 }
3149 catch(std::bad_alloc&)
3150 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003151 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00003152 }
3153}
3154
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003155void __stdcall glGetFloatv(GLenum pname, GLfloat* params)
3156{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003157 EVENT("(GLenum pname = 0x%X, GLfloat* params = 0x%0.8p)", pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003158
3159 try
3160 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003161 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com32e58cd2010-03-24 09:44:10 +00003162
3163 if (context)
3164 {
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003165 if (!(context->getFloatv(pname, params)))
daniel@transgaming.com32e58cd2010-03-24 09:44:10 +00003166 {
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003167 GLenum nativeType;
3168 unsigned int numParams = 0;
3169 if (!context->getQueryParameterInfo(pname, &nativeType, &numParams))
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003170 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003171
3172 if (numParams == 0)
3173 return; // it is known that the pname is valid, but that there are no parameters to return.
3174
3175 if (nativeType == GL_BOOL)
3176 {
3177 GLboolean *boolParams = NULL;
3178 boolParams = new GLboolean[numParams];
3179
3180 context->getBooleanv(pname, boolParams);
3181
3182 for (unsigned int i = 0; i < numParams; ++i)
3183 {
3184 if (boolParams[i] == GL_FALSE)
3185 params[i] = 0.0f;
3186 else
3187 params[i] = 1.0f;
3188 }
3189
3190 delete [] boolParams;
3191 }
3192 else if (nativeType == GL_INT)
3193 {
3194 GLint *intParams = NULL;
3195 intParams = new GLint[numParams];
3196
3197 context->getIntegerv(pname, intParams);
3198
3199 for (unsigned int i = 0; i < numParams; ++i)
3200 {
3201 params[i] = (GLfloat)intParams[i];
3202 }
3203
3204 delete [] intParams;
3205 }
daniel@transgaming.com32e58cd2010-03-24 09:44:10 +00003206 }
3207 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003208 }
3209 catch(std::bad_alloc&)
3210 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003211 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003212 }
3213}
3214
3215void __stdcall glGetFramebufferAttachmentParameteriv(GLenum target, GLenum attachment, GLenum pname, GLint* params)
3216{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003217 EVENT("(GLenum target = 0x%X, GLenum attachment = 0x%X, GLenum pname = 0x%X, GLint* params = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00003218 target, attachment, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003219
3220 try
3221 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003222 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003223
3224 if (context)
3225 {
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00003226 if (target != GL_FRAMEBUFFER && target != GL_DRAW_FRAMEBUFFER_ANGLE && target != GL_READ_FRAMEBUFFER_ANGLE)
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003227 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003228 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003229 }
3230
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00003231 gl::Framebuffer *framebuffer = NULL;
3232 if (target == GL_READ_FRAMEBUFFER_ANGLE)
3233 {
3234 if(context->getReadFramebufferHandle() == 0)
3235 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003236 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00003237 }
3238
3239 framebuffer = context->getReadFramebuffer();
3240 }
3241 else
3242 {
3243 if (context->getDrawFramebufferHandle() == 0)
3244 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003245 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00003246 }
3247
3248 framebuffer = context->getDrawFramebuffer();
3249 }
3250
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003251 GLenum attachmentType;
3252 GLuint attachmentHandle;
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00003253
3254 if (attachment >= GL_COLOR_ATTACHMENT0_EXT && attachment <= GL_COLOR_ATTACHMENT15_EXT)
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003255 {
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00003256 const unsigned int colorAttachment = (attachment - GL_COLOR_ATTACHMENT0_EXT);
3257
3258 if (colorAttachment >= context->getMaximumRenderTargets())
3259 {
3260 return gl::error(GL_INVALID_ENUM);
3261 }
3262
3263 attachmentType = framebuffer->getColorbufferType(colorAttachment);
3264 attachmentHandle = framebuffer->getColorbufferHandle(colorAttachment);
3265 }
3266 else
3267 {
3268 switch (attachment)
3269 {
3270 case GL_DEPTH_ATTACHMENT:
3271 attachmentType = framebuffer->getDepthbufferType();
3272 attachmentHandle = framebuffer->getDepthbufferHandle();
3273 break;
3274 case GL_STENCIL_ATTACHMENT:
3275 attachmentType = framebuffer->getStencilbufferType();
3276 attachmentHandle = framebuffer->getStencilbufferHandle();
3277 break;
3278 default: return gl::error(GL_INVALID_ENUM);
3279 }
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003280 }
3281
3282 GLenum attachmentObjectType; // Type category
daniel@transgaming.comfbc09532010-04-26 15:33:41 +00003283 if (attachmentType == GL_NONE || attachmentType == GL_RENDERBUFFER)
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003284 {
3285 attachmentObjectType = attachmentType;
3286 }
apatrick@chromium.org551022e2012-01-23 19:56:54 +00003287 else if (gl::IsInternalTextureTarget(attachmentType))
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003288 {
3289 attachmentObjectType = GL_TEXTURE;
3290 }
apatrick@chromium.orga1d80592012-01-25 21:52:10 +00003291 else
3292 {
3293 UNREACHABLE();
3294 return;
3295 }
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003296
3297 switch (pname)
3298 {
3299 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE:
3300 *params = attachmentObjectType;
3301 break;
3302 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME:
3303 if (attachmentObjectType == GL_RENDERBUFFER || attachmentObjectType == GL_TEXTURE)
3304 {
3305 *params = attachmentHandle;
3306 }
3307 else
3308 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003309 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003310 }
3311 break;
3312 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL:
3313 if (attachmentObjectType == GL_TEXTURE)
3314 {
3315 *params = 0; // FramebufferTexture2D will not allow level to be set to anything else in GL ES 2.0
3316 }
3317 else
3318 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003319 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003320 }
3321 break;
3322 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE:
3323 if (attachmentObjectType == GL_TEXTURE)
3324 {
daniel@transgaming.com19ffc242010-05-04 03:35:21 +00003325 if (gl::IsCubemapTextureTarget(attachmentType))
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003326 {
3327 *params = attachmentType;
3328 }
3329 else
3330 {
3331 *params = 0;
3332 }
3333 }
3334 else
3335 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003336 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003337 }
3338 break;
3339 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003340 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003341 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003342 }
3343 }
3344 catch(std::bad_alloc&)
3345 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003346 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003347 }
3348}
3349
daniel@transgaming.com17f548c2011-11-09 17:47:02 +00003350GLenum __stdcall glGetGraphicsResetStatusEXT(void)
3351{
3352 EVENT("()");
3353
3354 try
3355 {
3356 gl::Context *context = gl::getContext();
3357
3358 if (context)
3359 {
3360 return context->getResetStatus();
3361 }
3362
3363 return GL_NO_ERROR;
3364 }
3365 catch(std::bad_alloc&)
3366 {
3367 return GL_OUT_OF_MEMORY;
3368 }
3369}
3370
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003371void __stdcall glGetIntegerv(GLenum pname, GLint* params)
3372{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003373 EVENT("(GLenum pname = 0x%X, GLint* params = 0x%0.8p)", pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003374
3375 try
3376 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003377 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003378
3379 if (context)
3380 {
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003381 if (!(context->getIntegerv(pname, params)))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003382 {
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003383 GLenum nativeType;
3384 unsigned int numParams = 0;
3385 if (!context->getQueryParameterInfo(pname, &nativeType, &numParams))
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003386 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003387
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003388 if (numParams == 0)
3389 return; // it is known that pname is valid, but there are no parameters to return
3390
3391 if (nativeType == GL_BOOL)
3392 {
3393 GLboolean *boolParams = NULL;
3394 boolParams = new GLboolean[numParams];
3395
3396 context->getBooleanv(pname, boolParams);
3397
3398 for (unsigned int i = 0; i < numParams; ++i)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003399 {
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003400 if (boolParams[i] == GL_FALSE)
3401 params[i] = 0;
3402 else
3403 params[i] = 1;
3404 }
3405
3406 delete [] boolParams;
3407 }
3408 else if (nativeType == GL_FLOAT)
3409 {
3410 GLfloat *floatParams = NULL;
3411 floatParams = new GLfloat[numParams];
3412
3413 context->getFloatv(pname, floatParams);
3414
3415 for (unsigned int i = 0; i < numParams; ++i)
3416 {
daniel@transgaming.comc1641352010-04-26 15:33:36 +00003417 if (pname == GL_DEPTH_RANGE || pname == GL_COLOR_CLEAR_VALUE || pname == GL_DEPTH_CLEAR_VALUE || pname == GL_BLEND_COLOR)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003418 {
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003419 params[i] = (GLint)(((GLfloat)(0xFFFFFFFF) * floatParams[i] - 1.0f) / 2.0f);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003420 }
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003421 else
3422 params[i] = (GLint)(floatParams[i] > 0.0f ? floor(floatParams[i] + 0.5) : ceil(floatParams[i] - 0.5));
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003423 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003424
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003425 delete [] floatParams;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003426 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003427 }
3428 }
3429 }
3430 catch(std::bad_alloc&)
3431 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003432 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003433 }
3434}
3435
3436void __stdcall glGetProgramiv(GLuint program, GLenum pname, GLint* params)
3437{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003438 EVENT("(GLuint program = %d, GLenum pname = %d, GLint* params = 0x%0.8p)", program, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003439
3440 try
3441 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003442 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003443
3444 if (context)
3445 {
3446 gl::Program *programObject = context->getProgram(program);
3447
3448 if (!programObject)
3449 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003450 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003451 }
3452
3453 switch (pname)
3454 {
3455 case GL_DELETE_STATUS:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003456 *params = programObject->isFlaggedForDeletion();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003457 return;
3458 case GL_LINK_STATUS:
daniel@transgaming.com716056c2012-07-24 18:38:59 +00003459 *params = programObject->isLinked();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003460 return;
3461 case GL_VALIDATE_STATUS:
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00003462 *params = programObject->isValidated();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003463 return;
3464 case GL_INFO_LOG_LENGTH:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003465 *params = programObject->getInfoLogLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003466 return;
3467 case GL_ATTACHED_SHADERS:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003468 *params = programObject->getAttachedShadersCount();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003469 return;
3470 case GL_ACTIVE_ATTRIBUTES:
daniel@transgaming.com85423182010-04-22 13:35:27 +00003471 *params = programObject->getActiveAttributeCount();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003472 return;
3473 case GL_ACTIVE_ATTRIBUTE_MAX_LENGTH:
daniel@transgaming.com85423182010-04-22 13:35:27 +00003474 *params = programObject->getActiveAttributeMaxLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003475 return;
3476 case GL_ACTIVE_UNIFORMS:
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00003477 *params = programObject->getActiveUniformCount();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003478 return;
3479 case GL_ACTIVE_UNIFORM_MAX_LENGTH:
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00003480 *params = programObject->getActiveUniformMaxLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003481 return;
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00003482 case GL_PROGRAM_BINARY_LENGTH_OES:
apatrick@chromium.org90080e32012-07-09 22:15:33 +00003483 *params = programObject->getProgramBinaryLength();
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00003484 return;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003485 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003486 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003487 }
3488 }
3489 }
3490 catch(std::bad_alloc&)
3491 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003492 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003493 }
3494}
3495
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00003496void __stdcall glGetProgramInfoLog(GLuint program, GLsizei bufsize, GLsizei* length, GLchar* infolog)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003497{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003498 EVENT("(GLuint program = %d, GLsizei bufsize = %d, GLsizei* length = 0x%0.8p, GLchar* infolog = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00003499 program, bufsize, length, infolog);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003500
3501 try
3502 {
3503 if (bufsize < 0)
3504 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003505 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003506 }
3507
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003508 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003509
3510 if (context)
3511 {
3512 gl::Program *programObject = context->getProgram(program);
3513
3514 if (!programObject)
3515 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003516 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003517 }
3518
3519 programObject->getInfoLog(bufsize, length, infolog);
3520 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003521 }
3522 catch(std::bad_alloc&)
3523 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003524 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003525 }
3526}
3527
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003528void __stdcall glGetQueryivEXT(GLenum target, GLenum pname, GLint *params)
3529{
3530 EVENT("GLenum target = 0x%X, GLenum pname = 0x%X, GLint *params = 0x%0.8p)", target, pname, params);
3531
3532 try
3533 {
3534 switch (pname)
3535 {
3536 case GL_CURRENT_QUERY_EXT:
3537 break;
3538 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003539 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003540 }
3541
3542 gl::Context *context = gl::getNonLostContext();
3543
3544 if (context)
3545 {
3546 params[0] = context->getActiveQuery(target);
3547 }
3548 }
3549 catch(std::bad_alloc&)
3550 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003551 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003552 }
3553}
3554
3555void __stdcall glGetQueryObjectuivEXT(GLuint id, GLenum pname, GLuint *params)
3556{
3557 EVENT("(GLuint id = %d, GLenum pname = 0x%X, GLuint *params = 0x%0.8p)", id, pname, params);
3558
3559 try
3560 {
3561 switch (pname)
3562 {
3563 case GL_QUERY_RESULT_EXT:
3564 case GL_QUERY_RESULT_AVAILABLE_EXT:
3565 break;
3566 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003567 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003568 }
3569 gl::Context *context = gl::getNonLostContext();
3570
3571 if (context)
3572 {
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003573 gl::Query *queryObject = context->getQuery(id, false, GL_NONE);
3574
3575 if (!queryObject)
3576 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003577 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003578 }
3579
3580 if (context->getActiveQuery(queryObject->getType()) == id)
3581 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003582 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003583 }
3584
3585 switch(pname)
3586 {
3587 case GL_QUERY_RESULT_EXT:
3588 params[0] = queryObject->getResult();
3589 break;
3590 case GL_QUERY_RESULT_AVAILABLE_EXT:
3591 params[0] = queryObject->isResultAvailable();
3592 break;
3593 default:
3594 ASSERT(false);
3595 }
3596 }
3597 }
3598 catch(std::bad_alloc&)
3599 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003600 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003601 }
3602}
3603
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003604void __stdcall glGetRenderbufferParameteriv(GLenum target, GLenum pname, GLint* params)
3605{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003606 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLint* params = 0x%0.8p)", target, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003607
3608 try
3609 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003610 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003611
3612 if (context)
3613 {
3614 if (target != GL_RENDERBUFFER)
3615 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003616 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003617 }
3618
daniel@transgaming.com428d1582010-05-04 03:35:25 +00003619 if (context->getRenderbufferHandle() == 0)
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003620 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003621 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003622 }
3623
daniel@transgaming.com428d1582010-05-04 03:35:25 +00003624 gl::Renderbuffer *renderbuffer = context->getRenderbuffer(context->getRenderbufferHandle());
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003625
3626 switch (pname)
3627 {
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +00003628 case GL_RENDERBUFFER_WIDTH: *params = renderbuffer->getWidth(); break;
3629 case GL_RENDERBUFFER_HEIGHT: *params = renderbuffer->getHeight(); break;
3630 case GL_RENDERBUFFER_INTERNAL_FORMAT: *params = renderbuffer->getInternalFormat(); break;
3631 case GL_RENDERBUFFER_RED_SIZE: *params = renderbuffer->getRedSize(); break;
3632 case GL_RENDERBUFFER_GREEN_SIZE: *params = renderbuffer->getGreenSize(); break;
3633 case GL_RENDERBUFFER_BLUE_SIZE: *params = renderbuffer->getBlueSize(); break;
3634 case GL_RENDERBUFFER_ALPHA_SIZE: *params = renderbuffer->getAlphaSize(); break;
3635 case GL_RENDERBUFFER_DEPTH_SIZE: *params = renderbuffer->getDepthSize(); break;
3636 case GL_RENDERBUFFER_STENCIL_SIZE: *params = renderbuffer->getStencilSize(); break;
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00003637 case GL_RENDERBUFFER_SAMPLES_ANGLE:
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +00003638 if (context->getMaxSupportedSamples() != 0)
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00003639 {
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +00003640 *params = renderbuffer->getSamples();
3641 }
3642 else
3643 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003644 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00003645 }
3646 break;
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003647 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003648 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003649 }
3650 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003651 }
3652 catch(std::bad_alloc&)
3653 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003654 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003655 }
3656}
3657
3658void __stdcall glGetShaderiv(GLuint shader, GLenum pname, GLint* params)
3659{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003660 EVENT("(GLuint shader = %d, GLenum pname = %d, GLint* params = 0x%0.8p)", shader, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003661
3662 try
3663 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003664 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003665
3666 if (context)
3667 {
3668 gl::Shader *shaderObject = context->getShader(shader);
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00003669
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003670 if (!shaderObject)
3671 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003672 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003673 }
3674
3675 switch (pname)
3676 {
3677 case GL_SHADER_TYPE:
3678 *params = shaderObject->getType();
3679 return;
3680 case GL_DELETE_STATUS:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003681 *params = shaderObject->isFlaggedForDeletion();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003682 return;
3683 case GL_COMPILE_STATUS:
3684 *params = shaderObject->isCompiled() ? GL_TRUE : GL_FALSE;
3685 return;
3686 case GL_INFO_LOG_LENGTH:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003687 *params = shaderObject->getInfoLogLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003688 return;
3689 case GL_SHADER_SOURCE_LENGTH:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003690 *params = shaderObject->getSourceLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003691 return;
zmo@google.coma574f782011-10-03 21:45:23 +00003692 case GL_TRANSLATED_SHADER_SOURCE_LENGTH_ANGLE:
3693 *params = shaderObject->getTranslatedSourceLength();
3694 return;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003695 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003696 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003697 }
3698 }
3699 }
3700 catch(std::bad_alloc&)
3701 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003702 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003703 }
3704}
3705
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00003706void __stdcall glGetShaderInfoLog(GLuint shader, GLsizei bufsize, GLsizei* length, GLchar* infolog)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003707{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003708 EVENT("(GLuint shader = %d, GLsizei bufsize = %d, GLsizei* length = 0x%0.8p, GLchar* infolog = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00003709 shader, bufsize, length, infolog);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003710
3711 try
3712 {
3713 if (bufsize < 0)
3714 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003715 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003716 }
3717
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003718 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003719
3720 if (context)
3721 {
3722 gl::Shader *shaderObject = context->getShader(shader);
3723
3724 if (!shaderObject)
3725 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003726 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003727 }
3728
3729 shaderObject->getInfoLog(bufsize, length, infolog);
3730 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003731 }
3732 catch(std::bad_alloc&)
3733 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003734 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003735 }
3736}
3737
3738void __stdcall glGetShaderPrecisionFormat(GLenum shadertype, GLenum precisiontype, GLint* range, GLint* precision)
3739{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003740 EVENT("(GLenum shadertype = 0x%X, GLenum precisiontype = 0x%X, GLint* range = 0x%0.8p, GLint* precision = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00003741 shadertype, precisiontype, range, precision);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003742
3743 try
3744 {
daniel@transgaming.com6c785212010-03-30 03:36:17 +00003745 switch (shadertype)
3746 {
3747 case GL_VERTEX_SHADER:
3748 case GL_FRAGMENT_SHADER:
3749 break;
3750 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003751 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com6c785212010-03-30 03:36:17 +00003752 }
3753
3754 switch (precisiontype)
3755 {
3756 case GL_LOW_FLOAT:
3757 case GL_MEDIUM_FLOAT:
3758 case GL_HIGH_FLOAT:
3759 // Assume IEEE 754 precision
3760 range[0] = 127;
3761 range[1] = 127;
daniel@transgaming.comc5c15382010-04-23 18:34:49 +00003762 *precision = 23;
daniel@transgaming.com6c785212010-03-30 03:36:17 +00003763 break;
3764 case GL_LOW_INT:
3765 case GL_MEDIUM_INT:
3766 case GL_HIGH_INT:
3767 // Some (most) hardware only supports single-precision floating-point numbers,
3768 // which can accurately represent integers up to +/-16777216
3769 range[0] = 24;
3770 range[1] = 24;
daniel@transgaming.comc5c15382010-04-23 18:34:49 +00003771 *precision = 0;
daniel@transgaming.com6c785212010-03-30 03:36:17 +00003772 break;
3773 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003774 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com6c785212010-03-30 03:36:17 +00003775 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003776 }
3777 catch(std::bad_alloc&)
3778 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003779 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003780 }
3781}
3782
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00003783void __stdcall glGetShaderSource(GLuint shader, GLsizei bufsize, GLsizei* length, GLchar* source)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003784{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003785 EVENT("(GLuint shader = %d, GLsizei bufsize = %d, GLsizei* length = 0x%0.8p, GLchar* source = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00003786 shader, bufsize, length, source);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003787
3788 try
3789 {
3790 if (bufsize < 0)
3791 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003792 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003793 }
3794
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003795 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003796
3797 if (context)
3798 {
3799 gl::Shader *shaderObject = context->getShader(shader);
3800
3801 if (!shaderObject)
3802 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003803 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003804 }
3805
3806 shaderObject->getSource(bufsize, length, source);
3807 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003808 }
3809 catch(std::bad_alloc&)
3810 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003811 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003812 }
3813}
3814
zmo@google.coma574f782011-10-03 21:45:23 +00003815void __stdcall glGetTranslatedShaderSourceANGLE(GLuint shader, GLsizei bufsize, GLsizei* length, GLchar* source)
3816{
3817 EVENT("(GLuint shader = %d, GLsizei bufsize = %d, GLsizei* length = 0x%0.8p, GLchar* source = 0x%0.8p)",
3818 shader, bufsize, length, source);
3819
3820 try
3821 {
3822 if (bufsize < 0)
3823 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003824 return gl::error(GL_INVALID_VALUE);
zmo@google.coma574f782011-10-03 21:45:23 +00003825 }
3826
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003827 gl::Context *context = gl::getNonLostContext();
zmo@google.coma574f782011-10-03 21:45:23 +00003828
3829 if (context)
3830 {
3831 gl::Shader *shaderObject = context->getShader(shader);
3832
3833 if (!shaderObject)
3834 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003835 return gl::error(GL_INVALID_OPERATION);
zmo@google.coma574f782011-10-03 21:45:23 +00003836 }
3837
3838 shaderObject->getTranslatedSource(bufsize, length, source);
3839 }
3840 }
3841 catch(std::bad_alloc&)
3842 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003843 return gl::error(GL_OUT_OF_MEMORY);
zmo@google.coma574f782011-10-03 21:45:23 +00003844 }
3845}
3846
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003847const GLubyte* __stdcall glGetString(GLenum name)
3848{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003849 EVENT("(GLenum name = 0x%X)", name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003850
3851 try
3852 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003853 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com3e4c6002010-05-05 18:50:13 +00003854
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003855 switch (name)
3856 {
3857 case GL_VENDOR:
daniel@transgaming.coma0ce7e62011-01-25 14:47:16 +00003858 return (GLubyte*)"Google Inc.";
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003859 case GL_RENDERER:
daniel@transgaming.comc23ff642011-08-16 20:28:45 +00003860 return (GLubyte*)((context != NULL) ? context->getRendererString() : "ANGLE");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003861 case GL_VERSION:
daniel@transgaming.com1825d8e2012-08-27 16:25:29 +00003862 return (GLubyte*)"OpenGL ES 2.0 (ANGLE " VERSION_STRING ")";
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003863 case GL_SHADING_LANGUAGE_VERSION:
daniel@transgaming.com1825d8e2012-08-27 16:25:29 +00003864 return (GLubyte*)"OpenGL ES GLSL ES 1.00 (ANGLE " VERSION_STRING ")";
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003865 case GL_EXTENSIONS:
daniel@transgaming.com3e4c6002010-05-05 18:50:13 +00003866 return (GLubyte*)((context != NULL) ? context->getExtensionString() : "");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003867 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003868 return gl::error(GL_INVALID_ENUM, (GLubyte*)NULL);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003869 }
3870 }
3871 catch(std::bad_alloc&)
3872 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003873 return gl::error(GL_OUT_OF_MEMORY, (GLubyte*)NULL);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003874 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003875}
3876
3877void __stdcall glGetTexParameterfv(GLenum target, GLenum pname, GLfloat* params)
3878{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003879 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLfloat* params = 0x%0.8p)", target, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003880
3881 try
3882 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003883 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003884
3885 if (context)
3886 {
3887 gl::Texture *texture;
3888
3889 switch (target)
3890 {
3891 case GL_TEXTURE_2D:
3892 texture = context->getTexture2D();
3893 break;
3894 case GL_TEXTURE_CUBE_MAP:
3895 texture = context->getTextureCubeMap();
3896 break;
3897 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003898 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003899 }
3900
3901 switch (pname)
3902 {
3903 case GL_TEXTURE_MAG_FILTER:
3904 *params = (GLfloat)texture->getMagFilter();
3905 break;
3906 case GL_TEXTURE_MIN_FILTER:
3907 *params = (GLfloat)texture->getMinFilter();
3908 break;
3909 case GL_TEXTURE_WRAP_S:
3910 *params = (GLfloat)texture->getWrapS();
3911 break;
3912 case GL_TEXTURE_WRAP_T:
3913 *params = (GLfloat)texture->getWrapT();
3914 break;
daniel@transgaming.comd30bd0a2011-11-11 04:10:34 +00003915 case GL_TEXTURE_IMMUTABLE_FORMAT_EXT:
3916 *params = (GLfloat)(texture->isImmutable() ? GL_TRUE : GL_FALSE);
3917 break;
daniel@transgaming.com7d18c172011-11-11 04:18:21 +00003918 case GL_TEXTURE_USAGE_ANGLE:
3919 *params = (GLfloat)texture->getUsage();
3920 break;
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00003921 case GL_TEXTURE_MAX_ANISOTROPY_EXT:
3922 if (!context->supportsTextureFilterAnisotropy())
3923 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003924 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00003925 }
3926 *params = (GLfloat)texture->getMaxAnisotropy();
3927 break;
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003928 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003929 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003930 }
3931 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003932 }
3933 catch(std::bad_alloc&)
3934 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003935 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003936 }
3937}
3938
3939void __stdcall glGetTexParameteriv(GLenum target, GLenum pname, GLint* params)
3940{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003941 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLint* params = 0x%0.8p)", target, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003942
3943 try
3944 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003945 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003946
3947 if (context)
3948 {
3949 gl::Texture *texture;
3950
3951 switch (target)
3952 {
3953 case GL_TEXTURE_2D:
3954 texture = context->getTexture2D();
3955 break;
3956 case GL_TEXTURE_CUBE_MAP:
3957 texture = context->getTextureCubeMap();
3958 break;
3959 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003960 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003961 }
3962
3963 switch (pname)
3964 {
3965 case GL_TEXTURE_MAG_FILTER:
3966 *params = texture->getMagFilter();
3967 break;
3968 case GL_TEXTURE_MIN_FILTER:
3969 *params = texture->getMinFilter();
3970 break;
3971 case GL_TEXTURE_WRAP_S:
3972 *params = texture->getWrapS();
3973 break;
3974 case GL_TEXTURE_WRAP_T:
3975 *params = texture->getWrapT();
3976 break;
daniel@transgaming.comd30bd0a2011-11-11 04:10:34 +00003977 case GL_TEXTURE_IMMUTABLE_FORMAT_EXT:
3978 *params = texture->isImmutable() ? GL_TRUE : GL_FALSE;
3979 break;
daniel@transgaming.com7d18c172011-11-11 04:18:21 +00003980 case GL_TEXTURE_USAGE_ANGLE:
3981 *params = texture->getUsage();
3982 break;
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00003983 case GL_TEXTURE_MAX_ANISOTROPY_EXT:
3984 if (!context->supportsTextureFilterAnisotropy())
3985 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003986 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00003987 }
3988 *params = (GLint)texture->getMaxAnisotropy();
3989 break;
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003990 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003991 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003992 }
3993 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003994 }
3995 catch(std::bad_alloc&)
3996 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003997 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003998 }
3999}
4000
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004001void __stdcall glGetnUniformfvEXT(GLuint program, GLint location, GLsizei bufSize, GLfloat* params)
4002{
4003 EVENT("(GLuint program = %d, GLint location = %d, GLsizei bufSize = %d, GLfloat* params = 0x%0.8p)",
4004 program, location, bufSize, params);
4005
4006 try
4007 {
4008 if (bufSize < 0)
4009 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004010 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004011 }
4012
4013 gl::Context *context = gl::getNonLostContext();
4014
4015 if (context)
4016 {
4017 if (program == 0)
4018 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004019 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004020 }
4021
4022 gl::Program *programObject = context->getProgram(program);
4023
daniel@transgaming.com716056c2012-07-24 18:38:59 +00004024 if (!programObject || !programObject->isLinked())
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004025 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004026 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004027 }
4028
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00004029 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
4030 if (!programBinary)
4031 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004032 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00004033 }
4034
4035 if (!programBinary->getUniformfv(location, &bufSize, params))
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004036 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004037 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004038 }
4039 }
4040 }
4041 catch(std::bad_alloc&)
4042 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004043 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004044 }
4045}
4046
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004047void __stdcall glGetUniformfv(GLuint program, GLint location, GLfloat* params)
4048{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004049 EVENT("(GLuint program = %d, GLint location = %d, GLfloat* params = 0x%0.8p)", program, location, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004050
4051 try
4052 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004053 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004054
4055 if (context)
4056 {
4057 if (program == 0)
4058 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004059 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004060 }
4061
4062 gl::Program *programObject = context->getProgram(program);
4063
daniel@transgaming.com716056c2012-07-24 18:38:59 +00004064 if (!programObject || !programObject->isLinked())
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004065 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004066 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004067 }
4068
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00004069 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
4070 if (!programBinary)
4071 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004072 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00004073 }
4074
4075 if (!programBinary->getUniformfv(location, NULL, params))
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004076 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004077 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004078 }
4079 }
4080 }
4081 catch(std::bad_alloc&)
4082 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004083 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004084 }
4085}
4086
4087void __stdcall glGetnUniformivEXT(GLuint program, GLint location, GLsizei bufSize, GLint* params)
4088{
4089 EVENT("(GLuint program = %d, GLint location = %d, GLsizei bufSize = %d, GLint* params = 0x%0.8p)",
4090 program, location, bufSize, params);
4091
4092 try
4093 {
4094 if (bufSize < 0)
4095 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004096 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004097 }
4098
4099 gl::Context *context = gl::getNonLostContext();
4100
4101 if (context)
4102 {
4103 if (program == 0)
4104 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004105 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004106 }
4107
4108 gl::Program *programObject = context->getProgram(program);
4109
daniel@transgaming.com716056c2012-07-24 18:38:59 +00004110 if (!programObject || !programObject->isLinked())
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004111 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004112 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004113 }
4114
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00004115 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
4116 if (!programBinary)
4117 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004118 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00004119 }
4120
4121 if (!programBinary->getUniformiv(location, &bufSize, params))
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004122 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004123 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004124 }
4125 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004126 }
4127 catch(std::bad_alloc&)
4128 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004129 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004130 }
4131}
4132
4133void __stdcall glGetUniformiv(GLuint program, GLint location, GLint* params)
4134{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004135 EVENT("(GLuint program = %d, GLint location = %d, GLint* params = 0x%0.8p)", program, location, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004136
4137 try
4138 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004139 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004140
4141 if (context)
4142 {
4143 if (program == 0)
4144 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004145 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004146 }
4147
4148 gl::Program *programObject = context->getProgram(program);
4149
daniel@transgaming.com716056c2012-07-24 18:38:59 +00004150 if (!programObject || !programObject->isLinked())
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004151 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004152 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004153 }
4154
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00004155 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
4156 if (!programBinary)
4157 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004158 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00004159 }
4160
4161 if (!programBinary->getUniformiv(location, NULL, params))
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004162 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004163 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004164 }
4165 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004166 }
4167 catch(std::bad_alloc&)
4168 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004169 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004170 }
4171}
4172
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00004173int __stdcall glGetUniformLocation(GLuint program, const GLchar* name)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004174{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004175 EVENT("(GLuint program = %d, const GLchar* name = 0x%0.8p)", program, name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004176
4177 try
4178 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004179 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004180
4181 if (strstr(name, "gl_") == name)
4182 {
4183 return -1;
4184 }
4185
4186 if (context)
4187 {
4188 gl::Program *programObject = context->getProgram(program);
4189
4190 if (!programObject)
4191 {
daniel@transgaming.comd1abe5b2010-04-13 19:53:33 +00004192 if (context->getShader(program))
4193 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004194 return gl::error(GL_INVALID_OPERATION, -1);
daniel@transgaming.comd1abe5b2010-04-13 19:53:33 +00004195 }
4196 else
4197 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004198 return gl::error(GL_INVALID_VALUE, -1);
daniel@transgaming.comd1abe5b2010-04-13 19:53:33 +00004199 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004200 }
4201
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00004202 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
daniel@transgaming.com716056c2012-07-24 18:38:59 +00004203 if (!programObject->isLinked() || !programBinary)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004204 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004205 return gl::error(GL_INVALID_OPERATION, -1);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004206 }
4207
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00004208 return programBinary->getUniformLocation(name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004209 }
4210 }
4211 catch(std::bad_alloc&)
4212 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004213 return gl::error(GL_OUT_OF_MEMORY, -1);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004214 }
4215
4216 return -1;
4217}
4218
4219void __stdcall glGetVertexAttribfv(GLuint index, GLenum pname, GLfloat* params)
4220{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004221 EVENT("(GLuint index = %d, GLenum pname = 0x%X, GLfloat* params = 0x%0.8p)", index, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004222
4223 try
4224 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004225 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004226
daniel@transgaming.come0078962010-04-15 20:45:08 +00004227 if (context)
4228 {
4229 if (index >= gl::MAX_VERTEX_ATTRIBS)
4230 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004231 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004232 }
4233
daniel@transgaming.com83921382011-01-08 05:46:00 +00004234 const gl::VertexAttribute &attribState = context->getVertexAttribState(index);
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004235
daniel@transgaming.come0078962010-04-15 20:45:08 +00004236 switch (pname)
4237 {
4238 case GL_VERTEX_ATTRIB_ARRAY_ENABLED:
daniel@transgaming.com83921382011-01-08 05:46:00 +00004239 *params = (GLfloat)(attribState.mArrayEnabled ? GL_TRUE : GL_FALSE);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004240 break;
4241 case GL_VERTEX_ATTRIB_ARRAY_SIZE:
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004242 *params = (GLfloat)attribState.mSize;
daniel@transgaming.come0078962010-04-15 20:45:08 +00004243 break;
4244 case GL_VERTEX_ATTRIB_ARRAY_STRIDE:
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004245 *params = (GLfloat)attribState.mStride;
daniel@transgaming.come0078962010-04-15 20:45:08 +00004246 break;
4247 case GL_VERTEX_ATTRIB_ARRAY_TYPE:
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004248 *params = (GLfloat)attribState.mType;
daniel@transgaming.come0078962010-04-15 20:45:08 +00004249 break;
4250 case GL_VERTEX_ATTRIB_ARRAY_NORMALIZED:
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004251 *params = (GLfloat)(attribState.mNormalized ? GL_TRUE : GL_FALSE);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004252 break;
4253 case GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING:
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +00004254 *params = (GLfloat)attribState.mBoundBuffer.id();
daniel@transgaming.come0078962010-04-15 20:45:08 +00004255 break;
4256 case GL_CURRENT_VERTEX_ATTRIB:
4257 for (int i = 0; i < 4; ++i)
4258 {
shannon.woods%transgaming.com@gtempaccount.com3026dc72013-04-13 03:37:27 +00004259 params[i] = attribState.mCurrentValue.FloatValues[i];
daniel@transgaming.come0078962010-04-15 20:45:08 +00004260 }
4261 break;
shannon.woods%transgaming.com@gtempaccount.com14eb55e2013-04-13 03:35:06 +00004262 case GL_VERTEX_ATTRIB_ARRAY_DIVISOR:
4263 // Don't verify ES3 context because GL_VERTEX_ATTRIB_ARRAY_DIVISOR_ANGLE uses
4264 // the same constant.
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00004265 *params = (GLfloat)attribState.mDivisor;
4266 break;
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004267 default: return gl::error(GL_INVALID_ENUM);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004268 }
4269 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004270 }
4271 catch(std::bad_alloc&)
4272 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004273 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004274 }
4275}
4276
4277void __stdcall glGetVertexAttribiv(GLuint index, GLenum pname, GLint* params)
4278{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004279 EVENT("(GLuint index = %d, GLenum pname = 0x%X, GLint* params = 0x%0.8p)", index, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004280
4281 try
4282 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004283 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004284
daniel@transgaming.come0078962010-04-15 20:45:08 +00004285 if (context)
4286 {
4287 if (index >= gl::MAX_VERTEX_ATTRIBS)
4288 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004289 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004290 }
4291
daniel@transgaming.com83921382011-01-08 05:46:00 +00004292 const gl::VertexAttribute &attribState = context->getVertexAttribState(index);
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004293
daniel@transgaming.come0078962010-04-15 20:45:08 +00004294 switch (pname)
4295 {
4296 case GL_VERTEX_ATTRIB_ARRAY_ENABLED:
daniel@transgaming.com83921382011-01-08 05:46:00 +00004297 *params = (attribState.mArrayEnabled ? GL_TRUE : GL_FALSE);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004298 break;
4299 case GL_VERTEX_ATTRIB_ARRAY_SIZE:
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004300 *params = attribState.mSize;
daniel@transgaming.come0078962010-04-15 20:45:08 +00004301 break;
4302 case GL_VERTEX_ATTRIB_ARRAY_STRIDE:
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004303 *params = attribState.mStride;
daniel@transgaming.come0078962010-04-15 20:45:08 +00004304 break;
4305 case GL_VERTEX_ATTRIB_ARRAY_TYPE:
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004306 *params = attribState.mType;
daniel@transgaming.come0078962010-04-15 20:45:08 +00004307 break;
4308 case GL_VERTEX_ATTRIB_ARRAY_NORMALIZED:
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004309 *params = (attribState.mNormalized ? GL_TRUE : GL_FALSE);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004310 break;
4311 case GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING:
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +00004312 *params = attribState.mBoundBuffer.id();
daniel@transgaming.come0078962010-04-15 20:45:08 +00004313 break;
4314 case GL_CURRENT_VERTEX_ATTRIB:
4315 for (int i = 0; i < 4; ++i)
4316 {
shannon.woods%transgaming.com@gtempaccount.com3026dc72013-04-13 03:37:27 +00004317 float currentValue = attribState.mCurrentValue.FloatValues[i];
daniel@transgaming.come0078962010-04-15 20:45:08 +00004318 params[i] = (GLint)(currentValue > 0.0f ? floor(currentValue + 0.5f) : ceil(currentValue - 0.5f));
4319 }
4320 break;
shannon.woods%transgaming.com@gtempaccount.com14eb55e2013-04-13 03:35:06 +00004321 case GL_VERTEX_ATTRIB_ARRAY_DIVISOR:
4322 // Don't verify ES3 context because GL_VERTEX_ATTRIB_ARRAY_DIVISOR_ANGLE uses
4323 // the same constant.
4324 META_ASSERT(GL_VERTEX_ATTRIB_ARRAY_DIVISOR == GL_VERTEX_ATTRIB_ARRAY_DIVISOR_ANGLE);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00004325 *params = (GLint)attribState.mDivisor;
4326 break;
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004327 default: return gl::error(GL_INVALID_ENUM);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004328 }
4329 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004330 }
4331 catch(std::bad_alloc&)
4332 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004333 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004334 }
4335}
4336
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00004337void __stdcall glGetVertexAttribPointerv(GLuint index, GLenum pname, GLvoid** pointer)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004338{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004339 EVENT("(GLuint index = %d, GLenum pname = 0x%X, GLvoid** pointer = 0x%0.8p)", index, pname, pointer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004340
4341 try
4342 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004343 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004344
daniel@transgaming.come0078962010-04-15 20:45:08 +00004345 if (context)
4346 {
4347 if (index >= gl::MAX_VERTEX_ATTRIBS)
4348 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004349 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004350 }
4351
4352 if (pname != GL_VERTEX_ATTRIB_ARRAY_POINTER)
4353 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004354 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004355 }
4356
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004357 *pointer = const_cast<GLvoid*>(context->getVertexAttribPointer(index));
daniel@transgaming.come0078962010-04-15 20:45:08 +00004358 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004359 }
4360 catch(std::bad_alloc&)
4361 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004362 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004363 }
4364}
4365
4366void __stdcall glHint(GLenum target, GLenum mode)
4367{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004368 EVENT("(GLenum target = 0x%X, GLenum mode = 0x%X)", target, mode);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004369
4370 try
4371 {
alokp@chromium.orgd303ef92010-09-09 17:30:15 +00004372 switch (mode)
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00004373 {
alokp@chromium.orgd303ef92010-09-09 17:30:15 +00004374 case GL_FASTEST:
4375 case GL_NICEST:
4376 case GL_DONT_CARE:
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00004377 break;
4378 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004379 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00004380 }
4381
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004382 gl::Context *context = gl::getNonLostContext();
alokp@chromium.orgd303ef92010-09-09 17:30:15 +00004383 switch (target)
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00004384 {
alokp@chromium.orgd303ef92010-09-09 17:30:15 +00004385 case GL_GENERATE_MIPMAP_HINT:
4386 if (context) context->setGenerateMipmapHint(mode);
4387 break;
4388 case GL_FRAGMENT_SHADER_DERIVATIVE_HINT_OES:
4389 if (context) context->setFragmentShaderDerivativeHint(mode);
4390 break;
4391 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004392 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00004393 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004394 }
4395 catch(std::bad_alloc&)
4396 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004397 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004398 }
4399}
4400
4401GLboolean __stdcall glIsBuffer(GLuint buffer)
4402{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004403 EVENT("(GLuint buffer = %d)", buffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004404
4405 try
4406 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004407 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004408
4409 if (context && buffer)
4410 {
4411 gl::Buffer *bufferObject = context->getBuffer(buffer);
4412
4413 if (bufferObject)
4414 {
4415 return GL_TRUE;
4416 }
4417 }
4418 }
4419 catch(std::bad_alloc&)
4420 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004421 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004422 }
4423
4424 return GL_FALSE;
4425}
4426
4427GLboolean __stdcall glIsEnabled(GLenum cap)
4428{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004429 EVENT("(GLenum cap = 0x%X)", cap);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004430
4431 try
4432 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004433 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004434
4435 if (context)
4436 {
4437 switch (cap)
4438 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004439 case GL_CULL_FACE: return context->isCullFaceEnabled();
4440 case GL_POLYGON_OFFSET_FILL: return context->isPolygonOffsetFillEnabled();
4441 case GL_SAMPLE_ALPHA_TO_COVERAGE: return context->isSampleAlphaToCoverageEnabled();
4442 case GL_SAMPLE_COVERAGE: return context->isSampleCoverageEnabled();
4443 case GL_SCISSOR_TEST: return context->isScissorTestEnabled();
4444 case GL_STENCIL_TEST: return context->isStencilTestEnabled();
4445 case GL_DEPTH_TEST: return context->isDepthTestEnabled();
4446 case GL_BLEND: return context->isBlendEnabled();
4447 case GL_DITHER: return context->isDitherEnabled();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004448 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004449 return gl::error(GL_INVALID_ENUM, false);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004450 }
4451 }
4452 }
4453 catch(std::bad_alloc&)
4454 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004455 return gl::error(GL_OUT_OF_MEMORY, false);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004456 }
4457
4458 return false;
4459}
4460
daniel@transgaming.comfe208882010-09-01 15:47:57 +00004461GLboolean __stdcall glIsFenceNV(GLuint fence)
4462{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004463 EVENT("(GLuint fence = %d)", fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004464
4465 try
4466 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004467 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004468
4469 if (context)
4470 {
4471 gl::Fence *fenceObject = context->getFence(fence);
4472
4473 if (fenceObject == NULL)
4474 {
4475 return GL_FALSE;
4476 }
4477
4478 return fenceObject->isFence();
4479 }
4480 }
4481 catch(std::bad_alloc&)
4482 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004483 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004484 }
4485
4486 return GL_FALSE;
daniel@transgaming.comfe208882010-09-01 15:47:57 +00004487}
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004488
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004489GLboolean __stdcall glIsFramebuffer(GLuint framebuffer)
4490{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004491 EVENT("(GLuint framebuffer = %d)", framebuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004492
4493 try
4494 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004495 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004496
4497 if (context && framebuffer)
4498 {
4499 gl::Framebuffer *framebufferObject = context->getFramebuffer(framebuffer);
4500
4501 if (framebufferObject)
4502 {
4503 return GL_TRUE;
4504 }
4505 }
4506 }
4507 catch(std::bad_alloc&)
4508 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004509 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004510 }
4511
4512 return GL_FALSE;
4513}
4514
4515GLboolean __stdcall glIsProgram(GLuint program)
4516{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004517 EVENT("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004518
4519 try
4520 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004521 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004522
4523 if (context && program)
4524 {
4525 gl::Program *programObject = context->getProgram(program);
4526
4527 if (programObject)
4528 {
4529 return GL_TRUE;
4530 }
4531 }
4532 }
4533 catch(std::bad_alloc&)
4534 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004535 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004536 }
4537
4538 return GL_FALSE;
4539}
4540
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00004541GLboolean __stdcall glIsQueryEXT(GLuint id)
4542{
4543 EVENT("(GLuint id = %d)", id);
4544
4545 try
4546 {
4547 if (id == 0)
4548 {
4549 return GL_FALSE;
4550 }
4551
4552 gl::Context *context = gl::getNonLostContext();
4553
4554 if (context)
4555 {
4556 gl::Query *queryObject = context->getQuery(id, false, GL_NONE);
4557
4558 if (queryObject)
4559 {
4560 return GL_TRUE;
4561 }
4562 }
4563 }
4564 catch(std::bad_alloc&)
4565 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004566 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00004567 }
4568
4569 return GL_FALSE;
4570}
4571
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004572GLboolean __stdcall glIsRenderbuffer(GLuint renderbuffer)
4573{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004574 EVENT("(GLuint renderbuffer = %d)", renderbuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004575
4576 try
4577 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004578 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004579
4580 if (context && renderbuffer)
4581 {
4582 gl::Renderbuffer *renderbufferObject = context->getRenderbuffer(renderbuffer);
4583
4584 if (renderbufferObject)
4585 {
4586 return GL_TRUE;
4587 }
4588 }
4589 }
4590 catch(std::bad_alloc&)
4591 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004592 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004593 }
4594
4595 return GL_FALSE;
4596}
4597
4598GLboolean __stdcall glIsShader(GLuint shader)
4599{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004600 EVENT("(GLuint shader = %d)", shader);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004601
4602 try
4603 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004604 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004605
4606 if (context && shader)
4607 {
4608 gl::Shader *shaderObject = context->getShader(shader);
4609
4610 if (shaderObject)
4611 {
4612 return GL_TRUE;
4613 }
4614 }
4615 }
4616 catch(std::bad_alloc&)
4617 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004618 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004619 }
4620
4621 return GL_FALSE;
4622}
4623
4624GLboolean __stdcall glIsTexture(GLuint texture)
4625{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004626 EVENT("(GLuint texture = %d)", texture);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004627
4628 try
4629 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004630 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004631
4632 if (context && texture)
4633 {
4634 gl::Texture *textureObject = context->getTexture(texture);
4635
4636 if (textureObject)
4637 {
4638 return GL_TRUE;
4639 }
4640 }
4641 }
4642 catch(std::bad_alloc&)
4643 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004644 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004645 }
4646
4647 return GL_FALSE;
4648}
4649
4650void __stdcall glLineWidth(GLfloat width)
4651{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004652 EVENT("(GLfloat width = %f)", width);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004653
4654 try
4655 {
4656 if (width <= 0.0f)
4657 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004658 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004659 }
4660
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004661 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com32e58cd2010-03-24 09:44:10 +00004662
4663 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004664 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004665 context->setLineWidth(width);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004666 }
4667 }
4668 catch(std::bad_alloc&)
4669 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004670 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004671 }
4672}
4673
4674void __stdcall glLinkProgram(GLuint program)
4675{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004676 EVENT("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004677
4678 try
4679 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004680 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004681
4682 if (context)
4683 {
4684 gl::Program *programObject = context->getProgram(program);
4685
4686 if (!programObject)
4687 {
daniel@transgaming.com277b7142010-04-13 03:26:44 +00004688 if (context->getShader(program))
4689 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004690 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com277b7142010-04-13 03:26:44 +00004691 }
4692 else
4693 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004694 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com277b7142010-04-13 03:26:44 +00004695 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004696 }
4697
daniel@transgaming.com95d29422012-07-24 18:36:10 +00004698 context->linkProgram(program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004699 }
4700 }
4701 catch(std::bad_alloc&)
4702 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004703 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004704 }
4705}
4706
4707void __stdcall glPixelStorei(GLenum pname, GLint param)
4708{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004709 EVENT("(GLenum pname = 0x%X, GLint param = %d)", pname, param);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004710
4711 try
4712 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004713 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004714
4715 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004716 {
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004717 switch (pname)
4718 {
4719 case GL_UNPACK_ALIGNMENT:
4720 if (param != 1 && param != 2 && param != 4 && param != 8)
4721 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004722 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004723 }
4724
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004725 context->setUnpackAlignment(param);
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004726 break;
4727
4728 case GL_PACK_ALIGNMENT:
4729 if (param != 1 && param != 2 && param != 4 && param != 8)
4730 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004731 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004732 }
4733
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004734 context->setPackAlignment(param);
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004735 break;
4736
bsalomon@google.com56d46ab2011-11-23 14:53:10 +00004737 case GL_PACK_REVERSE_ROW_ORDER_ANGLE:
4738 context->setPackReverseRowOrder(param != 0);
4739 break;
4740
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004741 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004742 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004743 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004744 }
4745 }
4746 catch(std::bad_alloc&)
4747 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004748 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004749 }
4750}
4751
4752void __stdcall glPolygonOffset(GLfloat factor, GLfloat units)
4753{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004754 EVENT("(GLfloat factor = %f, GLfloat units = %f)", factor, units);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004755
4756 try
4757 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004758 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comaede6302010-04-29 03:35:48 +00004759
4760 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004761 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004762 context->setPolygonOffsetParams(factor, units);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004763 }
4764 }
4765 catch(std::bad_alloc&)
4766 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004767 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004768 }
4769}
4770
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00004771void __stdcall glReadnPixelsEXT(GLint x, GLint y, GLsizei width, GLsizei height,
4772 GLenum format, GLenum type, GLsizei bufSize,
4773 GLvoid *data)
4774{
4775 EVENT("(GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d, "
4776 "GLenum format = 0x%X, GLenum type = 0x%X, GLsizei bufSize = 0x%d, GLvoid *data = 0x%0.8p)",
4777 x, y, width, height, format, type, bufSize, data);
4778
4779 try
4780 {
4781 if (width < 0 || height < 0 || bufSize < 0)
4782 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004783 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00004784 }
4785
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00004786 gl::Context *context = gl::getNonLostContext();
4787
4788 if (context)
4789 {
daniel@transgaming.com42944b02012-09-27 17:45:57 +00004790 GLenum currentFormat, currentType;
4791
4792 // Failure in getCurrentReadFormatType indicates that no color attachment is currently bound,
4793 // and attempting to read back if that's the case is an error. The error will be registered
4794 // by getCurrentReadFormat.
4795 if (!context->getCurrentReadFormatType(&currentFormat, &currentType))
4796 return;
4797
4798 if (!(currentFormat == format && currentType == type) && !validReadFormatType(format, type))
4799 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004800 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com42944b02012-09-27 17:45:57 +00004801 }
4802
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00004803 context->readPixels(x, y, width, height, format, type, &bufSize, data);
4804 }
4805 }
4806 catch(std::bad_alloc&)
4807 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004808 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00004809 }
4810}
4811
4812void __stdcall glReadPixels(GLint x, GLint y, GLsizei width, GLsizei height,
4813 GLenum format, GLenum type, GLvoid* pixels)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004814{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004815 EVENT("(GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00004816 "GLenum format = 0x%X, GLenum type = 0x%X, GLvoid* pixels = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00004817 x, y, width, height, format, type, pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004818
4819 try
4820 {
4821 if (width < 0 || height < 0)
4822 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004823 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004824 }
4825
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004826 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004827
4828 if (context)
4829 {
daniel@transgaming.com42944b02012-09-27 17:45:57 +00004830 GLenum currentFormat, currentType;
4831
4832 // Failure in getCurrentReadFormatType indicates that no color attachment is currently bound,
4833 // and attempting to read back if that's the case is an error. The error will be registered
4834 // by getCurrentReadFormat.
4835 if (!context->getCurrentReadFormatType(&currentFormat, &currentType))
4836 return;
4837
4838 if (!(currentFormat == format && currentType == type) && !validReadFormatType(format, type))
4839 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004840 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com42944b02012-09-27 17:45:57 +00004841 }
4842
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00004843 context->readPixels(x, y, width, height, format, type, NULL, pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004844 }
4845 }
4846 catch(std::bad_alloc&)
4847 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004848 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004849 }
4850}
4851
4852void __stdcall glReleaseShaderCompiler(void)
4853{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004854 EVENT("()");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004855
4856 try
4857 {
4858 gl::Shader::releaseCompiler();
4859 }
4860 catch(std::bad_alloc&)
4861 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004862 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004863 }
4864}
4865
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00004866void __stdcall glRenderbufferStorageMultisampleANGLE(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004867{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004868 EVENT("(GLenum target = 0x%X, GLsizei samples = %d, GLenum internalformat = 0x%X, GLsizei width = %d, GLsizei height = %d)",
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00004869 target, samples, internalformat, width, height);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004870
4871 try
4872 {
4873 switch (target)
4874 {
4875 case GL_RENDERBUFFER:
4876 break;
4877 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004878 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004879 }
4880
daniel@transgaming.comedc19182010-10-15 17:57:55 +00004881 if (!gl::IsColorRenderable(internalformat) && !gl::IsDepthRenderable(internalformat) && !gl::IsStencilRenderable(internalformat))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004882 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004883 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004884 }
4885
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00004886 if (width < 0 || height < 0 || samples < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004887 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004888 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004889 }
4890
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004891 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004892
4893 if (context)
4894 {
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00004895 if (width > context->getMaximumRenderbufferDimension() ||
4896 height > context->getMaximumRenderbufferDimension() ||
4897 samples > context->getMaxSupportedSamples())
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00004898 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004899 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00004900 }
4901
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +00004902 GLuint handle = context->getRenderbufferHandle();
4903 if (handle == 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004904 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004905 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004906 }
4907
4908 switch (internalformat)
4909 {
4910 case GL_DEPTH_COMPONENT16:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004911 case GL_RGBA4:
4912 case GL_RGB5_A1:
4913 case GL_RGB565:
daniel@transgaming.com63977542010-08-24 19:21:02 +00004914 case GL_RGB8_OES:
4915 case GL_RGBA8_OES:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004916 case GL_STENCIL_INDEX8:
daniel@transgaming.comcdacc8e2010-07-28 19:20:50 +00004917 case GL_DEPTH24_STENCIL8_OES:
daniel@transgaming.com70062c92012-11-28 19:32:30 +00004918 context->setRenderbufferStorage(width, height, internalformat, samples);
daniel@transgaming.comcdacc8e2010-07-28 19:20:50 +00004919 break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004920 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004921 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004922 }
4923 }
4924 }
4925 catch(std::bad_alloc&)
4926 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004927 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004928 }
4929}
4930
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00004931void __stdcall glRenderbufferStorage(GLenum target, GLenum internalformat, GLsizei width, GLsizei height)
4932{
4933 glRenderbufferStorageMultisampleANGLE(target, 0, internalformat, width, height);
4934}
4935
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004936void __stdcall glSampleCoverage(GLclampf value, GLboolean invert)
4937{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00004938 EVENT("(GLclampf value = %f, GLboolean invert = %u)", value, invert);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004939
4940 try
4941 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004942 gl::Context* context = gl::getNonLostContext();
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00004943
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004944 if (context)
4945 {
daniel@transgaming.coma36f98e2010-05-18 18:51:09 +00004946 context->setSampleCoverageParams(gl::clamp01(value), invert == GL_TRUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004947 }
4948 }
4949 catch(std::bad_alloc&)
4950 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004951 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004952 }
4953}
4954
daniel@transgaming.comfe208882010-09-01 15:47:57 +00004955void __stdcall glSetFenceNV(GLuint fence, GLenum condition)
4956{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004957 EVENT("(GLuint fence = %d, GLenum condition = 0x%X)", fence, condition);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004958
4959 try
4960 {
4961 if (condition != GL_ALL_COMPLETED_NV)
4962 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004963 return gl::error(GL_INVALID_ENUM);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004964 }
4965
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004966 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004967
4968 if (context)
4969 {
4970 gl::Fence *fenceObject = context->getFence(fence);
4971
4972 if (fenceObject == NULL)
4973 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004974 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004975 }
4976
4977 fenceObject->setFence(condition);
4978 }
4979 }
4980 catch(std::bad_alloc&)
4981 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004982 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004983 }
daniel@transgaming.comfe208882010-09-01 15:47:57 +00004984}
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004985
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004986void __stdcall glScissor(GLint x, GLint y, GLsizei width, GLsizei height)
4987{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004988 EVENT("(GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d)", x, y, width, height);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004989
4990 try
4991 {
4992 if (width < 0 || height < 0)
4993 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004994 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004995 }
4996
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004997 gl::Context* context = gl::getNonLostContext();
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00004998
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004999 if (context)
5000 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00005001 context->setScissorParams(x, y, width, height);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005002 }
5003 }
5004 catch(std::bad_alloc&)
5005 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005006 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005007 }
5008}
5009
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00005010void __stdcall glShaderBinary(GLsizei n, const GLuint* shaders, GLenum binaryformat, const GLvoid* binary, GLsizei length)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005011{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005012 EVENT("(GLsizei n = %d, const GLuint* shaders = 0x%0.8p, GLenum binaryformat = 0x%X, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00005013 "const GLvoid* binary = 0x%0.8p, GLsizei length = %d)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00005014 n, shaders, binaryformat, binary, length);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005015
5016 try
5017 {
daniel@transgaming.comd1f667f2010-04-29 03:38:52 +00005018 // No binary shader formats are supported.
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005019 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005020 }
5021 catch(std::bad_alloc&)
5022 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005023 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005024 }
5025}
5026
shannon.woods%transgaming.com@gtempaccount.com5f339332013-04-13 03:29:02 +00005027void __stdcall glShaderSource(GLuint shader, GLsizei count, const GLchar* const* string, const GLint* length)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005028{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005029 EVENT("(GLuint shader = %d, GLsizei count = %d, const GLchar** string = 0x%0.8p, const GLint* length = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00005030 shader, count, string, length);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005031
5032 try
5033 {
daniel@transgaming.com8e6a6be2010-04-13 03:26:41 +00005034 if (count < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005035 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005036 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005037 }
5038
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005039 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005040
5041 if (context)
5042 {
5043 gl::Shader *shaderObject = context->getShader(shader);
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00005044
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005045 if (!shaderObject)
5046 {
daniel@transgaming.com8e6a6be2010-04-13 03:26:41 +00005047 if (context->getProgram(shader))
5048 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005049 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com8e6a6be2010-04-13 03:26:41 +00005050 }
5051 else
5052 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005053 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com8e6a6be2010-04-13 03:26:41 +00005054 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005055 }
5056
5057 shaderObject->setSource(count, string, length);
5058 }
5059 }
5060 catch(std::bad_alloc&)
5061 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005062 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005063 }
5064}
5065
5066void __stdcall glStencilFunc(GLenum func, GLint ref, GLuint mask)
5067{
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00005068 glStencilFuncSeparate(GL_FRONT_AND_BACK, func, ref, mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005069}
5070
5071void __stdcall glStencilFuncSeparate(GLenum face, GLenum func, GLint ref, GLuint mask)
5072{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005073 EVENT("(GLenum face = 0x%X, GLenum func = 0x%X, GLint ref = %d, GLuint mask = %d)", face, func, ref, mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005074
5075 try
5076 {
5077 switch (face)
5078 {
5079 case GL_FRONT:
5080 case GL_BACK:
5081 case GL_FRONT_AND_BACK:
5082 break;
5083 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005084 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005085 }
5086
5087 switch (func)
5088 {
5089 case GL_NEVER:
5090 case GL_ALWAYS:
5091 case GL_LESS:
5092 case GL_LEQUAL:
5093 case GL_EQUAL:
5094 case GL_GEQUAL:
5095 case GL_GREATER:
5096 case GL_NOTEQUAL:
5097 break;
5098 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005099 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005100 }
5101
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005102 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005103
5104 if (context)
5105 {
5106 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
5107 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00005108 context->setStencilParams(func, ref, mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005109 }
5110
5111 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
5112 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00005113 context->setStencilBackParams(func, ref, mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005114 }
5115 }
5116 }
5117 catch(std::bad_alloc&)
5118 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005119 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005120 }
5121}
5122
5123void __stdcall glStencilMask(GLuint mask)
5124{
5125 glStencilMaskSeparate(GL_FRONT_AND_BACK, mask);
5126}
5127
5128void __stdcall glStencilMaskSeparate(GLenum face, GLuint mask)
5129{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005130 EVENT("(GLenum face = 0x%X, GLuint mask = %d)", face, mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005131
5132 try
5133 {
5134 switch (face)
5135 {
5136 case GL_FRONT:
5137 case GL_BACK:
5138 case GL_FRONT_AND_BACK:
5139 break;
5140 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005141 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005142 }
5143
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005144 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005145
5146 if (context)
5147 {
5148 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
5149 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00005150 context->setStencilWritemask(mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005151 }
5152
5153 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
5154 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00005155 context->setStencilBackWritemask(mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005156 }
5157 }
5158 }
5159 catch(std::bad_alloc&)
5160 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005161 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005162 }
5163}
5164
5165void __stdcall glStencilOp(GLenum fail, GLenum zfail, GLenum zpass)
5166{
5167 glStencilOpSeparate(GL_FRONT_AND_BACK, fail, zfail, zpass);
5168}
5169
5170void __stdcall glStencilOpSeparate(GLenum face, GLenum fail, GLenum zfail, GLenum zpass)
5171{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005172 EVENT("(GLenum face = 0x%X, GLenum fail = 0x%X, GLenum zfail = 0x%X, GLenum zpas = 0x%Xs)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00005173 face, fail, zfail, zpass);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005174
5175 try
5176 {
5177 switch (face)
5178 {
5179 case GL_FRONT:
5180 case GL_BACK:
5181 case GL_FRONT_AND_BACK:
5182 break;
5183 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005184 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005185 }
5186
5187 switch (fail)
5188 {
5189 case GL_ZERO:
5190 case GL_KEEP:
5191 case GL_REPLACE:
5192 case GL_INCR:
5193 case GL_DECR:
5194 case GL_INVERT:
5195 case GL_INCR_WRAP:
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00005196 case GL_DECR_WRAP:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005197 break;
5198 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005199 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005200 }
5201
5202 switch (zfail)
5203 {
5204 case GL_ZERO:
5205 case GL_KEEP:
5206 case GL_REPLACE:
5207 case GL_INCR:
5208 case GL_DECR:
5209 case GL_INVERT:
5210 case GL_INCR_WRAP:
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00005211 case GL_DECR_WRAP:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005212 break;
5213 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005214 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005215 }
5216
5217 switch (zpass)
5218 {
5219 case GL_ZERO:
5220 case GL_KEEP:
5221 case GL_REPLACE:
5222 case GL_INCR:
5223 case GL_DECR:
5224 case GL_INVERT:
5225 case GL_INCR_WRAP:
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00005226 case GL_DECR_WRAP:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005227 break;
5228 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005229 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005230 }
5231
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005232 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005233
5234 if (context)
5235 {
5236 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
5237 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00005238 context->setStencilOperations(fail, zfail, zpass);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005239 }
5240
5241 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
5242 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00005243 context->setStencilBackOperations(fail, zfail, zpass);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005244 }
5245 }
5246 }
5247 catch(std::bad_alloc&)
5248 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005249 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005250 }
5251}
5252
daniel@transgaming.comfe208882010-09-01 15:47:57 +00005253GLboolean __stdcall glTestFenceNV(GLuint fence)
5254{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005255 EVENT("(GLuint fence = %d)", fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005256
5257 try
5258 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005259 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005260
5261 if (context)
5262 {
5263 gl::Fence *fenceObject = context->getFence(fence);
5264
5265 if (fenceObject == NULL)
5266 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005267 return gl::error(GL_INVALID_OPERATION, GL_TRUE);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005268 }
5269
5270 return fenceObject->testFence();
5271 }
5272 }
5273 catch(std::bad_alloc&)
5274 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005275 gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005276 }
5277
5278 return GL_TRUE;
daniel@transgaming.comfe208882010-09-01 15:47:57 +00005279}
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005280
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00005281void __stdcall glTexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height,
5282 GLint border, GLenum format, GLenum type, const GLvoid* pixels)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005283{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005284 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint internalformat = %d, GLsizei width = %d, GLsizei height = %d, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00005285 "GLint border = %d, GLenum format = 0x%X, GLenum type = 0x%X, const GLvoid* pixels = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00005286 target, level, internalformat, width, height, border, format, type, pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005287
5288 try
5289 {
daniel@transgaming.com4f9ef0d2011-05-30 23:51:19 +00005290 if (!validImageSize(level, width, height))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005291 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005292 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005293 }
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00005294
apatrick@chromium.orge057c5d2012-01-26 19:18:24 +00005295 if (internalformat != GLint(format))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005296 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005297 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005298 }
5299
daniel@transgaming.com6377e362012-06-05 19:49:55 +00005300 // validate <type> by itself (used as secondary key below)
5301 switch (type)
5302 {
5303 case GL_UNSIGNED_BYTE:
5304 case GL_UNSIGNED_SHORT_5_6_5:
5305 case GL_UNSIGNED_SHORT_4_4_4_4:
5306 case GL_UNSIGNED_SHORT_5_5_5_1:
5307 case GL_UNSIGNED_SHORT:
5308 case GL_UNSIGNED_INT:
5309 case GL_UNSIGNED_INT_24_8_OES:
5310 case GL_HALF_FLOAT_OES:
5311 case GL_FLOAT:
5312 break;
5313 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005314 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com6377e362012-06-05 19:49:55 +00005315 }
5316
5317 // validate <format> + <type> combinations
5318 // - invalid <format> -> sets INVALID_ENUM
5319 // - invalid <format>+<type> combination -> sets INVALID_OPERATION
daniel@transgaming.com8a0a2db2011-03-21 16:38:20 +00005320 switch (format)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005321 {
5322 case GL_ALPHA:
5323 case GL_LUMINANCE:
5324 case GL_LUMINANCE_ALPHA:
5325 switch (type)
5326 {
5327 case GL_UNSIGNED_BYTE:
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00005328 case GL_FLOAT:
5329 case GL_HALF_FLOAT_OES:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005330 break;
5331 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005332 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005333 }
5334 break;
5335 case GL_RGB:
5336 switch (type)
5337 {
5338 case GL_UNSIGNED_BYTE:
5339 case GL_UNSIGNED_SHORT_5_6_5:
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00005340 case GL_FLOAT:
5341 case GL_HALF_FLOAT_OES:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005342 break;
5343 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005344 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005345 }
5346 break;
5347 case GL_RGBA:
5348 switch (type)
5349 {
5350 case GL_UNSIGNED_BYTE:
5351 case GL_UNSIGNED_SHORT_4_4_4_4:
5352 case GL_UNSIGNED_SHORT_5_5_5_1:
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00005353 case GL_FLOAT:
5354 case GL_HALF_FLOAT_OES:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005355 break;
5356 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005357 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005358 }
5359 break;
daniel@transgaming.coma9198d92010-08-08 04:49:56 +00005360 case GL_BGRA_EXT:
5361 switch (type)
5362 {
5363 case GL_UNSIGNED_BYTE:
5364 break;
5365 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005366 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.coma9198d92010-08-08 04:49:56 +00005367 }
5368 break;
daniel@transgaming.com01868132010-08-24 19:21:17 +00005369 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT: // error cases for compressed textures are handled below
5370 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
gman@chromium.org50c526d2011-08-10 05:19:44 +00005371 case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
5372 case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
daniel@transgaming.com01868132010-08-24 19:21:17 +00005373 break;
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00005374 case GL_DEPTH_COMPONENT:
5375 switch (type)
5376 {
5377 case GL_UNSIGNED_SHORT:
5378 case GL_UNSIGNED_INT:
5379 break;
5380 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005381 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00005382 }
5383 break;
5384 case GL_DEPTH_STENCIL_OES:
5385 switch (type)
5386 {
5387 case GL_UNSIGNED_INT_24_8_OES:
5388 break;
5389 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005390 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00005391 }
5392 break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005393 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005394 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005395 }
5396
5397 if (border != 0)
5398 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005399 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005400 }
5401
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005402 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005403
5404 if (context)
5405 {
daniel@transgaming.com32b11442011-11-19 02:42:48 +00005406 if (level > context->getMaximumTextureLevel())
5407 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005408 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com32b11442011-11-19 02:42:48 +00005409 }
5410
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00005411 switch (target)
5412 {
5413 case GL_TEXTURE_2D:
5414 if (width > (context->getMaximumTextureDimension() >> level) ||
5415 height > (context->getMaximumTextureDimension() >> level))
5416 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005417 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00005418 }
5419 break;
5420 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
5421 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
5422 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
5423 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
5424 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
5425 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
5426 if (width != height)
5427 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005428 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00005429 }
5430
5431 if (width > (context->getMaximumCubeTextureDimension() >> level) ||
5432 height > (context->getMaximumCubeTextureDimension() >> level))
5433 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005434 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00005435 }
5436 break;
5437 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005438 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00005439 }
5440
gman@chromium.org50c526d2011-08-10 05:19:44 +00005441 switch (format) {
5442 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
5443 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
5444 if (context->supportsDXT1Textures())
daniel@transgaming.com01868132010-08-24 19:21:17 +00005445 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005446 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com01868132010-08-24 19:21:17 +00005447 }
5448 else
5449 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005450 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com01868132010-08-24 19:21:17 +00005451 }
gman@chromium.org50c526d2011-08-10 05:19:44 +00005452 break;
5453 case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
5454 if (context->supportsDXT3Textures())
5455 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005456 return gl::error(GL_INVALID_OPERATION);
gman@chromium.org50c526d2011-08-10 05:19:44 +00005457 }
5458 else
5459 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005460 return gl::error(GL_INVALID_ENUM);
gman@chromium.org50c526d2011-08-10 05:19:44 +00005461 }
5462 break;
5463 case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
5464 if (context->supportsDXT5Textures())
5465 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005466 return gl::error(GL_INVALID_OPERATION);
gman@chromium.org50c526d2011-08-10 05:19:44 +00005467 }
5468 else
5469 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005470 return gl::error(GL_INVALID_ENUM);
gman@chromium.org50c526d2011-08-10 05:19:44 +00005471 }
5472 break;
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00005473 case GL_DEPTH_COMPONENT:
5474 case GL_DEPTH_STENCIL_OES:
5475 if (!context->supportsDepthTextures())
5476 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005477 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00005478 }
daniel@transgaming.com0c854682012-05-31 01:14:11 +00005479 if (target != GL_TEXTURE_2D)
5480 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005481 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com0c854682012-05-31 01:14:11 +00005482 }
daniel@transgaming.com797924b2012-06-05 19:50:01 +00005483 // OES_depth_texture supports loading depth data and multiple levels,
5484 // but ANGLE_depth_texture does not
5485 if (pixels != NULL || level != 0)
daniel@transgaming.com0c854682012-05-31 01:14:11 +00005486 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005487 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com0c854682012-05-31 01:14:11 +00005488 }
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00005489 break;
gman@chromium.org50c526d2011-08-10 05:19:44 +00005490 default:
5491 break;
daniel@transgaming.com01868132010-08-24 19:21:17 +00005492 }
5493
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00005494 if (type == GL_FLOAT)
5495 {
daniel@transgaming.combbeffbb2011-11-09 17:46:11 +00005496 if (!context->supportsFloat32Textures())
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00005497 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005498 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00005499 }
5500 }
5501 else if (type == GL_HALF_FLOAT_OES)
5502 {
daniel@transgaming.combbeffbb2011-11-09 17:46:11 +00005503 if (!context->supportsFloat16Textures())
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00005504 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005505 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00005506 }
5507 }
5508
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005509 if (target == GL_TEXTURE_2D)
5510 {
5511 gl::Texture2D *texture = context->getTexture2D();
5512
5513 if (!texture)
5514 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005515 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005516 }
5517
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005518 if (texture->isImmutable())
5519 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005520 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005521 }
5522
daniel@transgaming.com8a0a2db2011-03-21 16:38:20 +00005523 texture->setImage(level, width, height, format, type, context->getUnpackAlignment(), pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005524 }
5525 else
5526 {
5527 gl::TextureCubeMap *texture = context->getTextureCubeMap();
5528
5529 if (!texture)
5530 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005531 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005532 }
5533
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005534 if (texture->isImmutable())
5535 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005536 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005537 }
5538
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005539 switch (target)
5540 {
5541 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
daniel@transgaming.com8a0a2db2011-03-21 16:38:20 +00005542 texture->setImagePosX(level, width, height, format, type, context->getUnpackAlignment(), pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005543 break;
5544 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
daniel@transgaming.com8a0a2db2011-03-21 16:38:20 +00005545 texture->setImageNegX(level, width, height, format, type, context->getUnpackAlignment(), pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005546 break;
5547 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
daniel@transgaming.com8a0a2db2011-03-21 16:38:20 +00005548 texture->setImagePosY(level, width, height, format, type, context->getUnpackAlignment(), pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005549 break;
5550 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
daniel@transgaming.com8a0a2db2011-03-21 16:38:20 +00005551 texture->setImageNegY(level, width, height, format, type, context->getUnpackAlignment(), pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005552 break;
5553 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
daniel@transgaming.com8a0a2db2011-03-21 16:38:20 +00005554 texture->setImagePosZ(level, width, height, format, type, context->getUnpackAlignment(), pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005555 break;
5556 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
daniel@transgaming.com8a0a2db2011-03-21 16:38:20 +00005557 texture->setImageNegZ(level, width, height, format, type, context->getUnpackAlignment(), pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005558 break;
5559 default: UNREACHABLE();
5560 }
5561 }
5562 }
5563 }
5564 catch(std::bad_alloc&)
5565 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005566 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005567 }
5568}
5569
5570void __stdcall glTexParameterf(GLenum target, GLenum pname, GLfloat param)
5571{
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005572 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLint param = %f)", target, pname, param);
5573
5574 try
5575 {
5576 gl::Context *context = gl::getNonLostContext();
5577
5578 if (context)
5579 {
5580 gl::Texture *texture;
5581
5582 switch (target)
5583 {
5584 case GL_TEXTURE_2D:
5585 texture = context->getTexture2D();
5586 break;
5587 case GL_TEXTURE_CUBE_MAP:
5588 texture = context->getTextureCubeMap();
5589 break;
5590 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005591 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005592 }
5593
5594 switch (pname)
5595 {
5596 case GL_TEXTURE_WRAP_S:
5597 if (!texture->setWrapS((GLenum)param))
5598 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005599 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005600 }
5601 break;
5602 case GL_TEXTURE_WRAP_T:
5603 if (!texture->setWrapT((GLenum)param))
5604 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005605 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005606 }
5607 break;
5608 case GL_TEXTURE_MIN_FILTER:
5609 if (!texture->setMinFilter((GLenum)param))
5610 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005611 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005612 }
5613 break;
5614 case GL_TEXTURE_MAG_FILTER:
5615 if (!texture->setMagFilter((GLenum)param))
5616 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005617 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005618 }
5619 break;
5620 case GL_TEXTURE_USAGE_ANGLE:
5621 if (!texture->setUsage((GLenum)param))
5622 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005623 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005624 }
5625 break;
5626 case GL_TEXTURE_MAX_ANISOTROPY_EXT:
5627 if (!context->supportsTextureFilterAnisotropy())
5628 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005629 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005630 }
5631 if (!texture->setMaxAnisotropy((float)param, context->getTextureMaxAnisotropy()))
5632 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005633 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005634 }
5635 break;
5636 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005637 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005638 }
5639 }
5640 }
5641 catch(std::bad_alloc&)
5642 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005643 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005644 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005645}
5646
5647void __stdcall glTexParameterfv(GLenum target, GLenum pname, const GLfloat* params)
5648{
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005649 glTexParameterf(target, pname, (GLfloat)*params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005650}
5651
5652void __stdcall glTexParameteri(GLenum target, GLenum pname, GLint param)
5653{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005654 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLint param = %d)", target, pname, param);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005655
5656 try
5657 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005658 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005659
5660 if (context)
5661 {
5662 gl::Texture *texture;
5663
5664 switch (target)
5665 {
5666 case GL_TEXTURE_2D:
5667 texture = context->getTexture2D();
5668 break;
5669 case GL_TEXTURE_CUBE_MAP:
5670 texture = context->getTextureCubeMap();
5671 break;
5672 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005673 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005674 }
5675
5676 switch (pname)
5677 {
5678 case GL_TEXTURE_WRAP_S:
5679 if (!texture->setWrapS((GLenum)param))
5680 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005681 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005682 }
5683 break;
5684 case GL_TEXTURE_WRAP_T:
5685 if (!texture->setWrapT((GLenum)param))
5686 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005687 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005688 }
5689 break;
5690 case GL_TEXTURE_MIN_FILTER:
5691 if (!texture->setMinFilter((GLenum)param))
5692 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005693 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005694 }
5695 break;
5696 case GL_TEXTURE_MAG_FILTER:
5697 if (!texture->setMagFilter((GLenum)param))
5698 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005699 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005700 }
5701 break;
daniel@transgaming.com7d18c172011-11-11 04:18:21 +00005702 case GL_TEXTURE_USAGE_ANGLE:
5703 if (!texture->setUsage((GLenum)param))
5704 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005705 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com7d18c172011-11-11 04:18:21 +00005706 }
5707 break;
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005708 case GL_TEXTURE_MAX_ANISOTROPY_EXT:
5709 if (!context->supportsTextureFilterAnisotropy())
5710 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005711 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005712 }
5713 if (!texture->setMaxAnisotropy((float)param, context->getTextureMaxAnisotropy()))
5714 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005715 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005716 }
5717 break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005718 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005719 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005720 }
5721 }
5722 }
5723 catch(std::bad_alloc&)
5724 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005725 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005726 }
5727}
5728
5729void __stdcall glTexParameteriv(GLenum target, GLenum pname, const GLint* params)
5730{
5731 glTexParameteri(target, pname, *params);
5732}
5733
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005734void __stdcall glTexStorage2DEXT(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height)
5735{
5736 EVENT("(GLenum target = 0x%X, GLsizei levels = %d, GLenum internalformat = 0x%X, GLsizei width = %d, GLsizei height = %d)",
5737 target, levels, internalformat, width, height);
5738
5739 try
5740 {
5741 if (target != GL_TEXTURE_2D && target != GL_TEXTURE_CUBE_MAP)
5742 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005743 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005744 }
5745
5746 if (width < 1 || height < 1 || levels < 1)
5747 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005748 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005749 }
5750
5751 if (target == GL_TEXTURE_CUBE_MAP && width != height)
5752 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005753 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005754 }
5755
daniel@transgaming.com45b888a2011-11-16 03:56:39 +00005756 if (levels != 1 && levels != gl::log2(std::max(width, height)) + 1)
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005757 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005758 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005759 }
5760
5761 GLenum format = gl::ExtractFormat(internalformat);
5762 GLenum type = gl::ExtractType(internalformat);
5763
5764 if (format == GL_NONE || type == GL_NONE)
5765 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005766 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005767 }
5768
5769 gl::Context *context = gl::getNonLostContext();
5770
5771 if (context)
5772 {
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00005773 switch (target)
5774 {
5775 case GL_TEXTURE_2D:
5776 if (width > context->getMaximumTextureDimension() ||
5777 height > context->getMaximumTextureDimension())
5778 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005779 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00005780 }
5781 break;
5782 case GL_TEXTURE_CUBE_MAP:
5783 if (width > context->getMaximumCubeTextureDimension() ||
5784 height > context->getMaximumCubeTextureDimension())
5785 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005786 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00005787 }
5788 break;
5789 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005790 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00005791 }
5792
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005793 if (levels != 1 && !context->supportsNonPower2Texture())
5794 {
5795 if (!gl::isPow2(width) || !gl::isPow2(height))
5796 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005797 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005798 }
5799 }
5800
daniel@transgaming.come1077362011-11-11 04:16:50 +00005801 switch (internalformat)
5802 {
5803 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
5804 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
5805 if (!context->supportsDXT1Textures())
5806 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005807 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.come1077362011-11-11 04:16:50 +00005808 }
5809 break;
5810 case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
5811 if (!context->supportsDXT3Textures())
5812 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005813 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.come1077362011-11-11 04:16:50 +00005814 }
5815 break;
5816 case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
5817 if (!context->supportsDXT5Textures())
5818 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005819 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.come1077362011-11-11 04:16:50 +00005820 }
5821 break;
daniel@transgaming.comff941aa2011-11-11 04:17:09 +00005822 case GL_RGBA32F_EXT:
5823 case GL_RGB32F_EXT:
5824 case GL_ALPHA32F_EXT:
5825 case GL_LUMINANCE32F_EXT:
5826 case GL_LUMINANCE_ALPHA32F_EXT:
5827 if (!context->supportsFloat32Textures())
5828 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005829 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comff941aa2011-11-11 04:17:09 +00005830 }
5831 break;
5832 case GL_RGBA16F_EXT:
5833 case GL_RGB16F_EXT:
5834 case GL_ALPHA16F_EXT:
5835 case GL_LUMINANCE16F_EXT:
5836 case GL_LUMINANCE_ALPHA16F_EXT:
5837 if (!context->supportsFloat16Textures())
5838 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005839 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comff941aa2011-11-11 04:17:09 +00005840 }
5841 break;
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00005842 case GL_DEPTH_COMPONENT16:
5843 case GL_DEPTH_COMPONENT32_OES:
5844 case GL_DEPTH24_STENCIL8_OES:
5845 if (!context->supportsDepthTextures())
5846 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005847 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00005848 }
daniel@transgaming.com0c854682012-05-31 01:14:11 +00005849 if (target != GL_TEXTURE_2D)
5850 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005851 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com0c854682012-05-31 01:14:11 +00005852 }
daniel@transgaming.com797924b2012-06-05 19:50:01 +00005853 // ANGLE_depth_texture only supports 1-level textures
5854 if (levels != 1)
5855 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005856 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com797924b2012-06-05 19:50:01 +00005857 }
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00005858 break;
5859 default:
5860 break;
daniel@transgaming.come1077362011-11-11 04:16:50 +00005861 }
5862
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005863 if (target == GL_TEXTURE_2D)
5864 {
5865 gl::Texture2D *texture = context->getTexture2D();
5866
5867 if (!texture || texture->id() == 0)
5868 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005869 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005870 }
5871
5872 if (texture->isImmutable())
5873 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005874 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005875 }
5876
5877 texture->storage(levels, internalformat, width, height);
5878 }
5879 else if (target == GL_TEXTURE_CUBE_MAP)
5880 {
5881 gl::TextureCubeMap *texture = context->getTextureCubeMap();
5882
5883 if (!texture || texture->id() == 0)
5884 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005885 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005886 }
5887
5888 if (texture->isImmutable())
5889 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005890 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005891 }
5892
5893 texture->storage(levels, internalformat, width);
5894 }
5895 else UNREACHABLE();
5896 }
5897 }
5898 catch(std::bad_alloc&)
5899 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005900 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005901 }
5902}
5903
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00005904void __stdcall glTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height,
5905 GLenum format, GLenum type, const GLvoid* pixels)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005906{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005907 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00005908 "GLsizei width = %d, GLsizei height = %d, GLenum format = 0x%X, GLenum type = 0x%X, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00005909 "const GLvoid* pixels = 0x%0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005910 target, level, xoffset, yoffset, width, height, format, type, pixels);
5911
5912 try
5913 {
apatrick@chromium.org551022e2012-01-23 19:56:54 +00005914 if (!gl::IsInternalTextureTarget(target))
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005915 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005916 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005917 }
5918
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00005919 if (level < 0 || xoffset < 0 || yoffset < 0 || width < 0 || height < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005920 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005921 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005922 }
5923
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005924 if (std::numeric_limits<GLsizei>::max() - xoffset < width || std::numeric_limits<GLsizei>::max() - yoffset < height)
5925 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005926 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005927 }
5928
daniel@transgaming.com8833dd22012-06-05 19:49:58 +00005929 if (!checkTextureFormatType(format, type))
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005930 {
daniel@transgaming.com8833dd22012-06-05 19:49:58 +00005931 return; // error is set by helper function
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005932 }
5933
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005934 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005935
5936 if (context)
5937 {
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00005938 if (level > context->getMaximumTextureLevel())
5939 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005940 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00005941 }
5942
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00005943 if (format == GL_FLOAT)
5944 {
daniel@transgaming.combbeffbb2011-11-09 17:46:11 +00005945 if (!context->supportsFloat32Textures())
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00005946 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005947 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00005948 }
5949 }
5950 else if (format == GL_HALF_FLOAT_OES)
5951 {
daniel@transgaming.combbeffbb2011-11-09 17:46:11 +00005952 if (!context->supportsFloat16Textures())
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00005953 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005954 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00005955 }
5956 }
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00005957 else if (gl::IsDepthTexture(format))
5958 {
5959 if (!context->supportsDepthTextures())
5960 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005961 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00005962 }
daniel@transgaming.com0c854682012-05-31 01:14:11 +00005963 if (target != GL_TEXTURE_2D)
5964 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005965 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com0c854682012-05-31 01:14:11 +00005966 }
5967 // OES_depth_texture supports loading depth data, but ANGLE_depth_texture does not
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005968 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00005969 }
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00005970
daniel@transgaming.com1d2d3c42012-05-31 01:14:15 +00005971 if (width == 0 || height == 0 || pixels == NULL)
5972 {
5973 return;
5974 }
5975
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005976 if (target == GL_TEXTURE_2D)
5977 {
5978 gl::Texture2D *texture = context->getTexture2D();
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00005979 if (validateSubImageParams2D(false, width, height, xoffset, yoffset, level, format, type, texture))
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005980 {
daniel@transgaming.com343373a2011-11-29 19:42:32 +00005981 texture->subImage(level, xoffset, yoffset, width, height, format, type, context->getUnpackAlignment(), pixels);
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005982 }
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005983 }
daniel@transgaming.com19ffc242010-05-04 03:35:21 +00005984 else if (gl::IsCubemapTextureTarget(target))
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005985 {
5986 gl::TextureCubeMap *texture = context->getTextureCubeMap();
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00005987 if (validateSubImageParamsCube(false, width, height, xoffset, yoffset, target, level, format, type, texture))
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005988 {
daniel@transgaming.com343373a2011-11-29 19:42:32 +00005989 texture->subImage(target, level, xoffset, yoffset, width, height, format, type, context->getUnpackAlignment(), pixels);
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005990 }
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005991 }
5992 else
5993 {
5994 UNREACHABLE();
5995 }
5996 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005997 }
5998 catch(std::bad_alloc&)
5999 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006000 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006001 }
6002}
6003
6004void __stdcall glUniform1f(GLint location, GLfloat x)
6005{
6006 glUniform1fv(location, 1, &x);
6007}
6008
6009void __stdcall glUniform1fv(GLint location, GLsizei count, const GLfloat* v)
6010{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006011 EVENT("(GLint location = %d, GLsizei count = %d, const GLfloat* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006012
6013 try
6014 {
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006015 if (count < 0)
6016 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006017 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006018 }
6019
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006020 if (location == -1)
6021 {
6022 return;
6023 }
6024
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006025 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006026
6027 if (context)
6028 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00006029 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006030 if (!programBinary)
6031 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006032 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006033 }
6034
6035 if (!programBinary->setUniform1fv(location, count, v))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006036 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006037 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006038 }
6039 }
6040 }
6041 catch(std::bad_alloc&)
6042 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006043 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006044 }
6045}
6046
6047void __stdcall glUniform1i(GLint location, GLint x)
6048{
6049 glUniform1iv(location, 1, &x);
6050}
6051
6052void __stdcall glUniform1iv(GLint location, GLsizei count, const GLint* v)
6053{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006054 EVENT("(GLint location = %d, GLsizei count = %d, const GLint* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006055
6056 try
6057 {
6058 if (count < 0)
6059 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006060 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006061 }
6062
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006063 if (location == -1)
6064 {
6065 return;
6066 }
6067
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006068 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006069
6070 if (context)
6071 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00006072 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006073 if (!programBinary)
6074 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006075 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006076 }
6077
6078 if (!programBinary->setUniform1iv(location, count, v))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006079 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006080 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006081 }
6082 }
6083 }
6084 catch(std::bad_alloc&)
6085 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006086 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006087 }
6088}
6089
6090void __stdcall glUniform2f(GLint location, GLfloat x, GLfloat y)
6091{
6092 GLfloat xy[2] = {x, y};
6093
6094 glUniform2fv(location, 1, (GLfloat*)&xy);
6095}
6096
6097void __stdcall glUniform2fv(GLint location, GLsizei count, const GLfloat* v)
6098{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006099 EVENT("(GLint location = %d, GLsizei count = %d, const GLfloat* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006100
6101 try
6102 {
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006103 if (count < 0)
6104 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006105 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006106 }
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006107
6108 if (location == -1)
6109 {
6110 return;
6111 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006112
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006113 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006114
6115 if (context)
6116 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00006117 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006118 if (!programBinary)
6119 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006120 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006121 }
6122
6123 if (!programBinary->setUniform2fv(location, count, v))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006124 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006125 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006126 }
6127 }
6128 }
6129 catch(std::bad_alloc&)
6130 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006131 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006132 }
6133}
6134
6135void __stdcall glUniform2i(GLint location, GLint x, GLint y)
6136{
6137 GLint xy[4] = {x, y};
6138
6139 glUniform2iv(location, 1, (GLint*)&xy);
6140}
6141
6142void __stdcall glUniform2iv(GLint location, GLsizei count, const GLint* v)
6143{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006144 EVENT("(GLint location = %d, GLsizei count = %d, const GLint* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006145
6146 try
6147 {
6148 if (count < 0)
6149 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006150 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006151 }
6152
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006153 if (location == -1)
6154 {
6155 return;
6156 }
6157
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006158 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006159
6160 if (context)
6161 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00006162 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006163 if (!programBinary)
6164 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006165 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006166 }
6167
6168 if (!programBinary->setUniform2iv(location, count, v))
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006169 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006170 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006171 }
6172 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006173 }
6174 catch(std::bad_alloc&)
6175 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006176 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006177 }
6178}
6179
6180void __stdcall glUniform3f(GLint location, GLfloat x, GLfloat y, GLfloat z)
6181{
6182 GLfloat xyz[3] = {x, y, z};
6183
6184 glUniform3fv(location, 1, (GLfloat*)&xyz);
6185}
6186
6187void __stdcall glUniform3fv(GLint location, GLsizei count, const GLfloat* v)
6188{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006189 EVENT("(GLint location = %d, GLsizei count = %d, const GLfloat* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006190
6191 try
6192 {
6193 if (count < 0)
6194 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006195 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006196 }
6197
6198 if (location == -1)
6199 {
6200 return;
6201 }
6202
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006203 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006204
6205 if (context)
6206 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00006207 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006208 if (!programBinary)
6209 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006210 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006211 }
6212
6213 if (!programBinary->setUniform3fv(location, count, v))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006214 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006215 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006216 }
6217 }
6218 }
6219 catch(std::bad_alloc&)
6220 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006221 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006222 }
6223}
6224
6225void __stdcall glUniform3i(GLint location, GLint x, GLint y, GLint z)
6226{
6227 GLint xyz[3] = {x, y, z};
6228
6229 glUniform3iv(location, 1, (GLint*)&xyz);
6230}
6231
6232void __stdcall glUniform3iv(GLint location, GLsizei count, const GLint* v)
6233{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006234 EVENT("(GLint location = %d, GLsizei count = %d, const GLint* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006235
6236 try
6237 {
6238 if (count < 0)
6239 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006240 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006241 }
6242
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006243 if (location == -1)
6244 {
6245 return;
6246 }
6247
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006248 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006249
6250 if (context)
6251 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00006252 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006253 if (!programBinary)
6254 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006255 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006256 }
6257
6258 if (!programBinary->setUniform3iv(location, count, v))
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006259 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006260 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006261 }
6262 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006263 }
6264 catch(std::bad_alloc&)
6265 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006266 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006267 }
6268}
6269
6270void __stdcall glUniform4f(GLint location, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
6271{
6272 GLfloat xyzw[4] = {x, y, z, w};
6273
6274 glUniform4fv(location, 1, (GLfloat*)&xyzw);
6275}
6276
6277void __stdcall glUniform4fv(GLint location, GLsizei count, const GLfloat* v)
6278{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006279 EVENT("(GLint location = %d, GLsizei count = %d, const GLfloat* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006280
6281 try
6282 {
6283 if (count < 0)
6284 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006285 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006286 }
6287
6288 if (location == -1)
6289 {
6290 return;
6291 }
6292
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006293 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006294
6295 if (context)
6296 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00006297 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006298 if (!programBinary)
6299 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006300 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006301 }
6302
6303 if (!programBinary->setUniform4fv(location, count, v))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006304 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006305 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006306 }
6307 }
6308 }
6309 catch(std::bad_alloc&)
6310 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006311 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006312 }
6313}
6314
6315void __stdcall glUniform4i(GLint location, GLint x, GLint y, GLint z, GLint w)
6316{
6317 GLint xyzw[4] = {x, y, z, w};
6318
6319 glUniform4iv(location, 1, (GLint*)&xyzw);
6320}
6321
6322void __stdcall glUniform4iv(GLint location, GLsizei count, const GLint* v)
6323{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006324 EVENT("(GLint location = %d, GLsizei count = %d, const GLint* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006325
6326 try
6327 {
6328 if (count < 0)
6329 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006330 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006331 }
6332
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006333 if (location == -1)
6334 {
6335 return;
6336 }
6337
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006338 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006339
6340 if (context)
6341 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00006342 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006343 if (!programBinary)
6344 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006345 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006346 }
6347
6348 if (!programBinary->setUniform4iv(location, count, v))
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006349 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006350 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006351 }
6352 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006353 }
6354 catch(std::bad_alloc&)
6355 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006356 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006357 }
6358}
6359
6360void __stdcall glUniformMatrix2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
6361{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006362 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00006363 location, count, transpose, value);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006364
6365 try
6366 {
6367 if (count < 0 || transpose != GL_FALSE)
6368 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006369 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006370 }
6371
6372 if (location == -1)
6373 {
6374 return;
6375 }
6376
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006377 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006378
6379 if (context)
6380 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00006381 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006382 if (!programBinary)
6383 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006384 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006385 }
6386
6387 if (!programBinary->setUniformMatrix2fv(location, count, value))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006388 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006389 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006390 }
6391 }
6392 }
6393 catch(std::bad_alloc&)
6394 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006395 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006396 }
6397}
6398
6399void __stdcall glUniformMatrix3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
6400{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006401 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00006402 location, count, transpose, value);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006403
6404 try
6405 {
6406 if (count < 0 || transpose != GL_FALSE)
6407 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006408 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006409 }
6410
6411 if (location == -1)
6412 {
6413 return;
6414 }
6415
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006416 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006417
6418 if (context)
6419 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00006420 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006421 if (!programBinary)
6422 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006423 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006424 }
6425
6426 if (!programBinary->setUniformMatrix3fv(location, count, value))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006427 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006428 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006429 }
6430 }
6431 }
6432 catch(std::bad_alloc&)
6433 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006434 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006435 }
6436}
6437
6438void __stdcall glUniformMatrix4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
6439{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006440 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00006441 location, count, transpose, value);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006442
6443 try
6444 {
6445 if (count < 0 || transpose != GL_FALSE)
6446 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006447 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006448 }
6449
6450 if (location == -1)
6451 {
6452 return;
6453 }
6454
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006455 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006456
6457 if (context)
6458 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00006459 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006460 if (!programBinary)
6461 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006462 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006463 }
6464
6465 if (!programBinary->setUniformMatrix4fv(location, count, value))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006466 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006467 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006468 }
6469 }
6470 }
6471 catch(std::bad_alloc&)
6472 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006473 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006474 }
6475}
6476
6477void __stdcall glUseProgram(GLuint program)
6478{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006479 EVENT("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006480
6481 try
6482 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006483 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006484
6485 if (context)
6486 {
6487 gl::Program *programObject = context->getProgram(program);
6488
daniel@transgaming.comc8478202010-04-13 19:53:35 +00006489 if (!programObject && program != 0)
6490 {
6491 if (context->getShader(program))
6492 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006493 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comc8478202010-04-13 19:53:35 +00006494 }
6495 else
6496 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006497 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comc8478202010-04-13 19:53:35 +00006498 }
6499 }
6500
daniel@transgaming.com716056c2012-07-24 18:38:59 +00006501 if (program != 0 && !programObject->isLinked())
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006502 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006503 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006504 }
6505
6506 context->useProgram(program);
6507 }
6508 }
6509 catch(std::bad_alloc&)
6510 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006511 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006512 }
6513}
6514
6515void __stdcall glValidateProgram(GLuint program)
6516{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006517 EVENT("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006518
6519 try
6520 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006521 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00006522
6523 if (context)
6524 {
6525 gl::Program *programObject = context->getProgram(program);
6526
6527 if (!programObject)
6528 {
6529 if (context->getShader(program))
6530 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006531 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00006532 }
6533 else
6534 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006535 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00006536 }
6537 }
6538
apatrick@chromium.org253b8d22012-06-22 19:27:21 +00006539 programObject->validate();
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00006540 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006541 }
6542 catch(std::bad_alloc&)
6543 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006544 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006545 }
6546}
6547
6548void __stdcall glVertexAttrib1f(GLuint index, GLfloat x)
6549{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006550 EVENT("(GLuint index = %d, GLfloat x = %f)", index, x);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006551
6552 try
6553 {
6554 if (index >= gl::MAX_VERTEX_ATTRIBS)
6555 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006556 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006557 }
6558
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006559 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006560
6561 if (context)
6562 {
6563 GLfloat vals[4] = { x, 0, 0, 1 };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00006564 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006565 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006566 }
6567 catch(std::bad_alloc&)
6568 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006569 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006570 }
6571}
6572
6573void __stdcall glVertexAttrib1fv(GLuint index, const GLfloat* values)
6574{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006575 EVENT("(GLuint index = %d, const GLfloat* values = 0x%0.8p)", index, values);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006576
6577 try
6578 {
6579 if (index >= gl::MAX_VERTEX_ATTRIBS)
6580 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006581 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006582 }
6583
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006584 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006585
6586 if (context)
6587 {
6588 GLfloat vals[4] = { values[0], 0, 0, 1 };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00006589 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006590 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006591 }
6592 catch(std::bad_alloc&)
6593 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006594 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006595 }
6596}
6597
6598void __stdcall glVertexAttrib2f(GLuint index, GLfloat x, GLfloat y)
6599{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006600 EVENT("(GLuint index = %d, GLfloat x = %f, GLfloat y = %f)", index, x, y);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006601
6602 try
6603 {
6604 if (index >= gl::MAX_VERTEX_ATTRIBS)
6605 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006606 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006607 }
6608
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006609 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006610
6611 if (context)
6612 {
6613 GLfloat vals[4] = { x, y, 0, 1 };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00006614 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006615 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006616 }
6617 catch(std::bad_alloc&)
6618 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006619 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006620 }
6621}
6622
6623void __stdcall glVertexAttrib2fv(GLuint index, const GLfloat* values)
6624{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006625 EVENT("(GLuint index = %d, const GLfloat* values = 0x%0.8p)", index, values);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006626
6627 try
6628 {
6629 if (index >= gl::MAX_VERTEX_ATTRIBS)
6630 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006631 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006632 }
6633
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006634 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006635
6636 if (context)
6637 {
6638 GLfloat vals[4] = { values[0], values[1], 0, 1 };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00006639 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006640 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006641 }
6642 catch(std::bad_alloc&)
6643 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006644 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006645 }
6646}
6647
6648void __stdcall glVertexAttrib3f(GLuint index, GLfloat x, GLfloat y, GLfloat z)
6649{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006650 EVENT("(GLuint index = %d, GLfloat x = %f, GLfloat y = %f, GLfloat z = %f)", index, x, y, z);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006651
6652 try
6653 {
6654 if (index >= gl::MAX_VERTEX_ATTRIBS)
6655 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006656 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006657 }
6658
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006659 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006660
6661 if (context)
6662 {
6663 GLfloat vals[4] = { x, y, z, 1 };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00006664 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006665 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006666 }
6667 catch(std::bad_alloc&)
6668 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006669 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006670 }
6671}
6672
6673void __stdcall glVertexAttrib3fv(GLuint index, const GLfloat* values)
6674{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006675 EVENT("(GLuint index = %d, const GLfloat* values = 0x%0.8p)", index, values);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006676
6677 try
6678 {
6679 if (index >= gl::MAX_VERTEX_ATTRIBS)
6680 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006681 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006682 }
6683
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006684 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006685
6686 if (context)
6687 {
6688 GLfloat vals[4] = { values[0], values[1], values[2], 1 };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00006689 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006690 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006691 }
6692 catch(std::bad_alloc&)
6693 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006694 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006695 }
6696}
6697
6698void __stdcall glVertexAttrib4f(GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
6699{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006700 EVENT("(GLuint index = %d, GLfloat x = %f, GLfloat y = %f, GLfloat z = %f, GLfloat w = %f)", index, x, y, z, w);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006701
6702 try
6703 {
6704 if (index >= gl::MAX_VERTEX_ATTRIBS)
6705 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006706 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006707 }
6708
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006709 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006710
6711 if (context)
6712 {
6713 GLfloat vals[4] = { x, y, z, w };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00006714 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006715 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006716 }
6717 catch(std::bad_alloc&)
6718 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006719 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006720 }
6721}
6722
6723void __stdcall glVertexAttrib4fv(GLuint index, const GLfloat* values)
6724{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006725 EVENT("(GLuint index = %d, const GLfloat* values = 0x%0.8p)", index, values);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006726
6727 try
6728 {
6729 if (index >= gl::MAX_VERTEX_ATTRIBS)
6730 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006731 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006732 }
6733
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006734 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006735
6736 if (context)
6737 {
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00006738 context->setVertexAttribf(index, values);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006739 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006740 }
6741 catch(std::bad_alloc&)
6742 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006743 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006744 }
6745}
6746
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00006747void __stdcall glVertexAttribDivisorANGLE(GLuint index, GLuint divisor)
6748{
6749 EVENT("(GLuint index = %d, GLuint divisor = %d)", index, divisor);
6750
6751 try
6752 {
6753 if (index >= gl::MAX_VERTEX_ATTRIBS)
6754 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006755 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00006756 }
6757
6758 gl::Context *context = gl::getNonLostContext();
6759
6760 if (context)
6761 {
6762 context->setVertexAttribDivisor(index, divisor);
6763 }
6764 }
6765 catch(std::bad_alloc&)
6766 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006767 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00006768 }
6769}
6770
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00006771void __stdcall glVertexAttribPointer(GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid* ptr)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006772{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006773 EVENT("(GLuint index = %d, GLint size = %d, GLenum type = 0x%X, "
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006774 "GLboolean normalized = %u, GLsizei stride = %d, const GLvoid* ptr = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00006775 index, size, type, normalized, stride, ptr);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006776
6777 try
6778 {
6779 if (index >= gl::MAX_VERTEX_ATTRIBS)
6780 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006781 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006782 }
6783
6784 if (size < 1 || size > 4)
6785 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006786 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006787 }
6788
shannon.woods%transgaming.com@gtempaccount.com1a4e09a2013-04-13 03:33:30 +00006789 gl::Context *context = gl::getNonLostContext();
6790
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006791 switch (type)
6792 {
6793 case GL_BYTE:
6794 case GL_UNSIGNED_BYTE:
6795 case GL_SHORT:
6796 case GL_UNSIGNED_SHORT:
6797 case GL_FIXED:
6798 case GL_FLOAT:
6799 break;
shannon.woods%transgaming.com@gtempaccount.com1a4e09a2013-04-13 03:33:30 +00006800 case GL_HALF_FLOAT:
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00006801 case GL_INT:
6802 case GL_UNSIGNED_INT:
shannon.woods%transgaming.com@gtempaccount.com1a4e09a2013-04-13 03:33:30 +00006803 if (context && context->getClientVersion() < 3)
6804 {
6805 return gl::error(GL_INVALID_ENUM);
6806 }
6807 else
6808 {
6809 break;
6810 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006811 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006812 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006813 }
6814
6815 if (stride < 0)
6816 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006817 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006818 }
6819
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006820 if (context)
6821 {
shannon.woods%transgaming.com@gtempaccount.com8de4e6a2013-04-13 03:37:44 +00006822 context->setVertexAttribState(index, context->getArrayBuffer(), size, type,
6823 normalized == GL_TRUE, false, stride, ptr);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006824 }
6825 }
6826 catch(std::bad_alloc&)
6827 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006828 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006829 }
6830}
6831
6832void __stdcall glViewport(GLint x, GLint y, GLsizei width, GLsizei height)
6833{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006834 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 +00006835
6836 try
6837 {
6838 if (width < 0 || height < 0)
6839 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006840 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006841 }
6842
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006843 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006844
6845 if (context)
6846 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00006847 context->setViewportParams(x, y, width, height);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006848 }
6849 }
6850 catch(std::bad_alloc&)
6851 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006852 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006853 }
6854}
6855
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006856// OpenGL ES 3.0 functions
6857
6858void __stdcall glReadBuffer(GLenum mode)
6859{
6860 EVENT("(GLenum mode = 0x%X)", mode);
6861
6862 try
6863 {
6864 gl::Context *context = gl::getNonLostContext();
6865
6866 if (context)
6867 {
6868 if (context->getClientVersion() < 3)
6869 {
6870 return gl::error(GL_INVALID_OPERATION);
6871 }
6872 }
6873
6874 UNIMPLEMENTED();
6875 }
6876 catch(std::bad_alloc&)
6877 {
6878 return gl::error(GL_OUT_OF_MEMORY);
6879 }
6880}
6881
6882void __stdcall glDrawRangeElements(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid* indices)
6883{
6884 EVENT("(GLenum mode = 0x%X, GLuint start = %u, GLuint end = %u, GLsizei count = %d, GLenum type = 0x%X, "
6885 "const GLvoid* indices = 0x%0.8p)", mode, start, end, count, type, indices);
6886
6887 try
6888 {
6889 gl::Context *context = gl::getNonLostContext();
6890
6891 if (context)
6892 {
6893 if (context->getClientVersion() < 3)
6894 {
6895 return gl::error(GL_INVALID_OPERATION);
6896 }
6897 }
6898
6899 UNIMPLEMENTED();
6900 }
6901 catch(std::bad_alloc&)
6902 {
6903 return gl::error(GL_OUT_OF_MEMORY);
6904 }
6905}
6906
6907void __stdcall glTexImage3D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid* pixels)
6908{
6909 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint internalformat = %d, GLsizei width = %d, "
6910 "GLsizei height = %d, GLsizei depth = %d, GLint border = %d, GLenum format = 0x%X, "
6911 "GLenum type = 0x%X, const GLvoid* pixels = 0x%0.8p)",
6912 target, level, internalformat, width, height, depth, border, format, type, pixels);
6913
6914 try
6915 {
6916 gl::Context *context = gl::getNonLostContext();
6917
6918 if (context)
6919 {
6920 if (context->getClientVersion() < 3)
6921 {
6922 return gl::error(GL_INVALID_OPERATION);
6923 }
6924 }
6925
6926 UNIMPLEMENTED();
6927 }
6928 catch(std::bad_alloc&)
6929 {
6930 return gl::error(GL_OUT_OF_MEMORY);
6931 }
6932}
6933
6934void __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)
6935{
6936 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
6937 "GLint zoffset = %d, GLsizei width = %d, GLsizei height = %d, GLsizei depth = %d, "
6938 "GLenum format = 0x%X, GLenum type = 0x%X, const GLvoid* pixels = 0x%0.8p)",
6939 target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels);
6940
6941 try
6942 {
6943 gl::Context *context = gl::getNonLostContext();
6944
6945 if (context)
6946 {
6947 if (context->getClientVersion() < 3)
6948 {
6949 return gl::error(GL_INVALID_OPERATION);
6950 }
6951 }
6952
6953 UNIMPLEMENTED();
6954 }
6955 catch(std::bad_alloc&)
6956 {
6957 return gl::error(GL_OUT_OF_MEMORY);
6958 }
6959}
6960
6961void __stdcall glCopyTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height)
6962{
6963 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
6964 "GLint zoffset = %d, GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d)",
6965 target, level, xoffset, yoffset, zoffset, x, y, width, height);
6966
6967 try
6968 {
6969 gl::Context *context = gl::getNonLostContext();
6970
6971 if (context)
6972 {
6973 if (context->getClientVersion() < 3)
6974 {
6975 return gl::error(GL_INVALID_OPERATION);
6976 }
6977 }
6978
6979 UNIMPLEMENTED();
6980 }
6981 catch(std::bad_alloc&)
6982 {
6983 return gl::error(GL_OUT_OF_MEMORY);
6984 }
6985}
6986
6987void __stdcall glCompressedTexImage3D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid* data)
6988{
6989 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint internalformat = %d, GLsizei width = %d, "
6990 "GLsizei height = %d, GLsizei depth = %d, GLint border = %d, GLsizei imageSize = %d, "
6991 "const GLvoid* data = 0x%0.8p)",
6992 target, level, internalformat, width, height, depth, border, imageSize, data);
6993
6994 try
6995 {
6996 gl::Context *context = gl::getNonLostContext();
6997
6998 if (context)
6999 {
7000 if (context->getClientVersion() < 3)
7001 {
7002 return gl::error(GL_INVALID_OPERATION);
7003 }
7004 }
7005
7006 UNIMPLEMENTED();
7007 }
7008 catch(std::bad_alloc&)
7009 {
7010 return gl::error(GL_OUT_OF_MEMORY);
7011 }
7012}
7013
7014void __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)
7015{
7016 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
7017 "GLint zoffset = %d, GLsizei width = %d, GLsizei height = %d, GLsizei depth = %d, "
7018 "GLenum format = 0x%X, GLsizei imageSize = %d, const GLvoid* data = 0x%0.8p)",
7019 target, level, xoffset, yoffset, zoffset, width, height, depth, format, imageSize, data);
7020
7021 try
7022 {
7023 gl::Context *context = gl::getNonLostContext();
7024
7025 if (context)
7026 {
7027 if (context->getClientVersion() < 3)
7028 {
7029 return gl::error(GL_INVALID_OPERATION);
7030 }
7031 }
7032
7033 UNIMPLEMENTED();
7034 }
7035 catch(std::bad_alloc&)
7036 {
7037 return gl::error(GL_OUT_OF_MEMORY);
7038 }
7039}
7040
7041void __stdcall glGenQueries(GLsizei n, GLuint* ids)
7042{
7043 EVENT("(GLsizei n = %d, GLuint* ids = 0x%0.8p)", n, ids);
7044
7045 try
7046 {
7047 gl::Context *context = gl::getNonLostContext();
7048
7049 if (context)
7050 {
7051 if (context->getClientVersion() < 3)
7052 {
7053 return gl::error(GL_INVALID_OPERATION);
7054 }
7055 }
7056
7057 UNIMPLEMENTED();
7058 }
7059 catch(std::bad_alloc&)
7060 {
7061 return gl::error(GL_OUT_OF_MEMORY);
7062 }
7063}
7064
7065void __stdcall glDeleteQueries(GLsizei n, const GLuint* ids)
7066{
7067 EVENT("(GLsizei n = %d, GLuint* ids = 0x%0.8p)", n, ids);
7068
7069 try
7070 {
7071 gl::Context *context = gl::getNonLostContext();
7072
7073 if (context)
7074 {
7075 if (context->getClientVersion() < 3)
7076 {
7077 return gl::error(GL_INVALID_OPERATION);
7078 }
7079 }
7080
7081 UNIMPLEMENTED();
7082 }
7083 catch(std::bad_alloc&)
7084 {
7085 return gl::error(GL_OUT_OF_MEMORY);
7086 }
7087}
7088
7089GLboolean __stdcall glIsQuery(GLuint id)
7090{
7091 EVENT("(GLuint id = %u)", id);
7092
7093 try
7094 {
7095 gl::Context *context = gl::getNonLostContext();
7096
7097 if (context)
7098 {
7099 if (context->getClientVersion() < 3)
7100 {
7101 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
7102 }
7103 }
7104
7105 UNIMPLEMENTED();
7106 }
7107 catch(std::bad_alloc&)
7108 {
7109 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
7110 }
7111
7112 return GL_FALSE;
7113}
7114
7115void __stdcall glBeginQuery(GLenum target, GLuint id)
7116{
7117 EVENT("(GLenum target = 0x%X, GLuint id = %u)", target, id);
7118
7119 try
7120 {
7121 gl::Context *context = gl::getNonLostContext();
7122
7123 if (context)
7124 {
7125 if (context->getClientVersion() < 3)
7126 {
7127 return gl::error(GL_INVALID_OPERATION);
7128 }
7129 }
7130
7131 UNIMPLEMENTED();
7132 }
7133 catch(std::bad_alloc&)
7134 {
7135 return gl::error(GL_OUT_OF_MEMORY);
7136 }
7137}
7138
7139void __stdcall glEndQuery(GLenum target)
7140{
7141 EVENT("(GLenum target = 0x%X)", target);
7142
7143 try
7144 {
7145 gl::Context *context = gl::getNonLostContext();
7146
7147 if (context)
7148 {
7149 if (context->getClientVersion() < 3)
7150 {
7151 return gl::error(GL_INVALID_OPERATION);
7152 }
7153 }
7154
7155 UNIMPLEMENTED();
7156 }
7157 catch(std::bad_alloc&)
7158 {
7159 return gl::error(GL_OUT_OF_MEMORY);
7160 }
7161}
7162
7163void __stdcall glGetQueryiv(GLenum target, GLenum pname, GLint* params)
7164{
7165 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLint* params = 0x%0.8p)", target, pname, params);
7166
7167 try
7168 {
7169 gl::Context *context = gl::getNonLostContext();
7170
7171 if (context)
7172 {
7173 if (context->getClientVersion() < 3)
7174 {
7175 return gl::error(GL_INVALID_OPERATION);
7176 }
7177 }
7178
7179 UNIMPLEMENTED();
7180 }
7181 catch(std::bad_alloc&)
7182 {
7183 return gl::error(GL_OUT_OF_MEMORY);
7184 }
7185}
7186
7187void __stdcall glGetQueryObjectuiv(GLuint id, GLenum pname, GLuint* params)
7188{
7189 EVENT("(GLuint id = %u, GLenum pname = 0x%X, GLint* params = 0x%0.8p)", id, pname, params);
7190
7191 try
7192 {
7193 gl::Context *context = gl::getNonLostContext();
7194
7195 if (context)
7196 {
7197 if (context->getClientVersion() < 3)
7198 {
7199 return gl::error(GL_INVALID_OPERATION);
7200 }
7201 }
7202
7203 UNIMPLEMENTED();
7204 }
7205 catch(std::bad_alloc&)
7206 {
7207 return gl::error(GL_OUT_OF_MEMORY);
7208 }
7209}
7210
7211GLboolean __stdcall glUnmapBuffer(GLenum target)
7212{
7213 EVENT("(GLenum target = 0x%X)", target);
7214
7215 try
7216 {
7217 gl::Context *context = gl::getNonLostContext();
7218
7219 if (context)
7220 {
7221 if (context->getClientVersion() < 3)
7222 {
7223 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
7224 }
7225 }
7226
7227 UNIMPLEMENTED();
7228 }
7229 catch(std::bad_alloc&)
7230 {
7231 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
7232 }
7233
7234 return GL_FALSE;
7235}
7236
7237void __stdcall glGetBufferPointerv(GLenum target, GLenum pname, GLvoid** params)
7238{
7239 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLvoid** params = 0x%0.8p)", target, pname, params);
7240
7241 try
7242 {
7243 gl::Context *context = gl::getNonLostContext();
7244
7245 if (context)
7246 {
7247 if (context->getClientVersion() < 3)
7248 {
7249 return gl::error(GL_INVALID_OPERATION);
7250 }
7251 }
7252
7253 UNIMPLEMENTED();
7254 }
7255 catch(std::bad_alloc&)
7256 {
7257 return gl::error(GL_OUT_OF_MEMORY);
7258 }
7259}
7260
7261void __stdcall glDrawBuffers(GLsizei n, const GLenum* bufs)
7262{
7263 EVENT("(GLsizei n = %d, const GLenum* bufs = 0x%0.8p)", n, bufs);
7264
7265 try
7266 {
7267 gl::Context *context = gl::getNonLostContext();
7268
7269 if (context)
7270 {
7271 if (context->getClientVersion() < 3)
7272 {
7273 return gl::error(GL_INVALID_OPERATION);
7274 }
7275 }
7276
7277 UNIMPLEMENTED();
7278 }
7279 catch(std::bad_alloc&)
7280 {
7281 return gl::error(GL_OUT_OF_MEMORY);
7282 }
7283}
7284
7285void __stdcall glUniformMatrix2x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
7286{
7287 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
7288 location, count, transpose, value);
7289
7290 try
7291 {
7292 gl::Context *context = gl::getNonLostContext();
7293
7294 if (context)
7295 {
7296 if (context->getClientVersion() < 3)
7297 {
7298 return gl::error(GL_INVALID_OPERATION);
7299 }
7300 }
7301
7302 UNIMPLEMENTED();
7303 }
7304 catch(std::bad_alloc&)
7305 {
7306 return gl::error(GL_OUT_OF_MEMORY);
7307 }
7308}
7309
7310void __stdcall glUniformMatrix3x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
7311{
7312 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
7313 location, count, transpose, value);
7314
7315 try
7316 {
7317 gl::Context *context = gl::getNonLostContext();
7318
7319 if (context)
7320 {
7321 if (context->getClientVersion() < 3)
7322 {
7323 return gl::error(GL_INVALID_OPERATION);
7324 }
7325 }
7326
7327 UNIMPLEMENTED();
7328 }
7329 catch(std::bad_alloc&)
7330 {
7331 return gl::error(GL_OUT_OF_MEMORY);
7332 }
7333}
7334
7335void __stdcall glUniformMatrix2x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
7336{
7337 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
7338 location, count, transpose, value);
7339
7340 try
7341 {
7342 gl::Context *context = gl::getNonLostContext();
7343
7344 if (context)
7345 {
7346 if (context->getClientVersion() < 3)
7347 {
7348 return gl::error(GL_INVALID_OPERATION);
7349 }
7350 }
7351
7352 UNIMPLEMENTED();
7353 }
7354 catch(std::bad_alloc&)
7355 {
7356 return gl::error(GL_OUT_OF_MEMORY);
7357 }
7358}
7359
7360void __stdcall glUniformMatrix4x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
7361{
7362 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
7363 location, count, transpose, value);
7364
7365 try
7366 {
7367 gl::Context *context = gl::getNonLostContext();
7368
7369 if (context)
7370 {
7371 if (context->getClientVersion() < 3)
7372 {
7373 return gl::error(GL_INVALID_OPERATION);
7374 }
7375 }
7376
7377 UNIMPLEMENTED();
7378 }
7379 catch(std::bad_alloc&)
7380 {
7381 return gl::error(GL_OUT_OF_MEMORY);
7382 }
7383}
7384
7385void __stdcall glUniformMatrix3x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
7386{
7387 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
7388 location, count, transpose, value);
7389
7390 try
7391 {
7392 gl::Context *context = gl::getNonLostContext();
7393
7394 if (context)
7395 {
7396 if (context->getClientVersion() < 3)
7397 {
7398 return gl::error(GL_INVALID_OPERATION);
7399 }
7400 }
7401
7402 UNIMPLEMENTED();
7403 }
7404 catch(std::bad_alloc&)
7405 {
7406 return gl::error(GL_OUT_OF_MEMORY);
7407 }
7408}
7409
7410void __stdcall glUniformMatrix4x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
7411{
7412 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
7413 location, count, transpose, value);
7414
7415 try
7416 {
7417 gl::Context *context = gl::getNonLostContext();
7418
7419 if (context)
7420 {
7421 if (context->getClientVersion() < 3)
7422 {
7423 return gl::error(GL_INVALID_OPERATION);
7424 }
7425 }
7426
7427 UNIMPLEMENTED();
7428 }
7429 catch(std::bad_alloc&)
7430 {
7431 return gl::error(GL_OUT_OF_MEMORY);
7432 }
7433}
7434
7435void __stdcall glBlitFramebuffer(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter)
7436{
7437 EVENT("(GLint srcX0 = %d, GLint srcY0 = %d, GLint srcX1 = %d, GLint srcY1 = %d, GLint dstX0 = %d, "
7438 "GLint dstY0 = %d, GLint dstX1 = %d, GLint dstY1 = %d, GLbitfield mask = 0x%X, GLenum filter = 0x%X)",
7439 srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter);
7440
7441 try
7442 {
7443 gl::Context *context = gl::getNonLostContext();
7444
7445 if (context)
7446 {
7447 if (context->getClientVersion() < 3)
7448 {
7449 return gl::error(GL_INVALID_OPERATION);
7450 }
7451 }
7452
7453 UNIMPLEMENTED();
7454 }
7455 catch(std::bad_alloc&)
7456 {
7457 return gl::error(GL_OUT_OF_MEMORY);
7458 }
7459}
7460
7461void __stdcall glRenderbufferStorageMultisample(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height)
7462{
7463 EVENT("(GLenum target = 0x%X, GLsizei samples = %d, GLenum internalformat = 0x%X, GLsizei width = %d, GLsizei height = %d)",
7464 target, samples, internalformat, width, height);
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);
7475 }
7476 }
7477
7478 UNIMPLEMENTED();
7479 }
7480 catch(std::bad_alloc&)
7481 {
7482 return gl::error(GL_OUT_OF_MEMORY);
7483 }
7484}
7485
7486void __stdcall glFramebufferTextureLayer(GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer)
7487{
7488 EVENT("(GLenum target = 0x%X, GLenum attachment = 0x%X, GLuint texture = %u, GLint level = %d, GLint layer = %d)",
7489 target, attachment, texture, level, layer);
7490
7491 try
7492 {
7493 gl::Context *context = gl::getNonLostContext();
7494
7495 if (context)
7496 {
7497 if (context->getClientVersion() < 3)
7498 {
7499 return gl::error(GL_INVALID_OPERATION);
7500 }
7501 }
7502
7503 UNIMPLEMENTED();
7504 }
7505 catch(std::bad_alloc&)
7506 {
7507 return gl::error(GL_OUT_OF_MEMORY);
7508 }
7509}
7510
7511GLvoid* __stdcall glMapBufferRange(GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access)
7512{
7513 EVENT("(GLenum target = 0x%X, GLintptr offset = %d, GLsizeiptr length = %d, GLbitfield access = 0x%X)",
7514 target, offset, length, access);
7515
7516 try
7517 {
7518 gl::Context *context = gl::getNonLostContext();
7519
7520 if (context)
7521 {
7522 if (context->getClientVersion() < 3)
7523 {
7524 return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLvoid*>(NULL));
7525 }
7526 }
7527
7528 UNIMPLEMENTED();
7529 }
7530 catch(std::bad_alloc&)
7531 {
7532 return gl::error(GL_OUT_OF_MEMORY, reinterpret_cast<GLvoid*>(NULL));
7533 }
7534
7535 return NULL;
7536}
7537
7538void __stdcall glFlushMappedBufferRange(GLenum target, GLintptr offset, GLsizeiptr length)
7539{
7540 EVENT("(GLenum target = 0x%X, GLintptr offset = %d, GLsizeiptr length = %d)", target, offset, length);
7541
7542 try
7543 {
7544 gl::Context *context = gl::getNonLostContext();
7545
7546 if (context)
7547 {
7548 if (context->getClientVersion() < 3)
7549 {
7550 return gl::error(GL_INVALID_OPERATION);
7551 }
7552 }
7553
7554 UNIMPLEMENTED();
7555 }
7556 catch(std::bad_alloc&)
7557 {
7558 return gl::error(GL_OUT_OF_MEMORY);
7559 }
7560}
7561
7562void __stdcall glBindVertexArray(GLuint array)
7563{
7564 EVENT("(GLuint array = %u)", array);
7565
7566 try
7567 {
7568 gl::Context *context = gl::getNonLostContext();
7569
7570 if (context)
7571 {
7572 if (context->getClientVersion() < 3)
7573 {
7574 return gl::error(GL_INVALID_OPERATION);
7575 }
7576 }
7577
7578 UNIMPLEMENTED();
7579 }
7580 catch(std::bad_alloc&)
7581 {
7582 return gl::error(GL_OUT_OF_MEMORY);
7583 }
7584}
7585
7586void __stdcall glDeleteVertexArrays(GLsizei n, const GLuint* arrays)
7587{
7588 EVENT("(GLsizei n = %d, const GLuint* arrays = 0x%0.8p)", n, arrays);
7589
7590 try
7591 {
7592 gl::Context *context = gl::getNonLostContext();
7593
7594 if (context)
7595 {
7596 if (context->getClientVersion() < 3)
7597 {
7598 return gl::error(GL_INVALID_OPERATION);
7599 }
7600 }
7601
7602 UNIMPLEMENTED();
7603 }
7604 catch(std::bad_alloc&)
7605 {
7606 return gl::error(GL_OUT_OF_MEMORY);
7607 }
7608}
7609
7610void __stdcall glGenVertexArrays(GLsizei n, GLuint* arrays)
7611{
7612 EVENT("(GLsizei n = %d, GLuint* arrays = 0x%0.8p)", n, arrays);
7613
7614 try
7615 {
7616 gl::Context *context = gl::getNonLostContext();
7617
7618 if (context)
7619 {
7620 if (context->getClientVersion() < 3)
7621 {
7622 return gl::error(GL_INVALID_OPERATION);
7623 }
7624 }
7625
7626 UNIMPLEMENTED();
7627 }
7628 catch(std::bad_alloc&)
7629 {
7630 return gl::error(GL_OUT_OF_MEMORY);
7631 }
7632}
7633
7634GLboolean __stdcall glIsVertexArray(GLuint array)
7635{
7636 EVENT("(GLuint array = %u)", array);
7637
7638 try
7639 {
7640 gl::Context *context = gl::getNonLostContext();
7641
7642 if (context)
7643 {
7644 if (context->getClientVersion() < 3)
7645 {
7646 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
7647 }
7648 }
7649
7650 UNIMPLEMENTED();
7651 }
7652 catch(std::bad_alloc&)
7653 {
7654 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
7655 }
7656
7657 return GL_FALSE;
7658}
7659
7660void __stdcall glGetIntegeri_v(GLenum target, GLuint index, GLint* data)
7661{
7662 EVENT("(GLenum target = 0x%X, GLuint index = %u, GLint* data = 0x%0.8p)",
7663 target, index, data);
7664
7665 try
7666 {
7667 gl::Context *context = gl::getNonLostContext();
7668
7669 if (context)
7670 {
7671 if (context->getClientVersion() < 3)
7672 {
7673 return gl::error(GL_INVALID_OPERATION);
7674 }
7675 }
7676
7677 UNIMPLEMENTED();
7678 }
7679 catch(std::bad_alloc&)
7680 {
7681 return gl::error(GL_OUT_OF_MEMORY);
7682 }
7683}
7684
7685void __stdcall glBeginTransformFeedback(GLenum primitiveMode)
7686{
7687 EVENT("(GLenum primitiveMode = 0x%X)", primitiveMode);
7688
7689 try
7690 {
7691 gl::Context *context = gl::getNonLostContext();
7692
7693 if (context)
7694 {
7695 if (context->getClientVersion() < 3)
7696 {
7697 return gl::error(GL_INVALID_OPERATION);
7698 }
7699 }
7700
7701 UNIMPLEMENTED();
7702 }
7703 catch(std::bad_alloc&)
7704 {
7705 return gl::error(GL_OUT_OF_MEMORY);
7706 }
7707}
7708
7709void __stdcall glEndTransformFeedback(void)
7710{
7711 EVENT("(void)");
7712
7713 try
7714 {
7715 gl::Context *context = gl::getNonLostContext();
7716
7717 if (context)
7718 {
7719 if (context->getClientVersion() < 3)
7720 {
7721 return gl::error(GL_INVALID_OPERATION);
7722 }
7723 }
7724
7725 UNIMPLEMENTED();
7726 }
7727 catch(std::bad_alloc&)
7728 {
7729 return gl::error(GL_OUT_OF_MEMORY);
7730 }
7731}
7732
7733void __stdcall glBindBufferRange(GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size)
7734{
7735 EVENT("(GLenum target = 0x%X, GLuint index = %u, GLuint buffer = %u, GLintptr offset = %d, GLsizeiptr size = %d)",
7736 target, index, buffer, offset, size);
7737
7738 try
7739 {
7740 gl::Context *context = gl::getNonLostContext();
7741
7742 if (context)
7743 {
7744 if (context->getClientVersion() < 3)
7745 {
7746 return gl::error(GL_INVALID_OPERATION);
7747 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007748
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007749 switch (target)
7750 {
7751 case GL_TRANSFORM_FEEDBACK_BUFFER:
7752 if (index > context->getMaxTransformFeedbackBufferBindings())
7753 {
7754 return gl::error(GL_INVALID_VALUE);
7755 }
7756 break;
7757
7758 case GL_UNIFORM_BUFFER:
7759 if (index >= context->getMaximumCombinedUniformBufferBindings())
7760 {
7761 return gl::error(GL_INVALID_VALUE);
7762 }
7763 break;
7764
7765 default:
7766 return gl::error(GL_INVALID_ENUM);
7767 }
7768
7769 gl::Buffer *bufferObject = context->getBuffer(buffer);
7770 if (!bufferObject)
7771 {
7772 // Buffer index must not have been valid
7773 return gl::error(GL_INVALID_VALUE);
7774 }
7775
7776 if (size <= 0 || static_cast<unsigned int>(offset + size) > bufferObject->size())
7777 {
7778 return gl::error(GL_INVALID_VALUE);
7779 }
7780
7781 switch (target)
7782 {
7783 case GL_TRANSFORM_FEEDBACK_BUFFER:
7784 context->bindTransformFeedbackBuffer(buffer, index, offset, size);
7785 break;
7786
7787 case GL_UNIFORM_BUFFER:
7788 context->bindUniformBuffer(buffer, index, offset, size);
7789 break;
7790
7791 default:
7792 UNREACHABLE();
7793 }
7794 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007795 }
7796 catch(std::bad_alloc&)
7797 {
7798 return gl::error(GL_OUT_OF_MEMORY);
7799 }
7800}
7801
7802void __stdcall glBindBufferBase(GLenum target, GLuint index, GLuint buffer)
7803{
7804 EVENT("(GLenum target = 0x%X, GLuint index = %u, GLuint buffer = %u)",
7805 target, index, buffer);
7806
7807 try
7808 {
7809 gl::Context *context = gl::getNonLostContext();
7810
7811 if (context)
7812 {
7813 if (context->getClientVersion() < 3)
7814 {
7815 return gl::error(GL_INVALID_OPERATION);
7816 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007817
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007818 switch (target)
7819 {
7820 case GL_TRANSFORM_FEEDBACK_BUFFER:
7821 if (index > context->getMaxTransformFeedbackBufferBindings())
7822 {
7823 return gl::error(GL_INVALID_VALUE);
7824 }
7825 break;
7826
7827 case GL_UNIFORM_BUFFER:
7828 if (index > context->getMaximumCombinedUniformBufferBindings())
7829 {
7830 return gl::error(GL_INVALID_VALUE);
7831 }
7832 break;
7833
7834 default:
7835 return gl::error(GL_INVALID_ENUM);
7836 }
7837
7838 gl::Buffer *bufferObject = context->getBuffer(buffer);
7839 if (!bufferObject)
7840 {
7841 // Buffer index must not have been valid
7842 return gl::error(GL_INVALID_VALUE);
7843 }
7844
7845 switch (target)
7846 {
7847 case GL_TRANSFORM_FEEDBACK_BUFFER:
7848 context->bindTransformFeedbackBuffer(buffer, index, 0, -1);
7849 break;
7850
7851 case GL_UNIFORM_BUFFER:
7852 context->bindUniformBuffer(buffer, index, 0, -1);
7853 break;
7854
7855 default:
7856 UNREACHABLE();
7857 }
7858 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007859 }
7860 catch(std::bad_alloc&)
7861 {
7862 return gl::error(GL_OUT_OF_MEMORY);
7863 }
7864}
7865
7866void __stdcall glTransformFeedbackVaryings(GLuint program, GLsizei count, const GLchar* const* varyings, GLenum bufferMode)
7867{
7868 EVENT("(GLuint program = %u, GLsizei count = %d, const GLchar* const* varyings = 0x%0.8p, GLenum bufferMode = 0x%X)",
7869 program, count, varyings, bufferMode);
7870
7871 try
7872 {
7873 gl::Context *context = gl::getNonLostContext();
7874
7875 if (context)
7876 {
7877 if (context->getClientVersion() < 3)
7878 {
7879 return gl::error(GL_INVALID_OPERATION);
7880 }
7881 }
7882
7883 UNIMPLEMENTED();
7884 }
7885 catch(std::bad_alloc&)
7886 {
7887 return gl::error(GL_OUT_OF_MEMORY);
7888 }
7889}
7890
7891void __stdcall glGetTransformFeedbackVarying(GLuint program, GLuint index, GLsizei bufSize, GLsizei* length, GLsizei* size, GLenum* type, GLchar* name)
7892{
7893 EVENT("(GLuint program = %u, GLuint index = %u, GLsizei bufSize = %d, GLsizei* length = 0x%0.8p, "
7894 "GLsizei* size = 0x%0.8p, GLenum* type = 0x%0.8p, GLchar* name = 0x%0.8p)",
7895 program, index, bufSize, length, size, type, name);
7896
7897 try
7898 {
7899 gl::Context *context = gl::getNonLostContext();
7900
7901 if (context)
7902 {
7903 if (context->getClientVersion() < 3)
7904 {
7905 return gl::error(GL_INVALID_OPERATION);
7906 }
7907 }
7908
7909 UNIMPLEMENTED();
7910 }
7911 catch(std::bad_alloc&)
7912 {
7913 return gl::error(GL_OUT_OF_MEMORY);
7914 }
7915}
7916
7917void __stdcall glVertexAttribIPointer(GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid* pointer)
7918{
7919 EVENT("(GLuint index = %u, GLint size = %d, GLenum type = 0x%X, GLsizei stride = %d, const GLvoid* pointer = 0x%0.8p)",
7920 index, size, type, stride, pointer);
7921
7922 try
7923 {
7924 gl::Context *context = gl::getNonLostContext();
7925
7926 if (context)
7927 {
7928 if (context->getClientVersion() < 3)
7929 {
7930 return gl::error(GL_INVALID_OPERATION);
7931 }
7932 }
7933
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007934 if (index >= gl::MAX_VERTEX_ATTRIBS)
7935 {
7936 return gl::error(GL_INVALID_VALUE);
7937 }
7938
7939 if (size < 1 || size > 4)
7940 {
7941 return gl::error(GL_INVALID_VALUE);
7942 }
7943
7944 switch (type)
7945 {
7946 case GL_BYTE:
7947 case GL_UNSIGNED_BYTE:
7948 case GL_SHORT:
7949 case GL_UNSIGNED_SHORT:
7950 case GL_INT:
7951 case GL_UNSIGNED_INT:
7952 break;
7953 default:
7954 return gl::error(GL_INVALID_ENUM);
7955 }
7956
7957 if (stride < 0)
7958 {
7959 return gl::error(GL_INVALID_VALUE);
7960 }
7961
7962 if (context)
7963 {
7964 context->setVertexAttribState(index, context->getArrayBuffer(), size, type, false, true,
7965 stride, pointer);
7966 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007967 }
7968 catch(std::bad_alloc&)
7969 {
7970 return gl::error(GL_OUT_OF_MEMORY);
7971 }
7972}
7973
7974void __stdcall glGetVertexAttribIiv(GLuint index, GLenum pname, GLint* params)
7975{
7976 EVENT("(GLuint index = %u, GLenum pname = 0x%X, GLint* params = 0x%0.8p)",
7977 index, pname, params);
7978
7979 try
7980 {
7981 gl::Context *context = gl::getNonLostContext();
7982
7983 if (context)
7984 {
7985 if (context->getClientVersion() < 3)
7986 {
7987 return gl::error(GL_INVALID_OPERATION);
7988 }
7989 }
7990
7991 UNIMPLEMENTED();
7992 }
7993 catch(std::bad_alloc&)
7994 {
7995 return gl::error(GL_OUT_OF_MEMORY);
7996 }
7997}
7998
7999void __stdcall glGetVertexAttribIuiv(GLuint index, GLenum pname, GLuint* params)
8000{
8001 EVENT("(GLuint index = %u, GLenum pname = 0x%X, GLuint* params = 0x%0.8p)",
8002 index, pname, params);
8003
8004 try
8005 {
8006 gl::Context *context = gl::getNonLostContext();
8007
8008 if (context)
8009 {
8010 if (context->getClientVersion() < 3)
8011 {
8012 return gl::error(GL_INVALID_OPERATION);
8013 }
8014 }
8015
8016 UNIMPLEMENTED();
8017 }
8018 catch(std::bad_alloc&)
8019 {
8020 return gl::error(GL_OUT_OF_MEMORY);
8021 }
8022}
8023
8024void __stdcall glVertexAttribI4i(GLuint index, GLint x, GLint y, GLint z, GLint w)
8025{
8026 EVENT("(GLuint index = %u, GLint x = %d, GLint y = %d, GLint z = %d, GLint w = %d)",
8027 index, x, y, z, w);
8028
8029 try
8030 {
8031 gl::Context *context = gl::getNonLostContext();
8032
8033 if (context)
8034 {
8035 if (context->getClientVersion() < 3)
8036 {
8037 return gl::error(GL_INVALID_OPERATION);
8038 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008039
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00008040 if (index >= gl::MAX_VERTEX_ATTRIBS)
8041 {
8042 return gl::error(GL_INVALID_VALUE);
8043 }
8044
8045 GLint vals[4] = { x, y, z, w };
8046 context->setVertexAttribi(index, vals);
8047 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008048 }
8049 catch(std::bad_alloc&)
8050 {
8051 return gl::error(GL_OUT_OF_MEMORY);
8052 }
8053}
8054
8055void __stdcall glVertexAttribI4ui(GLuint index, GLuint x, GLuint y, GLuint z, GLuint w)
8056{
8057 EVENT("(GLuint index = %u, GLuint x = %u, GLuint y = %u, GLuint z = %u, GLuint w = %u)",
8058 index, x, y, z, w);
8059
8060 try
8061 {
8062 gl::Context *context = gl::getNonLostContext();
8063
8064 if (context)
8065 {
8066 if (context->getClientVersion() < 3)
8067 {
8068 return gl::error(GL_INVALID_OPERATION);
8069 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008070
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00008071 if (index >= gl::MAX_VERTEX_ATTRIBS)
8072 {
8073 return gl::error(GL_INVALID_VALUE);
8074 }
8075
8076 GLuint vals[4] = { x, y, z, w };
8077 context->setVertexAttribu(index, vals);
8078 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008079 }
8080 catch(std::bad_alloc&)
8081 {
8082 return gl::error(GL_OUT_OF_MEMORY);
8083 }
8084}
8085
8086void __stdcall glVertexAttribI4iv(GLuint index, const GLint* v)
8087{
8088 EVENT("(GLuint index = %u, const GLint* v = 0x%0.8p)", index, v);
8089
8090 try
8091 {
8092 gl::Context *context = gl::getNonLostContext();
8093
8094 if (context)
8095 {
8096 if (context->getClientVersion() < 3)
8097 {
8098 return gl::error(GL_INVALID_OPERATION);
8099 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008100
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00008101 if (index >= gl::MAX_VERTEX_ATTRIBS)
8102 {
8103 return gl::error(GL_INVALID_VALUE);
8104 }
8105
8106 context->setVertexAttribi(index, v);
8107 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008108 }
8109 catch(std::bad_alloc&)
8110 {
8111 return gl::error(GL_OUT_OF_MEMORY);
8112 }
8113}
8114
8115void __stdcall glVertexAttribI4uiv(GLuint index, const GLuint* v)
8116{
8117 EVENT("(GLuint index = %u, const GLuint* v = 0x%0.8p)", index, v);
8118
8119 try
8120 {
8121 gl::Context *context = gl::getNonLostContext();
8122
8123 if (context)
8124 {
8125 if (context->getClientVersion() < 3)
8126 {
8127 return gl::error(GL_INVALID_OPERATION);
8128 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008129
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00008130 if (index >= gl::MAX_VERTEX_ATTRIBS)
8131 {
8132 return gl::error(GL_INVALID_VALUE);
8133 }
8134
8135 context->setVertexAttribu(index, v);
8136 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008137 }
8138 catch(std::bad_alloc&)
8139 {
8140 return gl::error(GL_OUT_OF_MEMORY);
8141 }
8142}
8143
8144void __stdcall glGetUniformuiv(GLuint program, GLint location, GLuint* params)
8145{
8146 EVENT("(GLuint program = %u, GLint location = %d, GLuint* params = 0x%0.8p)",
8147 program, location, params);
8148
8149 try
8150 {
8151 gl::Context *context = gl::getNonLostContext();
8152
8153 if (context)
8154 {
8155 if (context->getClientVersion() < 3)
8156 {
8157 return gl::error(GL_INVALID_OPERATION);
8158 }
8159 }
8160
8161 UNIMPLEMENTED();
8162 }
8163 catch(std::bad_alloc&)
8164 {
8165 return gl::error(GL_OUT_OF_MEMORY);
8166 }
8167}
8168
8169GLint __stdcall glGetFragDataLocation(GLuint program, const GLchar *name)
8170{
8171 EVENT("(GLuint program = %u, const GLchar *name = 0x%0.8p)",
8172 program, name);
8173
8174 try
8175 {
8176 gl::Context *context = gl::getNonLostContext();
8177
8178 if (context)
8179 {
8180 if (context->getClientVersion() < 3)
8181 {
8182 return gl::error(GL_INVALID_OPERATION, 0);
8183 }
8184 }
8185
8186 UNIMPLEMENTED();
8187 }
8188 catch(std::bad_alloc&)
8189 {
8190 return gl::error(GL_OUT_OF_MEMORY, 0);
8191 }
8192
8193 return 0;
8194}
8195
8196void __stdcall glUniform1ui(GLint location, GLuint v0)
8197{
8198 EVENT("(GLint location = %d, GLuint v0 = %u)",
8199 location, v0);
8200
8201 try
8202 {
8203 gl::Context *context = gl::getNonLostContext();
8204
8205 if (context)
8206 {
8207 if (context->getClientVersion() < 3)
8208 {
8209 return gl::error(GL_INVALID_OPERATION);
8210 }
8211 }
8212
8213 UNIMPLEMENTED();
8214 }
8215 catch(std::bad_alloc&)
8216 {
8217 return gl::error(GL_OUT_OF_MEMORY);
8218 }
8219}
8220
8221void __stdcall glUniform2ui(GLint location, GLuint v0, GLuint v1)
8222{
8223 EVENT("(GLint location = %d, GLuint v0 = %u, GLuint v1 = %u)",
8224 location, v0, v1);
8225
8226 try
8227 {
8228 gl::Context *context = gl::getNonLostContext();
8229
8230 if (context)
8231 {
8232 if (context->getClientVersion() < 3)
8233 {
8234 return gl::error(GL_INVALID_OPERATION);
8235 }
8236 }
8237
8238 UNIMPLEMENTED();
8239 }
8240 catch(std::bad_alloc&)
8241 {
8242 return gl::error(GL_OUT_OF_MEMORY);
8243 }
8244}
8245
8246void __stdcall glUniform3ui(GLint location, GLuint v0, GLuint v1, GLuint v2)
8247{
8248 EVENT("(GLint location = %d, GLuint v0 = %u, GLuint v1 = %u, GLuint v2 = %u)",
8249 location, v0, v1, v2);
8250
8251 try
8252 {
8253 gl::Context *context = gl::getNonLostContext();
8254
8255 if (context)
8256 {
8257 if (context->getClientVersion() < 3)
8258 {
8259 return gl::error(GL_INVALID_OPERATION);
8260 }
8261 }
8262
8263 UNIMPLEMENTED();
8264 }
8265 catch(std::bad_alloc&)
8266 {
8267 return gl::error(GL_OUT_OF_MEMORY);
8268 }
8269}
8270
8271void __stdcall glUniform4ui(GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3)
8272{
8273 EVENT("(GLint location = %d, GLuint v0 = %u, GLuint v1 = %u, GLuint v2 = %u, GLuint v3 = %u)",
8274 location, v0, v1, v2, v3);
8275
8276 try
8277 {
8278 gl::Context *context = gl::getNonLostContext();
8279
8280 if (context)
8281 {
8282 if (context->getClientVersion() < 3)
8283 {
8284 return gl::error(GL_INVALID_OPERATION);
8285 }
8286 }
8287
8288 UNIMPLEMENTED();
8289 }
8290 catch(std::bad_alloc&)
8291 {
8292 return gl::error(GL_OUT_OF_MEMORY);
8293 }
8294}
8295
8296void __stdcall glUniform1uiv(GLint location, GLsizei count, const GLuint* value)
8297{
8298 EVENT("(GLint location = %d, GLsizei count = %d, const GLuint* value = 0x%0.8p)",
8299 location, count, value);
8300
8301 try
8302 {
8303 gl::Context *context = gl::getNonLostContext();
8304
8305 if (context)
8306 {
8307 if (context->getClientVersion() < 3)
8308 {
8309 return gl::error(GL_INVALID_OPERATION);
8310 }
8311 }
8312
8313 UNIMPLEMENTED();
8314 }
8315 catch(std::bad_alloc&)
8316 {
8317 return gl::error(GL_OUT_OF_MEMORY);
8318 }
8319}
8320
8321void __stdcall glUniform2uiv(GLint location, GLsizei count, const GLuint* value)
8322{
8323 EVENT("(GLint location = %d, GLsizei count = %d, const GLuint* value = 0x%0.8p)",
8324 location, count, value);
8325
8326 try
8327 {
8328 gl::Context *context = gl::getNonLostContext();
8329
8330 if (context)
8331 {
8332 if (context->getClientVersion() < 3)
8333 {
8334 return gl::error(GL_INVALID_OPERATION);
8335 }
8336 }
8337
8338 UNIMPLEMENTED();
8339 }
8340 catch(std::bad_alloc&)
8341 {
8342 return gl::error(GL_OUT_OF_MEMORY);
8343 }
8344}
8345
8346void __stdcall glUniform3uiv(GLint location, GLsizei count, const GLuint* value)
8347{
8348 EVENT("(GLint location = %d, GLsizei count = %d, const GLuint* value)",
8349 location, count, value);
8350
8351 try
8352 {
8353 gl::Context *context = gl::getNonLostContext();
8354
8355 if (context)
8356 {
8357 if (context->getClientVersion() < 3)
8358 {
8359 return gl::error(GL_INVALID_OPERATION);
8360 }
8361 }
8362
8363 UNIMPLEMENTED();
8364 }
8365 catch(std::bad_alloc&)
8366 {
8367 return gl::error(GL_OUT_OF_MEMORY);
8368 }
8369}
8370
8371void __stdcall glUniform4uiv(GLint location, GLsizei count, const GLuint* value)
8372{
8373 EVENT("(GLint location = %d, GLsizei count = %d, const GLuint* value = 0x%0.8p)",
8374 location, count, value);
8375
8376 try
8377 {
8378 gl::Context *context = gl::getNonLostContext();
8379
8380 if (context)
8381 {
8382 if (context->getClientVersion() < 3)
8383 {
8384 return gl::error(GL_INVALID_OPERATION);
8385 }
8386 }
8387
8388 UNIMPLEMENTED();
8389 }
8390 catch(std::bad_alloc&)
8391 {
8392 return gl::error(GL_OUT_OF_MEMORY);
8393 }
8394}
8395
8396void __stdcall glClearBufferiv(GLenum buffer, GLint drawbuffer, const GLint* value)
8397{
8398 EVENT("(GLenum buffer = 0x%X, GLint drawbuffer = %d, const GLint* value = 0x%0.8p)",
8399 buffer, drawbuffer, value);
8400
8401 try
8402 {
8403 gl::Context *context = gl::getNonLostContext();
8404
8405 if (context)
8406 {
8407 if (context->getClientVersion() < 3)
8408 {
8409 return gl::error(GL_INVALID_OPERATION);
8410 }
8411 }
8412
8413 UNIMPLEMENTED();
8414 }
8415 catch(std::bad_alloc&)
8416 {
8417 return gl::error(GL_OUT_OF_MEMORY);
8418 }
8419}
8420
8421void __stdcall glClearBufferuiv(GLenum buffer, GLint drawbuffer, const GLuint* value)
8422{
8423 EVENT("(GLenum buffer = 0x%X, GLint drawbuffer = %d, const GLuint* value = 0x%0.8p)",
8424 buffer, drawbuffer, value);
8425
8426 try
8427 {
8428 gl::Context *context = gl::getNonLostContext();
8429
8430 if (context)
8431 {
8432 if (context->getClientVersion() < 3)
8433 {
8434 return gl::error(GL_INVALID_OPERATION);
8435 }
8436 }
8437
8438 UNIMPLEMENTED();
8439 }
8440 catch(std::bad_alloc&)
8441 {
8442 return gl::error(GL_OUT_OF_MEMORY);
8443 }
8444}
8445
8446void __stdcall glClearBufferfv(GLenum buffer, GLint drawbuffer, const GLfloat* value)
8447{
8448 EVENT("(GLenum buffer = 0x%X, GLint drawbuffer = %d, const GLfloat* value = 0x%0.8p)",
8449 buffer, drawbuffer, value);
8450
8451 try
8452 {
8453 gl::Context *context = gl::getNonLostContext();
8454
8455 if (context)
8456 {
8457 if (context->getClientVersion() < 3)
8458 {
8459 return gl::error(GL_INVALID_OPERATION);
8460 }
8461 }
8462
8463 UNIMPLEMENTED();
8464 }
8465 catch(std::bad_alloc&)
8466 {
8467 return gl::error(GL_OUT_OF_MEMORY);
8468 }
8469}
8470
8471void __stdcall glClearBufferfi(GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil)
8472{
8473 EVENT("(GLenum buffer = 0x%X, GLint drawbuffer = %d, GLfloat depth, GLint stencil = %d)",
8474 buffer, drawbuffer, depth, stencil);
8475
8476 try
8477 {
8478 gl::Context *context = gl::getNonLostContext();
8479
8480 if (context)
8481 {
8482 if (context->getClientVersion() < 3)
8483 {
8484 return gl::error(GL_INVALID_OPERATION);
8485 }
8486 }
8487
8488 UNIMPLEMENTED();
8489 }
8490 catch(std::bad_alloc&)
8491 {
8492 return gl::error(GL_OUT_OF_MEMORY);
8493 }
8494}
8495
8496const GLubyte* __stdcall glGetStringi(GLenum name, GLuint index)
8497{
8498 EVENT("(GLenum name = 0x%X, GLuint index = %u)", name, index);
8499
8500 try
8501 {
8502 gl::Context *context = gl::getNonLostContext();
8503
8504 if (context)
8505 {
8506 if (context->getClientVersion() < 3)
8507 {
8508 return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLubyte*>(NULL));
8509 }
8510 }
8511
8512 UNIMPLEMENTED();
8513 }
8514 catch(std::bad_alloc&)
8515 {
8516 return gl::error(GL_OUT_OF_MEMORY, reinterpret_cast<GLubyte*>(NULL));
8517 }
8518
8519 return NULL;
8520}
8521
8522void __stdcall glCopyBufferSubData(GLenum readTarget, GLenum writeTarget, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size)
8523{
8524 EVENT("(GLenum readTarget = 0x%X, GLenum writeTarget = 0x%X, GLintptr readOffset = %d, GLintptr writeOffset = %d, GLsizeiptr size = %d)",
8525 readTarget, writeTarget, readOffset, writeOffset, size);
8526
8527 try
8528 {
8529 gl::Context *context = gl::getNonLostContext();
8530
8531 if (context)
8532 {
8533 if (context->getClientVersion() < 3)
8534 {
8535 return gl::error(GL_INVALID_OPERATION);
8536 }
8537 }
8538
8539 UNIMPLEMENTED();
8540 }
8541 catch(std::bad_alloc&)
8542 {
8543 return gl::error(GL_OUT_OF_MEMORY);
8544 }
8545}
8546
8547void __stdcall glGetUniformIndices(GLuint program, GLsizei uniformCount, const GLchar* const* uniformNames, GLuint* uniformIndices)
8548{
8549 EVENT("(GLuint program = %u, GLsizei uniformCount = %d, const GLchar* const* uniformNames = 0x%0.8p, GLuint* uniformIndices = 0x%0.8p)",
8550 program, uniformCount, uniformNames, uniformIndices);
8551
8552 try
8553 {
8554 gl::Context *context = gl::getNonLostContext();
8555
8556 if (context)
8557 {
8558 if (context->getClientVersion() < 3)
8559 {
8560 return gl::error(GL_INVALID_OPERATION);
8561 }
8562 }
8563
8564 UNIMPLEMENTED();
8565 }
8566 catch(std::bad_alloc&)
8567 {
8568 return gl::error(GL_OUT_OF_MEMORY);
8569 }
8570}
8571
8572void __stdcall glGetActiveUniformsiv(GLuint program, GLsizei uniformCount, const GLuint* uniformIndices, GLenum pname, GLint* params)
8573{
8574 EVENT("(GLuint program = %u, GLsizei uniformCount = %d, const GLuint* uniformIndices = 0x%0.8p, GLenum pname = 0x%X, GLint* params = 0x%0.8p)",
8575 program, uniformCount, uniformIndices, pname, params);
8576
8577 try
8578 {
8579 gl::Context *context = gl::getNonLostContext();
8580
8581 if (context)
8582 {
8583 if (context->getClientVersion() < 3)
8584 {
8585 return gl::error(GL_INVALID_OPERATION);
8586 }
8587 }
8588
8589 UNIMPLEMENTED();
8590 }
8591 catch(std::bad_alloc&)
8592 {
8593 return gl::error(GL_OUT_OF_MEMORY);
8594 }
8595}
8596
8597GLuint __stdcall glGetUniformBlockIndex(GLuint program, const GLchar* uniformBlockName)
8598{
8599 EVENT("(GLuint program = %u, const GLchar* uniformBlockName = 0x%0.8p)", program, uniformBlockName);
8600
8601 try
8602 {
8603 gl::Context *context = gl::getNonLostContext();
8604
8605 if (context)
8606 {
8607 if (context->getClientVersion() < 3)
8608 {
8609 return gl::error(GL_INVALID_OPERATION, 0);
8610 }
8611 }
8612
8613 UNIMPLEMENTED();
8614 }
8615 catch(std::bad_alloc&)
8616 {
8617 return gl::error(GL_OUT_OF_MEMORY, 0);
8618 }
8619
8620 return 0;
8621}
8622
8623void __stdcall glGetActiveUniformBlockiv(GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint* params)
8624{
8625 EVENT("(GLuint program = %u, GLuint uniformBlockIndex = %u, GLenum pname = 0x%X, GLint* params = 0x%0.8p)",
8626 program, uniformBlockIndex, pname, params);
8627
8628 try
8629 {
8630 gl::Context *context = gl::getNonLostContext();
8631
8632 if (context)
8633 {
8634 if (context->getClientVersion() < 3)
8635 {
8636 return gl::error(GL_INVALID_OPERATION);
8637 }
8638 }
8639
8640 UNIMPLEMENTED();
8641 }
8642 catch(std::bad_alloc&)
8643 {
8644 return gl::error(GL_OUT_OF_MEMORY);
8645 }
8646}
8647
8648void __stdcall glGetActiveUniformBlockName(GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei* length, GLchar* uniformBlockName)
8649{
8650 EVENT("(GLuint program = %u, GLuint uniformBlockIndex = %u, GLsizei bufSize = %d, GLsizei* length = 0x%0.8p, GLchar* uniformBlockName = 0x%0.8p)",
8651 program, uniformBlockIndex, bufSize, length, uniformBlockName);
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 }
8663 }
8664
8665 UNIMPLEMENTED();
8666 }
8667 catch(std::bad_alloc&)
8668 {
8669 return gl::error(GL_OUT_OF_MEMORY);
8670 }
8671}
8672
8673void __stdcall glUniformBlockBinding(GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding)
8674{
8675 EVENT("(GLuint program = %u, GLuint uniformBlockIndex = %u, GLuint uniformBlockBinding = %u)",
8676 program, uniformBlockIndex, uniformBlockBinding);
8677
8678 try
8679 {
8680 gl::Context *context = gl::getNonLostContext();
8681
8682 if (context)
8683 {
8684 if (context->getClientVersion() < 3)
8685 {
8686 return gl::error(GL_INVALID_OPERATION);
8687 }
8688 }
8689
8690 UNIMPLEMENTED();
8691 }
8692 catch(std::bad_alloc&)
8693 {
8694 return gl::error(GL_OUT_OF_MEMORY);
8695 }
8696}
8697
8698void __stdcall glDrawArraysInstanced(GLenum mode, GLint first, GLsizei count, GLsizei instanceCount)
8699{
8700 EVENT("(GLenum mode = 0x%X, GLint first = %d, GLsizei count = %d, GLsizei instanceCount = %d)",
8701 mode, first, count, instanceCount);
8702
8703 try
8704 {
8705 gl::Context *context = gl::getNonLostContext();
8706
8707 if (context)
8708 {
8709 if (context->getClientVersion() < 3)
8710 {
8711 return gl::error(GL_INVALID_OPERATION);
8712 }
8713 }
8714
8715 UNIMPLEMENTED();
8716 }
8717 catch(std::bad_alloc&)
8718 {
8719 return gl::error(GL_OUT_OF_MEMORY);
8720 }
8721}
8722
8723void __stdcall glDrawElementsInstanced(GLenum mode, GLsizei count, GLenum type, const GLvoid* indices, GLsizei instanceCount)
8724{
8725 EVENT("(GLenum mode = 0x%X, GLsizei count = %d, GLenum type = 0x%X, const GLvoid* indices = 0x%0.8p, GLsizei instanceCount = %d)",
8726 mode, count, type, indices, instanceCount);
8727
8728 try
8729 {
8730 gl::Context *context = gl::getNonLostContext();
8731
8732 if (context)
8733 {
8734 if (context->getClientVersion() < 3)
8735 {
8736 return gl::error(GL_INVALID_OPERATION);
8737 }
8738 }
8739
8740 UNIMPLEMENTED();
8741 }
8742 catch(std::bad_alloc&)
8743 {
8744 return gl::error(GL_OUT_OF_MEMORY);
8745 }
8746}
8747
8748GLsync __stdcall glFenceSync(GLenum condition, GLbitfield flags)
8749{
8750 EVENT("(GLenum condition = 0x%X, GLbitfield flags = 0x%X)", condition, flags);
8751
8752 try
8753 {
8754 gl::Context *context = gl::getNonLostContext();
8755
8756 if (context)
8757 {
8758 if (context->getClientVersion() < 3)
8759 {
8760 return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLsync>(NULL));
8761 }
8762 }
8763
8764 UNIMPLEMENTED();
8765 }
8766 catch(std::bad_alloc&)
8767 {
8768 return gl::error(GL_OUT_OF_MEMORY, reinterpret_cast<GLsync>(NULL));
8769 }
8770
8771 return NULL;
8772}
8773
8774GLboolean __stdcall glIsSync(GLsync sync)
8775{
8776 EVENT("(GLsync sync = 0x%0.8p)", sync);
8777
8778 try
8779 {
8780 gl::Context *context = gl::getNonLostContext();
8781
8782 if (context)
8783 {
8784 if (context->getClientVersion() < 3)
8785 {
8786 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
8787 }
8788 }
8789
8790 UNIMPLEMENTED();
8791 }
8792 catch(std::bad_alloc&)
8793 {
8794 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
8795 }
8796
8797 return GL_FALSE;
8798}
8799
8800void __stdcall glDeleteSync(GLsync sync)
8801{
8802 EVENT("(GLsync sync = 0x%0.8p)", sync);
8803
8804 try
8805 {
8806 gl::Context *context = gl::getNonLostContext();
8807
8808 if (context)
8809 {
8810 if (context->getClientVersion() < 3)
8811 {
8812 return gl::error(GL_INVALID_OPERATION);
8813 }
8814 }
8815
8816 UNIMPLEMENTED();
8817 }
8818 catch(std::bad_alloc&)
8819 {
8820 return gl::error(GL_OUT_OF_MEMORY);
8821 }
8822}
8823
8824GLenum __stdcall glClientWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout)
8825{
8826 EVENT("(GLsync sync = 0x%0.8p, GLbitfield flags = 0x%X, GLuint64 timeout = %llu)",
8827 sync, flags, timeout);
8828
8829 try
8830 {
8831 gl::Context *context = gl::getNonLostContext();
8832
8833 if (context)
8834 {
8835 if (context->getClientVersion() < 3)
8836 {
8837 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
8838 }
8839 }
8840
8841 UNIMPLEMENTED();
8842 }
8843 catch(std::bad_alloc&)
8844 {
8845 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
8846 }
8847
8848 return GL_FALSE;
8849}
8850
8851void __stdcall glWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout)
8852{
8853 EVENT("(GLsync sync = 0x%0.8p, GLbitfield flags = 0x%X, GLuint64 timeout = %llu)",
8854 sync, flags, timeout);
8855
8856 try
8857 {
8858 gl::Context *context = gl::getNonLostContext();
8859
8860 if (context)
8861 {
8862 if (context->getClientVersion() < 3)
8863 {
8864 return gl::error(GL_INVALID_OPERATION);
8865 }
8866 }
8867
8868 UNIMPLEMENTED();
8869 }
8870 catch(std::bad_alloc&)
8871 {
8872 return gl::error(GL_OUT_OF_MEMORY);
8873 }
8874}
8875
8876void __stdcall glGetInteger64v(GLenum pname, GLint64* params)
8877{
8878 EVENT("(GLenum pname = 0x%X, GLint64* params = 0x%0.8p)",
8879 pname, params);
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 }
8891 }
8892
8893 UNIMPLEMENTED();
8894 }
8895 catch(std::bad_alloc&)
8896 {
8897 return gl::error(GL_OUT_OF_MEMORY);
8898 }
8899}
8900
8901void __stdcall glGetSynciv(GLsync sync, GLenum pname, GLsizei bufSize, GLsizei* length, GLint* values)
8902{
8903 EVENT("(GLsync sync = 0x%0.8p, GLenum pname = 0x%X, GLsizei bufSize = %d, GLsizei* length = 0x%0.8p, GLint* values = 0x%0.8p)",
8904 sync, pname, bufSize, length, values);
8905
8906 try
8907 {
8908 gl::Context *context = gl::getNonLostContext();
8909
8910 if (context)
8911 {
8912 if (context->getClientVersion() < 3)
8913 {
8914 return gl::error(GL_INVALID_OPERATION);
8915 }
8916 }
8917
8918 UNIMPLEMENTED();
8919 }
8920 catch(std::bad_alloc&)
8921 {
8922 return gl::error(GL_OUT_OF_MEMORY);
8923 }
8924}
8925
8926void __stdcall glGetInteger64i_v(GLenum target, GLuint index, GLint64* data)
8927{
8928 EVENT("(GLenum target = 0x%X, GLuint index = %u, GLint64* data = 0x%0.8p)",
8929 target, index, data);
8930
8931 try
8932 {
8933 gl::Context *context = gl::getNonLostContext();
8934
8935 if (context)
8936 {
8937 if (context->getClientVersion() < 3)
8938 {
8939 return gl::error(GL_INVALID_OPERATION);
8940 }
8941 }
8942
8943 UNIMPLEMENTED();
8944 }
8945 catch(std::bad_alloc&)
8946 {
8947 return gl::error(GL_OUT_OF_MEMORY);
8948 }
8949}
8950
8951void __stdcall glGetBufferParameteri64v(GLenum target, GLenum pname, GLint64* params)
8952{
8953 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLint64* params = 0x%0.8p)",
8954 target, pname, params);
8955
8956 try
8957 {
8958 gl::Context *context = gl::getNonLostContext();
8959
8960 if (context)
8961 {
8962 if (context->getClientVersion() < 3)
8963 {
8964 return gl::error(GL_INVALID_OPERATION);
8965 }
8966 }
8967
8968 UNIMPLEMENTED();
8969 }
8970 catch(std::bad_alloc&)
8971 {
8972 return gl::error(GL_OUT_OF_MEMORY);
8973 }
8974}
8975
8976void __stdcall glGenSamplers(GLsizei count, GLuint* samplers)
8977{
8978 EVENT("(GLsizei count = %d, GLuint* samplers = 0x%0.8p)", count, samplers);
8979
8980 try
8981 {
8982 gl::Context *context = gl::getNonLostContext();
8983
8984 if (context)
8985 {
8986 if (context->getClientVersion() < 3)
8987 {
8988 return gl::error(GL_INVALID_OPERATION);
8989 }
8990 }
8991
8992 UNIMPLEMENTED();
8993 }
8994 catch(std::bad_alloc&)
8995 {
8996 return gl::error(GL_OUT_OF_MEMORY);
8997 }
8998}
8999
9000void __stdcall glDeleteSamplers(GLsizei count, const GLuint* samplers)
9001{
9002 EVENT("(GLsizei count = %d, const GLuint* samplers = 0x%0.8p)", count, samplers);
9003
9004 try
9005 {
9006 gl::Context *context = gl::getNonLostContext();
9007
9008 if (context)
9009 {
9010 if (context->getClientVersion() < 3)
9011 {
9012 return gl::error(GL_INVALID_OPERATION);
9013 }
9014 }
9015
9016 UNIMPLEMENTED();
9017 }
9018 catch(std::bad_alloc&)
9019 {
9020 return gl::error(GL_OUT_OF_MEMORY);
9021 }
9022}
9023
9024GLboolean __stdcall glIsSampler(GLuint sampler)
9025{
9026 EVENT("(GLuint sampler = %u)", sampler);
9027
9028 try
9029 {
9030 gl::Context *context = gl::getNonLostContext();
9031
9032 if (context)
9033 {
9034 if (context->getClientVersion() < 3)
9035 {
9036 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
9037 }
9038 }
9039
9040 UNIMPLEMENTED();
9041 }
9042 catch(std::bad_alloc&)
9043 {
9044 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
9045 }
9046
9047 return GL_FALSE;
9048}
9049
9050void __stdcall glBindSampler(GLuint unit, GLuint sampler)
9051{
9052 EVENT("(GLuint unit = %u, GLuint sampler = %u)", unit, sampler);
9053
9054 try
9055 {
9056 gl::Context *context = gl::getNonLostContext();
9057
9058 if (context)
9059 {
9060 if (context->getClientVersion() < 3)
9061 {
9062 return gl::error(GL_INVALID_OPERATION);
9063 }
9064 }
9065
9066 UNIMPLEMENTED();
9067 }
9068 catch(std::bad_alloc&)
9069 {
9070 return gl::error(GL_OUT_OF_MEMORY);
9071 }
9072}
9073
9074void __stdcall glSamplerParameteri(GLuint sampler, GLenum pname, GLint param)
9075{
9076 EVENT("(GLuint sampler = %u, GLenum pname = 0x%X, GLint param = %d)", sampler, pname, param);
9077
9078 try
9079 {
9080 gl::Context *context = gl::getNonLostContext();
9081
9082 if (context)
9083 {
9084 if (context->getClientVersion() < 3)
9085 {
9086 return gl::error(GL_INVALID_OPERATION);
9087 }
9088 }
9089
9090 UNIMPLEMENTED();
9091 }
9092 catch(std::bad_alloc&)
9093 {
9094 return gl::error(GL_OUT_OF_MEMORY);
9095 }
9096}
9097
9098void __stdcall glSamplerParameteriv(GLuint sampler, GLenum pname, const GLint* param)
9099{
9100 EVENT("(GLuint sampler = %u, GLenum pname = 0x%X, const GLint* param = 0x%0.8p)",
9101 sampler, pname, param);
9102
9103 try
9104 {
9105 gl::Context *context = gl::getNonLostContext();
9106
9107 if (context)
9108 {
9109 if (context->getClientVersion() < 3)
9110 {
9111 return gl::error(GL_INVALID_OPERATION);
9112 }
9113 }
9114
9115 UNIMPLEMENTED();
9116 }
9117 catch(std::bad_alloc&)
9118 {
9119 return gl::error(GL_OUT_OF_MEMORY);
9120 }
9121}
9122
9123void __stdcall glSamplerParameterf(GLuint sampler, GLenum pname, GLfloat param)
9124{
9125 EVENT("(GLuint sampler = %u, GLenum pname = 0x%X, GLfloat param = %g)", sampler, pname, param);
9126
9127 try
9128 {
9129 gl::Context *context = gl::getNonLostContext();
9130
9131 if (context)
9132 {
9133 if (context->getClientVersion() < 3)
9134 {
9135 return gl::error(GL_INVALID_OPERATION);
9136 }
9137 }
9138
9139 UNIMPLEMENTED();
9140 }
9141 catch(std::bad_alloc&)
9142 {
9143 return gl::error(GL_OUT_OF_MEMORY);
9144 }
9145}
9146
9147void __stdcall glSamplerParameterfv(GLuint sampler, GLenum pname, const GLfloat* param)
9148{
9149 EVENT("(GLuint sampler = %u, GLenum pname = 0x%X, const GLfloat* param = 0x%0.8p)", sampler, pname, param);
9150
9151 try
9152 {
9153 gl::Context *context = gl::getNonLostContext();
9154
9155 if (context)
9156 {
9157 if (context->getClientVersion() < 3)
9158 {
9159 return gl::error(GL_INVALID_OPERATION);
9160 }
9161 }
9162
9163 UNIMPLEMENTED();
9164 }
9165 catch(std::bad_alloc&)
9166 {
9167 return gl::error(GL_OUT_OF_MEMORY);
9168 }
9169}
9170
9171void __stdcall glGetSamplerParameteriv(GLuint sampler, GLenum pname, GLint* params)
9172{
9173 EVENT("(GLuint sampler = %u, GLenum pname = 0x%X, GLint* params = 0x%0.8p)", sampler, pname, params);
9174
9175 try
9176 {
9177 gl::Context *context = gl::getNonLostContext();
9178
9179 if (context)
9180 {
9181 if (context->getClientVersion() < 3)
9182 {
9183 return gl::error(GL_INVALID_OPERATION);
9184 }
9185 }
9186
9187 UNIMPLEMENTED();
9188 }
9189 catch(std::bad_alloc&)
9190 {
9191 return gl::error(GL_OUT_OF_MEMORY);
9192 }
9193}
9194
9195void __stdcall glGetSamplerParameterfv(GLuint sampler, GLenum pname, GLfloat* params)
9196{
9197 EVENT("(GLuint sample = %ur, GLenum pname = 0x%X, GLfloat* params = 0x%0.8p)", sampler, pname, params);
9198
9199 try
9200 {
9201 gl::Context *context = gl::getNonLostContext();
9202
9203 if (context)
9204 {
9205 if (context->getClientVersion() < 3)
9206 {
9207 return gl::error(GL_INVALID_OPERATION);
9208 }
9209 }
9210
9211 UNIMPLEMENTED();
9212 }
9213 catch(std::bad_alloc&)
9214 {
9215 return gl::error(GL_OUT_OF_MEMORY);
9216 }
9217}
9218
9219void __stdcall glVertexAttribDivisor(GLuint index, GLuint divisor)
9220{
9221 EVENT("(GLuint index = %u, GLuint divisor = %u)", index, divisor);
9222
9223 try
9224 {
shannon.woods%transgaming.com@gtempaccount.com8736bd62013-04-13 03:35:41 +00009225 if (index >= gl::MAX_VERTEX_ATTRIBS)
9226 {
9227 return gl::error(GL_INVALID_VALUE);
9228 }
9229
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009230 gl::Context *context = gl::getNonLostContext();
9231
9232 if (context)
9233 {
9234 if (context->getClientVersion() < 3)
9235 {
9236 return gl::error(GL_INVALID_OPERATION);
9237 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009238
shannon.woods%transgaming.com@gtempaccount.com8736bd62013-04-13 03:35:41 +00009239 context->setVertexAttribDivisor(index, divisor);
9240 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009241 }
9242 catch(std::bad_alloc&)
9243 {
9244 return gl::error(GL_OUT_OF_MEMORY);
9245 }
9246}
9247
9248void __stdcall glBindTransformFeedback(GLenum target, GLuint id)
9249{
9250 EVENT("(GLenum target = 0x%X, GLuint id = %u)", target, id);
9251
9252 try
9253 {
9254 gl::Context *context = gl::getNonLostContext();
9255
9256 if (context)
9257 {
9258 if (context->getClientVersion() < 3)
9259 {
9260 return gl::error(GL_INVALID_OPERATION);
9261 }
9262 }
9263
9264 UNIMPLEMENTED();
9265 }
9266 catch(std::bad_alloc&)
9267 {
9268 return gl::error(GL_OUT_OF_MEMORY);
9269 }
9270}
9271
9272void __stdcall glDeleteTransformFeedbacks(GLsizei n, const GLuint* ids)
9273{
9274 EVENT("(GLsizei n = %d, const GLuint* ids = 0x%0.8p)", n, ids);
9275
9276 try
9277 {
9278 gl::Context *context = gl::getNonLostContext();
9279
9280 if (context)
9281 {
9282 if (context->getClientVersion() < 3)
9283 {
9284 return gl::error(GL_INVALID_OPERATION);
9285 }
9286 }
9287
9288 UNIMPLEMENTED();
9289 }
9290 catch(std::bad_alloc&)
9291 {
9292 return gl::error(GL_OUT_OF_MEMORY);
9293 }
9294}
9295
9296void __stdcall glGenTransformFeedbacks(GLsizei n, GLuint* ids)
9297{
9298 EVENT("(GLsizei n = %d, GLuint* ids = 0x%0.8p)", n, ids);
9299
9300 try
9301 {
9302 gl::Context *context = gl::getNonLostContext();
9303
9304 if (context)
9305 {
9306 if (context->getClientVersion() < 3)
9307 {
9308 return gl::error(GL_INVALID_OPERATION);
9309 }
9310 }
9311
9312 UNIMPLEMENTED();
9313 }
9314 catch(std::bad_alloc&)
9315 {
9316 return gl::error(GL_OUT_OF_MEMORY);
9317 }
9318}
9319
9320GLboolean __stdcall glIsTransformFeedback(GLuint id)
9321{
9322 EVENT("(GLuint id = %u)", id);
9323
9324 try
9325 {
9326 gl::Context *context = gl::getNonLostContext();
9327
9328 if (context)
9329 {
9330 if (context->getClientVersion() < 3)
9331 {
9332 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
9333 }
9334 }
9335
9336 UNIMPLEMENTED();
9337 }
9338 catch(std::bad_alloc&)
9339 {
9340 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
9341 }
9342
9343 return GL_FALSE;
9344}
9345
9346void __stdcall glPauseTransformFeedback(void)
9347{
9348 EVENT("(void)");
9349
9350 try
9351 {
9352 gl::Context *context = gl::getNonLostContext();
9353
9354 if (context)
9355 {
9356 if (context->getClientVersion() < 3)
9357 {
9358 return gl::error(GL_INVALID_OPERATION);
9359 }
9360 }
9361
9362 UNIMPLEMENTED();
9363 }
9364 catch(std::bad_alloc&)
9365 {
9366 return gl::error(GL_OUT_OF_MEMORY);
9367 }
9368}
9369
9370void __stdcall glResumeTransformFeedback(void)
9371{
9372 EVENT("(void)");
9373
9374 try
9375 {
9376 gl::Context *context = gl::getNonLostContext();
9377
9378 if (context)
9379 {
9380 if (context->getClientVersion() < 3)
9381 {
9382 return gl::error(GL_INVALID_OPERATION);
9383 }
9384 }
9385
9386 UNIMPLEMENTED();
9387 }
9388 catch(std::bad_alloc&)
9389 {
9390 return gl::error(GL_OUT_OF_MEMORY);
9391 }
9392}
9393
9394void __stdcall glGetProgramBinary(GLuint program, GLsizei bufSize, GLsizei* length, GLenum* binaryFormat, GLvoid* binary)
9395{
9396 EVENT("(GLuint program = %u, GLsizei bufSize = %d, GLsizei* length = 0x%0.8p, GLenum* binaryFormat = 0x%0.8p, GLvoid* binary = 0x%0.8p)",
9397 program, bufSize, length, binaryFormat, binary);
9398
9399 try
9400 {
9401 gl::Context *context = gl::getNonLostContext();
9402
9403 if (context)
9404 {
9405 if (context->getClientVersion() < 3)
9406 {
9407 return gl::error(GL_INVALID_OPERATION);
9408 }
9409 }
9410
9411 UNIMPLEMENTED();
9412 }
9413 catch(std::bad_alloc&)
9414 {
9415 return gl::error(GL_OUT_OF_MEMORY);
9416 }
9417}
9418
9419void __stdcall glProgramBinary(GLuint program, GLenum binaryFormat, const GLvoid* binary, GLsizei length)
9420{
9421 EVENT("(GLuint program = %u, GLenum binaryFormat = 0x%X, const GLvoid* binary = 0x%0.8p, GLsizei length = %d)",
9422 program, binaryFormat, binary, length);
9423
9424 try
9425 {
9426 gl::Context *context = gl::getNonLostContext();
9427
9428 if (context)
9429 {
9430 if (context->getClientVersion() < 3)
9431 {
9432 return gl::error(GL_INVALID_OPERATION);
9433 }
9434 }
9435
9436 UNIMPLEMENTED();
9437 }
9438 catch(std::bad_alloc&)
9439 {
9440 return gl::error(GL_OUT_OF_MEMORY);
9441 }
9442}
9443
9444void __stdcall glProgramParameteri(GLuint program, GLenum pname, GLint value)
9445{
9446 EVENT("(GLuint program = %u, GLenum pname = 0x%X, GLint value = %d)",
9447 program, pname, value);
9448
9449 try
9450 {
9451 gl::Context *context = gl::getNonLostContext();
9452
9453 if (context)
9454 {
9455 if (context->getClientVersion() < 3)
9456 {
9457 return gl::error(GL_INVALID_OPERATION);
9458 }
9459 }
9460
9461 UNIMPLEMENTED();
9462 }
9463 catch(std::bad_alloc&)
9464 {
9465 return gl::error(GL_OUT_OF_MEMORY);
9466 }
9467}
9468
9469void __stdcall glInvalidateFramebuffer(GLenum target, GLsizei numAttachments, const GLenum* attachments)
9470{
9471 EVENT("(GLenum target = 0x%X, GLsizei numAttachments = %d, const GLenum* attachments = 0x%0.8p)",
9472 target, numAttachments, attachments);
9473
9474 try
9475 {
9476 gl::Context *context = gl::getNonLostContext();
9477
9478 if (context)
9479 {
9480 if (context->getClientVersion() < 3)
9481 {
9482 return gl::error(GL_INVALID_OPERATION);
9483 }
9484 }
9485
9486 UNIMPLEMENTED();
9487 }
9488 catch(std::bad_alloc&)
9489 {
9490 return gl::error(GL_OUT_OF_MEMORY);
9491 }
9492}
9493
9494void __stdcall glInvalidateSubFramebuffer(GLenum target, GLsizei numAttachments, const GLenum* attachments, GLint x, GLint y, GLsizei width, GLsizei height)
9495{
9496 EVENT("(GLenum target = 0x%X, GLsizei numAttachments = %d, const GLenum* attachments = 0x%0.8p, GLint x = %d, "
9497 "GLint y = %d, GLsizei width = %d, GLsizei height = %d)",
9498 target, numAttachments, attachments, x, y, width, height);
9499
9500 try
9501 {
9502 gl::Context *context = gl::getNonLostContext();
9503
9504 if (context)
9505 {
9506 if (context->getClientVersion() < 3)
9507 {
9508 return gl::error(GL_INVALID_OPERATION);
9509 }
9510 }
9511
9512 UNIMPLEMENTED();
9513 }
9514 catch(std::bad_alloc&)
9515 {
9516 return gl::error(GL_OUT_OF_MEMORY);
9517 }
9518}
9519
9520void __stdcall glTexStorage2D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height)
9521{
9522 EVENT("(GLenum target = 0x%X, GLsizei levels = %d, GLenum internalformat = 0x%X, GLsizei width = %d, GLsizei height = %d)",
9523 target, levels, internalformat, width, height);
9524
9525 try
9526 {
9527 gl::Context *context = gl::getNonLostContext();
9528
9529 if (context)
9530 {
9531 if (context->getClientVersion() < 3)
9532 {
9533 return gl::error(GL_INVALID_OPERATION);
9534 }
9535 }
9536
9537 UNIMPLEMENTED();
9538 }
9539 catch(std::bad_alloc&)
9540 {
9541 return gl::error(GL_OUT_OF_MEMORY);
9542 }
9543}
9544
9545void __stdcall glTexStorage3D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth)
9546{
9547 EVENT("(GLenum target = 0x%X, GLsizei levels = %d, GLenum internalformat = 0x%X, GLsizei width = %d, "
9548 "GLsizei height = %d, GLsizei depth = %d)",
9549 target, levels, internalformat, width, height, depth);
9550
9551 try
9552 {
9553 gl::Context *context = gl::getNonLostContext();
9554
9555 if (context)
9556 {
9557 if (context->getClientVersion() < 3)
9558 {
9559 return gl::error(GL_INVALID_OPERATION);
9560 }
shannon.woods%transgaming.com@gtempaccount.com14eb55e2013-04-13 03:35:06 +00009561 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009562 }
9563 catch(std::bad_alloc&)
9564 {
9565 return gl::error(GL_OUT_OF_MEMORY);
9566 }
9567}
9568
9569void __stdcall glGetInternalformativ(GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize, GLint* params)
9570{
9571 EVENT("(GLenum target = 0x%X, GLenum internalformat = 0x%X, GLenum pname = 0x%X, GLsizei bufSize = %d, "
9572 "GLint* params = 0x%0.8p)",
9573 target, internalformat, pname, bufSize, params);
9574
9575 try
9576 {
9577 gl::Context *context = gl::getNonLostContext();
9578
9579 if (context)
9580 {
9581 if (context->getClientVersion() < 3)
9582 {
9583 return gl::error(GL_INVALID_OPERATION);
9584 }
9585 }
9586
9587 UNIMPLEMENTED();
9588 }
9589 catch(std::bad_alloc&)
9590 {
9591 return gl::error(GL_OUT_OF_MEMORY);
9592 }
9593}
9594
9595// Extension functions
9596
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +00009597void __stdcall glBlitFramebufferANGLE(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1,
9598 GLbitfield mask, GLenum filter)
9599{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00009600 EVENT("(GLint srcX0 = %d, GLint srcY0 = %d, GLint srcX1 = %d, GLint srcY1 = %d, "
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +00009601 "GLint dstX0 = %d, GLint dstY0 = %d, GLint dstX1 = %d, GLint dstY1 = %d, "
9602 "GLbitfield mask = 0x%X, GLenum filter = 0x%X)",
9603 srcX0, srcY0, srcX1, srcX1, dstX0, dstY0, dstX1, dstY1, mask, filter);
9604
9605 try
9606 {
9607 switch (filter)
9608 {
9609 case GL_NEAREST:
9610 break;
9611 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00009612 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +00009613 }
9614
9615 if ((mask & ~(GL_COLOR_BUFFER_BIT | GL_STENCIL_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)) != 0)
9616 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00009617 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +00009618 }
9619
9620 if (srcX1 - srcX0 != dstX1 - dstX0 || srcY1 - srcY0 != dstY1 - dstY0)
9621 {
9622 ERR("Scaling and flipping in BlitFramebufferANGLE not supported by this implementation");
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00009623 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +00009624 }
9625
daniel@transgaming.com9d788502011-11-09 17:46:55 +00009626 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +00009627
9628 if (context)
9629 {
9630 if (context->getReadFramebufferHandle() == context->getDrawFramebufferHandle())
9631 {
9632 ERR("Blits with the same source and destination framebuffer are not supported by this implementation.");
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00009633 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +00009634 }
9635
9636 context->blitFramebuffer(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask);
9637 }
9638 }
9639 catch(std::bad_alloc&)
9640 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00009641 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +00009642 }
9643}
9644
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00009645void __stdcall glTexImage3DOES(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth,
9646 GLint border, GLenum format, GLenum type, const GLvoid* pixels)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00009647{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00009648 EVENT("(GLenum target = 0x%X, GLint level = %d, GLenum internalformat = 0x%X, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00009649 "GLsizei width = %d, GLsizei height = %d, GLsizei depth = %d, GLint border = %d, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00009650 "GLenum format = 0x%X, GLenum type = 0x%x, const GLvoid* pixels = 0x%0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00009651 target, level, internalformat, width, height, depth, border, format, type, pixels);
9652
9653 try
9654 {
9655 UNIMPLEMENTED(); // FIXME
9656 }
9657 catch(std::bad_alloc&)
9658 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00009659 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00009660 }
9661}
daniel@transgaming.comce3d0f22010-05-04 03:35:14 +00009662
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00009663void __stdcall glGetProgramBinaryOES(GLuint program, GLsizei bufSize, GLsizei *length,
9664 GLenum *binaryFormat, void *binary)
9665{
apatrick@chromium.org90080e32012-07-09 22:15:33 +00009666 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 +00009667 program, bufSize, length, binaryFormat, binary);
9668
9669 try
9670 {
9671 gl::Context *context = gl::getNonLostContext();
9672
9673 if (context)
9674 {
9675 gl::Program *programObject = context->getProgram(program);
9676
daniel@transgaming.com716056c2012-07-24 18:38:59 +00009677 if (!programObject || !programObject->isLinked())
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00009678 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00009679 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00009680 }
9681
9682 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
9683
9684 if (!programBinary)
9685 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00009686 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00009687 }
9688
apatrick@chromium.org90080e32012-07-09 22:15:33 +00009689 if (!programBinary->save(binary, bufSize, length))
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00009690 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00009691 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00009692 }
apatrick@chromium.org90080e32012-07-09 22:15:33 +00009693
9694 *binaryFormat = GL_PROGRAM_BINARY_ANGLE;
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00009695 }
9696 }
9697 catch(std::bad_alloc&)
9698 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00009699 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00009700 }
9701}
9702
9703void __stdcall glProgramBinaryOES(GLuint program, GLenum binaryFormat,
9704 const void *binary, GLint length)
9705{
9706 EVENT("(GLenum program = 0x%X, binaryFormat = 0x%x, binary = 0x%0.8p, length = %d)",
9707 program, binaryFormat, binary, length);
9708
9709 try
9710 {
9711 gl::Context *context = gl::getNonLostContext();
9712
9713 if (context)
9714 {
9715 if (binaryFormat != GL_PROGRAM_BINARY_ANGLE)
9716 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00009717 return gl::error(GL_INVALID_ENUM);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00009718 }
9719
9720 gl::Program *programObject = context->getProgram(program);
9721
9722 if (!programObject)
9723 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00009724 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00009725 }
9726
daniel@transgaming.com95d29422012-07-24 18:36:10 +00009727 context->setProgramBinary(program, binary, length);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00009728 }
9729 }
9730 catch(std::bad_alloc&)
9731 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00009732 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00009733 }
9734}
9735
shannon.woods%transgaming.com@gtempaccount.com4059a382013-04-13 03:31:16 +00009736void __stdcall glDrawBuffersEXT(GLsizei n, const GLenum *bufs)
9737{
9738 EVENT("(GLenum n = %d, bufs = 0x%0.8p)", n, bufs);
9739
9740 try
9741 {
9742 gl::Context *context = gl::getNonLostContext();
9743
9744 if (context)
9745 {
9746 if (n < 0 || (unsigned int)n > context->getMaximumRenderTargets())
9747 {
9748 return gl::error(GL_INVALID_VALUE);
9749 }
9750
9751 if (context->getDrawFramebufferHandle() == 0)
9752 {
shannon.woods%transgaming.com@gtempaccount.com2fa73c52013-04-13 03:37:20 +00009753 if (n != 1)
shannon.woods%transgaming.com@gtempaccount.com4059a382013-04-13 03:31:16 +00009754 {
9755 return gl::error(GL_INVALID_OPERATION);
9756 }
9757
shannon.woods%transgaming.com@gtempaccount.com2fa73c52013-04-13 03:37:20 +00009758 if (bufs[0] != GL_NONE && bufs[0] != GL_BACK)
shannon.woods%transgaming.com@gtempaccount.com4059a382013-04-13 03:31:16 +00009759 {
shannon.woods%transgaming.com@gtempaccount.com2fa73c52013-04-13 03:37:20 +00009760 return gl::error(GL_INVALID_OPERATION);
shannon.woods%transgaming.com@gtempaccount.com4059a382013-04-13 03:31:16 +00009761 }
9762 }
9763 else
9764 {
9765 for (int colorAttachment = 0; colorAttachment < n; colorAttachment++)
9766 {
9767 const GLenum attachment = GL_COLOR_ATTACHMENT0_EXT + colorAttachment;
9768 if (bufs[colorAttachment] != GL_NONE && bufs[colorAttachment] != attachment)
9769 {
9770 return gl::error(GL_INVALID_OPERATION);
9771 }
9772 }
9773 }
9774
9775 gl::Framebuffer *framebuffer = context->getDrawFramebuffer();
9776
9777 for (int colorAttachment = 0; colorAttachment < n; colorAttachment++)
9778 {
9779 framebuffer->setDrawBufferState(colorAttachment, bufs[colorAttachment]);
9780 }
shannon.woods%transgaming.com@gtempaccount.com2fa73c52013-04-13 03:37:20 +00009781
9782 for (int colorAttachment = n; colorAttachment < (int)context->getMaximumRenderTargets(); colorAttachment++)
9783 {
9784 framebuffer->setDrawBufferState(colorAttachment, GL_NONE);
9785 }
shannon.woods%transgaming.com@gtempaccount.com4059a382013-04-13 03:31:16 +00009786 }
9787 }
9788 catch (std::bad_alloc&)
9789 {
9790 return gl::error(GL_OUT_OF_MEMORY);
9791 }
9792}
9793
daniel@transgaming.comce3d0f22010-05-04 03:35:14 +00009794__eglMustCastToProperFunctionPointerType __stdcall glGetProcAddress(const char *procname)
9795{
9796 struct Extension
9797 {
9798 const char *name;
9799 __eglMustCastToProperFunctionPointerType address;
9800 };
9801
9802 static const Extension glExtensions[] =
9803 {
9804 {"glTexImage3DOES", (__eglMustCastToProperFunctionPointerType)glTexImage3DOES},
daniel@transgaming.com01868132010-08-24 19:21:17 +00009805 {"glBlitFramebufferANGLE", (__eglMustCastToProperFunctionPointerType)glBlitFramebufferANGLE},
daniel@transgaming.com1fe96c92011-01-14 15:08:44 +00009806 {"glRenderbufferStorageMultisampleANGLE", (__eglMustCastToProperFunctionPointerType)glRenderbufferStorageMultisampleANGLE},
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00009807 {"glDeleteFencesNV", (__eglMustCastToProperFunctionPointerType)glDeleteFencesNV},
9808 {"glGenFencesNV", (__eglMustCastToProperFunctionPointerType)glGenFencesNV},
9809 {"glIsFenceNV", (__eglMustCastToProperFunctionPointerType)glIsFenceNV},
9810 {"glTestFenceNV", (__eglMustCastToProperFunctionPointerType)glTestFenceNV},
9811 {"glGetFenceivNV", (__eglMustCastToProperFunctionPointerType)glGetFenceivNV},
9812 {"glFinishFenceNV", (__eglMustCastToProperFunctionPointerType)glFinishFenceNV},
9813 {"glSetFenceNV", (__eglMustCastToProperFunctionPointerType)glSetFenceNV},
zmo@google.coma574f782011-10-03 21:45:23 +00009814 {"glGetTranslatedShaderSourceANGLE", (__eglMustCastToProperFunctionPointerType)glGetTranslatedShaderSourceANGLE},
daniel@transgaming.com0bd1f2f2011-11-11 04:19:03 +00009815 {"glTexStorage2DEXT", (__eglMustCastToProperFunctionPointerType)glTexStorage2DEXT},
daniel@transgaming.com709ed112011-11-12 03:18:10 +00009816 {"glGetGraphicsResetStatusEXT", (__eglMustCastToProperFunctionPointerType)glGetGraphicsResetStatusEXT},
9817 {"glReadnPixelsEXT", (__eglMustCastToProperFunctionPointerType)glReadnPixelsEXT},
9818 {"glGetnUniformfvEXT", (__eglMustCastToProperFunctionPointerType)glGetnUniformfvEXT},
9819 {"glGetnUniformivEXT", (__eglMustCastToProperFunctionPointerType)glGetnUniformivEXT},
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00009820 {"glGenQueriesEXT", (__eglMustCastToProperFunctionPointerType)glGenQueriesEXT},
9821 {"glDeleteQueriesEXT", (__eglMustCastToProperFunctionPointerType)glDeleteQueriesEXT},
9822 {"glIsQueryEXT", (__eglMustCastToProperFunctionPointerType)glIsQueryEXT},
9823 {"glBeginQueryEXT", (__eglMustCastToProperFunctionPointerType)glBeginQueryEXT},
9824 {"glEndQueryEXT", (__eglMustCastToProperFunctionPointerType)glEndQueryEXT},
9825 {"glGetQueryivEXT", (__eglMustCastToProperFunctionPointerType)glGetQueryivEXT},
9826 {"glGetQueryObjectuivEXT", (__eglMustCastToProperFunctionPointerType)glGetQueryObjectuivEXT},
shannon.woods%transgaming.com@gtempaccount.com77d94722013-04-13 03:34:22 +00009827 {"glDrawBuffersEXT", (__eglMustCastToProperFunctionPointerType)glDrawBuffersEXT},
daniel@transgaming.comdce02fd2012-01-27 15:39:51 +00009828 {"glVertexAttribDivisorANGLE", (__eglMustCastToProperFunctionPointerType)glVertexAttribDivisorANGLE},
9829 {"glDrawArraysInstancedANGLE", (__eglMustCastToProperFunctionPointerType)glDrawArraysInstancedANGLE},
9830 {"glDrawElementsInstancedANGLE", (__eglMustCastToProperFunctionPointerType)glDrawElementsInstancedANGLE},
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00009831 {"glGetProgramBinaryOES", (__eglMustCastToProperFunctionPointerType)glGetProgramBinaryOES},
9832 {"glProgramBinaryOES", (__eglMustCastToProperFunctionPointerType)glProgramBinaryOES}, };
daniel@transgaming.comce3d0f22010-05-04 03:35:14 +00009833
shannon.woods@transgaming.comd438fd42013-02-28 23:17:45 +00009834 for (unsigned int ext = 0; ext < ArraySize(glExtensions); ext++)
daniel@transgaming.comce3d0f22010-05-04 03:35:14 +00009835 {
9836 if (strcmp(procname, glExtensions[ext].name) == 0)
9837 {
9838 return (__eglMustCastToProperFunctionPointerType)glExtensions[ext].address;
9839 }
9840 }
9841
9842 return NULL;
9843}
9844
daniel@transgaming.com17f548c2011-11-09 17:47:02 +00009845// Non-public functions used by EGL
9846
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00009847bool __stdcall glBindTexImage(egl::Surface *surface)
jbauman@chromium.orgae345802011-03-30 22:04:25 +00009848{
9849 EVENT("(egl::Surface* surface = 0x%0.8p)",
9850 surface);
9851
9852 try
9853 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00009854 gl::Context *context = gl::getNonLostContext();
jbauman@chromium.orgae345802011-03-30 22:04:25 +00009855
9856 if (context)
9857 {
9858 gl::Texture2D *textureObject = context->getTexture2D();
9859
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00009860 if (textureObject->isImmutable())
9861 {
9862 return false;
9863 }
9864
jbauman@chromium.orgae345802011-03-30 22:04:25 +00009865 if (textureObject)
9866 {
9867 textureObject->bindTexImage(surface);
9868 }
9869 }
9870 }
9871 catch(std::bad_alloc&)
9872 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00009873 return gl::error(GL_OUT_OF_MEMORY, false);
jbauman@chromium.orgae345802011-03-30 22:04:25 +00009874 }
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00009875
9876 return true;
jbauman@chromium.orgae345802011-03-30 22:04:25 +00009877}
9878
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00009879}