blob: 518cf5bf534c91331b1b2c57977849457e34ca8c [file] [log] [blame]
shannon.woods@transgaming.combdf2d802013-02-28 23:16:20 +00001#include "precompiled.h"
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002//
shannon.woods%transgaming.com@gtempaccount.com8dce6512013-04-13 03:42:19 +00003// Copyright (c) 2002-2013 The ANGLE Project Authors. All rights reserved.
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004// Use of this source code is governed by a BSD-style license that can be
5// found in the LICENSE file.
6//
7
8// libGLESv2.cpp: Implements the exported OpenGL ES 2.0 functions.
9
daniel@transgaming.coma0ce7e62011-01-25 14:47:16 +000010#include "common/version.h"
daniel@transgaming.combbf56f72010-04-20 18:52:13 +000011
12#include "libGLESv2/main.h"
shannonwoods@chromium.orga2ecfcc2013-05-30 00:11:59 +000013#include "common/utilities.h"
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +000014#include "libGLESv2/formatutils.h"
daniel@transgaming.combbf56f72010-04-20 18:52:13 +000015#include "libGLESv2/Buffer.h"
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +000016#include "libGLESv2/Fence.h"
daniel@transgaming.combbf56f72010-04-20 18:52:13 +000017#include "libGLESv2/Framebuffer.h"
shannon.woods@transgaming.com486d9e92013-02-28 23:15:41 +000018#include "libGLESv2/Renderbuffer.h"
daniel@transgaming.combbf56f72010-04-20 18:52:13 +000019#include "libGLESv2/Program.h"
apatrick@chromium.orgea09f9b2012-06-08 00:45:32 +000020#include "libGLESv2/ProgramBinary.h"
daniel@transgaming.combbf56f72010-04-20 18:52:13 +000021#include "libGLESv2/Texture.h"
daniel@transgaming.com86bdb822012-01-20 18:24:39 +000022#include "libGLESv2/Query.h"
shannon.woods@transgaming.com486d9e92013-02-28 23:15:41 +000023#include "libGLESv2/Context.h"
Jamie Madill57a89722013-07-02 11:57:03 -040024#include "libGLESv2/VertexArray.h"
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000025
Geoff Lange8ebe7f2013-08-05 15:03:13 -040026#include "libGLESv2/validationES.h"
27#include "libGLESv2/validationES2.h"
28#include "libGLESv2/validationES3.h"
Jamie Madill478fdb22013-07-19 16:36:59 -040029
30
Jamie Madillfb8a8302013-07-03 14:24:12 -040031gl::Texture *getTargetTexture(gl::Context *context, GLenum target)
32{
33 if (context->getClientVersion() < 3)
34 {
35 if (target == GL_TEXTURE_3D || target == GL_TEXTURE_2D_ARRAY)
36 {
37 return NULL;
38 }
39 }
40
41 switch (target)
42 {
43 case GL_TEXTURE_2D: return context->getTexture2D();
44 case GL_TEXTURE_CUBE_MAP: return context->getTextureCubeMap();
45 case GL_TEXTURE_3D: return context->getTexture3D();
46 case GL_TEXTURE_2D_ARRAY: return context->getTexture2DArray();
47 default: return NULL;
48 }
49}
Jamie Madill478fdb22013-07-19 16:36:59 -040050
Jamie Madillf6cc8cc2013-07-03 12:44:15 -040051
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000052extern "C"
53{
54
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +000055// OpenGL ES 2.0 functions
56
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000057void __stdcall glActiveTexture(GLenum texture)
58{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +000059 EVENT("(GLenum texture = 0x%X)", texture);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000060
61 try
62 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +000063 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000064
65 if (context)
66 {
daniel@transgaming.com3f74c7a2011-05-11 15:36:51 +000067 if (texture < GL_TEXTURE0 || texture > GL_TEXTURE0 + context->getMaximumCombinedTextureImageUnits() - 1)
68 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000069 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com3f74c7a2011-05-11 15:36:51 +000070 }
71
daniel@transgaming.com428d1582010-05-04 03:35:25 +000072 context->setActiveSampler(texture - GL_TEXTURE0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000073 }
74 }
75 catch(std::bad_alloc&)
76 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000077 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000078 }
79}
80
81void __stdcall glAttachShader(GLuint program, GLuint shader)
82{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +000083 EVENT("(GLuint program = %d, GLuint shader = %d)", program, shader);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000084
85 try
86 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +000087 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000088
89 if (context)
90 {
91 gl::Program *programObject = context->getProgram(program);
92 gl::Shader *shaderObject = context->getShader(shader);
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +000093
daniel@transgaming.come9d6ed02010-04-13 03:26:23 +000094 if (!programObject)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000095 {
daniel@transgaming.come9d6ed02010-04-13 03:26:23 +000096 if (context->getShader(program))
97 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000098 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.come9d6ed02010-04-13 03:26:23 +000099 }
100 else
101 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000102 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.come9d6ed02010-04-13 03:26:23 +0000103 }
104 }
105
106 if (!shaderObject)
107 {
108 if (context->getProgram(shader))
109 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000110 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.come9d6ed02010-04-13 03:26:23 +0000111 }
112 else
113 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000114 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.come9d6ed02010-04-13 03:26:23 +0000115 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000116 }
117
118 if (!programObject->attachShader(shaderObject))
119 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000120 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000121 }
122 }
123 }
124 catch(std::bad_alloc&)
125 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000126 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000127 }
128}
129
daniel@transgaming.com86bdb822012-01-20 18:24:39 +0000130void __stdcall glBeginQueryEXT(GLenum target, GLuint id)
131{
132 EVENT("(GLenum target = 0x%X, GLuint %d)", target, id);
133
134 try
135 {
136 switch (target)
137 {
138 case GL_ANY_SAMPLES_PASSED_EXT:
139 case GL_ANY_SAMPLES_PASSED_CONSERVATIVE_EXT:
140 break;
141 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000142 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +0000143 }
144
145 if (id == 0)
146 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000147 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +0000148 }
149
150 gl::Context *context = gl::getNonLostContext();
151
152 if (context)
153 {
154 context->beginQuery(target, id);
155 }
156 }
157 catch(std::bad_alloc&)
158 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000159 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +0000160 }
161}
162
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +0000163void __stdcall glBindAttribLocation(GLuint program, GLuint index, const GLchar* name)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000164{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000165 EVENT("(GLuint program = %d, GLuint index = %d, const GLchar* name = 0x%0.8p)", program, index, name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000166
167 try
168 {
169 if (index >= gl::MAX_VERTEX_ATTRIBS)
170 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000171 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000172 }
173
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000174 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000175
176 if (context)
177 {
178 gl::Program *programObject = context->getProgram(program);
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +0000179
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000180 if (!programObject)
181 {
daniel@transgaming.com98079832010-04-13 03:26:29 +0000182 if (context->getShader(program))
183 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000184 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com98079832010-04-13 03:26:29 +0000185 }
186 else
187 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000188 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com98079832010-04-13 03:26:29 +0000189 }
190 }
191
192 if (strncmp(name, "gl_", 3) == 0)
193 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000194 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000195 }
196
197 programObject->bindAttributeLocation(index, name);
198 }
199 }
200 catch(std::bad_alloc&)
201 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000202 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000203 }
204}
205
206void __stdcall glBindBuffer(GLenum target, GLuint buffer)
207{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000208 EVENT("(GLenum target = 0x%X, GLuint buffer = %d)", target, buffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000209
210 try
211 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000212 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000213
214 if (context)
215 {
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +0000216 // Check ES3 specific targets
217 switch (target)
218 {
shannon.woods%transgaming.com@gtempaccount.com51171882013-04-13 03:39:10 +0000219 case GL_COPY_READ_BUFFER:
220 case GL_COPY_WRITE_BUFFER:
shannon.woods%transgaming.com@gtempaccount.comc926e5f2013-04-13 03:39:18 +0000221 case GL_PIXEL_PACK_BUFFER:
222 case GL_PIXEL_UNPACK_BUFFER:
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +0000223 case GL_UNIFORM_BUFFER:
224 case GL_TRANSFORM_FEEDBACK_BUFFER:
225 if (context->getClientVersion() < 3)
226 {
227 return gl::error(GL_INVALID_ENUM);
228 }
229 }
230
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000231 switch (target)
232 {
233 case GL_ARRAY_BUFFER:
234 context->bindArrayBuffer(buffer);
235 return;
236 case GL_ELEMENT_ARRAY_BUFFER:
237 context->bindElementArrayBuffer(buffer);
238 return;
shannon.woods%transgaming.com@gtempaccount.com51171882013-04-13 03:39:10 +0000239 case GL_COPY_READ_BUFFER:
240 context->bindCopyReadBuffer(buffer);
241 return;
242 case GL_COPY_WRITE_BUFFER:
243 context->bindCopyWriteBuffer(buffer);
244 return;
shannon.woods%transgaming.com@gtempaccount.comc926e5f2013-04-13 03:39:18 +0000245 case GL_PIXEL_PACK_BUFFER:
246 context->bindPixelPackBuffer(buffer);
247 return;
248 case GL_PIXEL_UNPACK_BUFFER:
249 context->bindPixelUnpackBuffer(buffer);
250 return;
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +0000251 case GL_UNIFORM_BUFFER:
252 context->bindGenericUniformBuffer(buffer);
253 return;
254 case GL_TRANSFORM_FEEDBACK_BUFFER:
shannonwoods@chromium.org7a1ebad2013-05-30 00:05:20 +0000255 context->bindGenericTransformFeedbackBuffer(buffer);
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +0000256 return;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000257 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000258 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000259 }
260 }
261 }
262 catch(std::bad_alloc&)
263 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000264 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000265 }
266}
267
268void __stdcall glBindFramebuffer(GLenum target, GLuint framebuffer)
269{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000270 EVENT("(GLenum target = 0x%X, GLuint framebuffer = %d)", target, framebuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000271
272 try
273 {
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +0000274 if (target != GL_FRAMEBUFFER && target != GL_DRAW_FRAMEBUFFER_ANGLE && target != GL_READ_FRAMEBUFFER_ANGLE)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000275 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000276 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000277 }
278
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000279 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000280
281 if (context)
282 {
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +0000283 if (target == GL_READ_FRAMEBUFFER_ANGLE || target == GL_FRAMEBUFFER)
284 {
285 context->bindReadFramebuffer(framebuffer);
286 }
287
288 if (target == GL_DRAW_FRAMEBUFFER_ANGLE || target == GL_FRAMEBUFFER)
289 {
290 context->bindDrawFramebuffer(framebuffer);
291 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000292 }
293 }
294 catch(std::bad_alloc&)
295 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000296 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000297 }
298}
299
300void __stdcall glBindRenderbuffer(GLenum target, GLuint renderbuffer)
301{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000302 EVENT("(GLenum target = 0x%X, GLuint renderbuffer = %d)", target, renderbuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000303
304 try
305 {
306 if (target != GL_RENDERBUFFER)
307 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000308 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000309 }
310
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000311 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000312
313 if (context)
314 {
315 context->bindRenderbuffer(renderbuffer);
316 }
317 }
318 catch(std::bad_alloc&)
319 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000320 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000321 }
322}
323
324void __stdcall glBindTexture(GLenum target, GLuint texture)
325{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000326 EVENT("(GLenum target = 0x%X, GLuint texture = %d)", target, texture);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000327
328 try
329 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000330 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000331
332 if (context)
333 {
334 gl::Texture *textureObject = context->getTexture(texture);
335
336 if (textureObject && textureObject->getTarget() != target && texture != 0)
337 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000338 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000339 }
340
341 switch (target)
342 {
343 case GL_TEXTURE_2D:
344 context->bindTexture2D(texture);
345 return;
346 case GL_TEXTURE_CUBE_MAP:
347 context->bindTextureCubeMap(texture);
348 return;
shannon.woods%transgaming.com@gtempaccount.comc416e1c2013-04-13 03:45:05 +0000349 case GL_TEXTURE_3D:
350 if (context->getClientVersion() < 3)
351 {
352 return gl::error(GL_INVALID_ENUM);
353 }
354 context->bindTexture3D(texture);
355 return;
shannon.woods%transgaming.com@gtempaccount.com90dbc442013-04-13 03:46:14 +0000356 case GL_TEXTURE_2D_ARRAY:
357 if (context->getClientVersion() < 3)
358 {
359 return gl::error(GL_INVALID_ENUM);
360 }
361 context->bindTexture2DArray(texture);
362 return;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000363 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000364 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000365 }
366 }
367 }
368 catch(std::bad_alloc&)
369 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000370 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000371 }
372}
373
374void __stdcall glBlendColor(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha)
375{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000376 EVENT("(GLclampf red = %f, GLclampf green = %f, GLclampf blue = %f, GLclampf alpha = %f)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +0000377 red, green, blue, alpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000378
379 try
380 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000381 gl::Context* context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000382
383 if (context)
384 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +0000385 context->setBlendColor(gl::clamp01(red), gl::clamp01(green), gl::clamp01(blue), gl::clamp01(alpha));
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000386 }
387 }
388 catch(std::bad_alloc&)
389 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000390 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000391 }
392}
393
394void __stdcall glBlendEquation(GLenum mode)
395{
396 glBlendEquationSeparate(mode, mode);
397}
398
399void __stdcall glBlendEquationSeparate(GLenum modeRGB, GLenum modeAlpha)
400{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000401 EVENT("(GLenum modeRGB = 0x%X, GLenum modeAlpha = 0x%X)", modeRGB, modeAlpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000402
403 try
404 {
shannon.woods%transgaming.com@gtempaccount.com00b6a0e2013-04-13 03:38:00 +0000405 gl::Context *context = gl::getNonLostContext();
406
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000407 switch (modeRGB)
408 {
409 case GL_FUNC_ADD:
410 case GL_FUNC_SUBTRACT:
411 case GL_FUNC_REVERSE_SUBTRACT:
412 break;
shannon.woods%transgaming.com@gtempaccount.com00b6a0e2013-04-13 03:38:00 +0000413
414 case GL_MIN:
415 case GL_MAX:
416 if (context && context->getClientVersion() < 3)
417 {
418 return gl::error(GL_INVALID_ENUM);
419 }
420 break;
421
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000422 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000423 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000424 }
425
426 switch (modeAlpha)
427 {
428 case GL_FUNC_ADD:
429 case GL_FUNC_SUBTRACT:
430 case GL_FUNC_REVERSE_SUBTRACT:
431 break;
shannon.woods%transgaming.com@gtempaccount.com00b6a0e2013-04-13 03:38:00 +0000432
433 case GL_MIN:
434 case GL_MAX:
435 if (context && context->getClientVersion() < 3)
436 {
437 return gl::error(GL_INVALID_ENUM);
438 }
439 break;
440
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000441 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000442 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000443 }
444
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000445 if (context)
446 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +0000447 context->setBlendEquation(modeRGB, modeAlpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000448 }
449 }
450 catch(std::bad_alloc&)
451 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000452 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000453 }
454}
455
456void __stdcall glBlendFunc(GLenum sfactor, GLenum dfactor)
457{
458 glBlendFuncSeparate(sfactor, dfactor, sfactor, dfactor);
459}
460
461void __stdcall glBlendFuncSeparate(GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha)
462{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000463 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 +0000464 srcRGB, dstRGB, srcAlpha, dstAlpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000465
466 try
467 {
shannonwoods@chromium.org48ae0252013-05-30 00:13:22 +0000468 gl::Context *context = gl::getNonLostContext();
469
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000470 switch (srcRGB)
471 {
472 case GL_ZERO:
473 case GL_ONE:
474 case GL_SRC_COLOR:
475 case GL_ONE_MINUS_SRC_COLOR:
476 case GL_DST_COLOR:
477 case GL_ONE_MINUS_DST_COLOR:
478 case GL_SRC_ALPHA:
479 case GL_ONE_MINUS_SRC_ALPHA:
480 case GL_DST_ALPHA:
481 case GL_ONE_MINUS_DST_ALPHA:
482 case GL_CONSTANT_COLOR:
483 case GL_ONE_MINUS_CONSTANT_COLOR:
484 case GL_CONSTANT_ALPHA:
485 case GL_ONE_MINUS_CONSTANT_ALPHA:
486 case GL_SRC_ALPHA_SATURATE:
487 break;
488 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000489 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000490 }
491
492 switch (dstRGB)
493 {
494 case GL_ZERO:
495 case GL_ONE:
496 case GL_SRC_COLOR:
497 case GL_ONE_MINUS_SRC_COLOR:
498 case GL_DST_COLOR:
499 case GL_ONE_MINUS_DST_COLOR:
500 case GL_SRC_ALPHA:
501 case GL_ONE_MINUS_SRC_ALPHA:
502 case GL_DST_ALPHA:
503 case GL_ONE_MINUS_DST_ALPHA:
504 case GL_CONSTANT_COLOR:
505 case GL_ONE_MINUS_CONSTANT_COLOR:
506 case GL_CONSTANT_ALPHA:
507 case GL_ONE_MINUS_CONSTANT_ALPHA:
508 break;
shannonwoods@chromium.org48ae0252013-05-30 00:13:22 +0000509
510 case GL_SRC_ALPHA_SATURATE:
511 if (!context || context->getClientVersion() < 3)
512 {
513 return gl::error(GL_INVALID_ENUM);
514 }
515 break;
516
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000517 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000518 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000519 }
520
521 switch (srcAlpha)
522 {
523 case GL_ZERO:
524 case GL_ONE:
525 case GL_SRC_COLOR:
526 case GL_ONE_MINUS_SRC_COLOR:
527 case GL_DST_COLOR:
528 case GL_ONE_MINUS_DST_COLOR:
529 case GL_SRC_ALPHA:
530 case GL_ONE_MINUS_SRC_ALPHA:
531 case GL_DST_ALPHA:
532 case GL_ONE_MINUS_DST_ALPHA:
533 case GL_CONSTANT_COLOR:
534 case GL_ONE_MINUS_CONSTANT_COLOR:
535 case GL_CONSTANT_ALPHA:
536 case GL_ONE_MINUS_CONSTANT_ALPHA:
537 case GL_SRC_ALPHA_SATURATE:
538 break;
539 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000540 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000541 }
542
543 switch (dstAlpha)
544 {
545 case GL_ZERO:
546 case GL_ONE:
547 case GL_SRC_COLOR:
548 case GL_ONE_MINUS_SRC_COLOR:
549 case GL_DST_COLOR:
550 case GL_ONE_MINUS_DST_COLOR:
551 case GL_SRC_ALPHA:
552 case GL_ONE_MINUS_SRC_ALPHA:
553 case GL_DST_ALPHA:
554 case GL_ONE_MINUS_DST_ALPHA:
555 case GL_CONSTANT_COLOR:
556 case GL_ONE_MINUS_CONSTANT_COLOR:
557 case GL_CONSTANT_ALPHA:
558 case GL_ONE_MINUS_CONSTANT_ALPHA:
559 break;
shannonwoods@chromium.org48ae0252013-05-30 00:13:22 +0000560
561 case GL_SRC_ALPHA_SATURATE:
562 if (!context || context->getClientVersion() < 3)
563 {
564 return gl::error(GL_INVALID_ENUM);
565 }
566 break;
567
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000568 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
daniel@transgaming.comfe453652010-03-16 06:23:28 +0000572 bool constantColorUsed = (srcRGB == GL_CONSTANT_COLOR || srcRGB == GL_ONE_MINUS_CONSTANT_COLOR ||
573 dstRGB == GL_CONSTANT_COLOR || dstRGB == GL_ONE_MINUS_CONSTANT_COLOR);
574
575 bool constantAlphaUsed = (srcRGB == GL_CONSTANT_ALPHA || srcRGB == GL_ONE_MINUS_CONSTANT_ALPHA ||
576 dstRGB == GL_CONSTANT_ALPHA || dstRGB == GL_ONE_MINUS_CONSTANT_ALPHA);
577
578 if (constantColorUsed && constantAlphaUsed)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000579 {
daniel@transgaming.comfe453652010-03-16 06:23:28 +0000580 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 +0000581 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000582 }
583
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000584 if (context)
585 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +0000586 context->setBlendFactors(srcRGB, dstRGB, srcAlpha, dstAlpha);
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
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +0000595void __stdcall glBufferData(GLenum target, GLsizeiptr size, const GLvoid* data, GLenum usage)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000596{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000597 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 +0000598 target, size, data, usage);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000599
600 try
601 {
602 if (size < 0)
603 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000604 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000605 }
606
shannon.woods%transgaming.com@gtempaccount.comf2db40b2013-04-13 03:37:09 +0000607 gl::Context *context = gl::getNonLostContext();
608
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000609 switch (usage)
610 {
611 case GL_STREAM_DRAW:
612 case GL_STATIC_DRAW:
613 case GL_DYNAMIC_DRAW:
614 break;
shannon.woods%transgaming.com@gtempaccount.comf2db40b2013-04-13 03:37:09 +0000615
616 case GL_STREAM_READ:
617 case GL_STREAM_COPY:
618 case GL_STATIC_READ:
619 case GL_STATIC_COPY:
620 case GL_DYNAMIC_READ:
621 case GL_DYNAMIC_COPY:
622 if (context && context->getClientVersion() < 3)
623 {
624 return gl::error(GL_INVALID_ENUM);
625 }
626 break;
627
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000628 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000629 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000630 }
631
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000632 if (context)
633 {
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +0000634 // Check ES3 specific targets
635 switch (target)
636 {
shannon.woods%transgaming.com@gtempaccount.com51171882013-04-13 03:39:10 +0000637 case GL_COPY_READ_BUFFER:
638 case GL_COPY_WRITE_BUFFER:
shannon.woods%transgaming.com@gtempaccount.comc926e5f2013-04-13 03:39:18 +0000639 case GL_PIXEL_PACK_BUFFER:
640 case GL_PIXEL_UNPACK_BUFFER:
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +0000641 case GL_UNIFORM_BUFFER:
642 case GL_TRANSFORM_FEEDBACK_BUFFER:
643 if (context->getClientVersion() < 3)
644 {
645 return gl::error(GL_INVALID_ENUM);
646 }
647 }
648
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000649 gl::Buffer *buffer;
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +0000650
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000651 switch (target)
652 {
653 case GL_ARRAY_BUFFER:
654 buffer = context->getArrayBuffer();
655 break;
656 case GL_ELEMENT_ARRAY_BUFFER:
657 buffer = context->getElementArrayBuffer();
658 break;
shannon.woods%transgaming.com@gtempaccount.com51171882013-04-13 03:39:10 +0000659 case GL_COPY_READ_BUFFER:
660 buffer = context->getCopyReadBuffer();
661 break;
662 case GL_COPY_WRITE_BUFFER:
663 buffer = context->getCopyWriteBuffer();
664 break;
shannon.woods%transgaming.com@gtempaccount.comc926e5f2013-04-13 03:39:18 +0000665 case GL_PIXEL_PACK_BUFFER:
666 buffer = context->getPixelPackBuffer();
667 break;
668 case GL_PIXEL_UNPACK_BUFFER:
669 buffer = context->getPixelUnpackBuffer();
670 break;
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +0000671 case GL_TRANSFORM_FEEDBACK_BUFFER:
672 buffer = context->getGenericTransformFeedbackBuffer();
673 break;
674 case GL_UNIFORM_BUFFER:
675 buffer = context->getGenericUniformBuffer();
676 break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000677 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000678 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000679 }
680
681 if (!buffer)
682 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000683 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000684 }
685
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +0000686 buffer->bufferData(data, size, usage);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000687 }
688 }
689 catch(std::bad_alloc&)
690 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000691 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000692 }
693}
694
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +0000695void __stdcall glBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid* data)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000696{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000697 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 +0000698 target, offset, size, data);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000699
700 try
701 {
daniel@transgaming.comdefa1c32010-05-18 18:51:45 +0000702 if (size < 0 || offset < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000703 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000704 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000705 }
706
daniel@transgaming.comd4620a32010-03-21 04:31:28 +0000707 if (data == NULL)
708 {
709 return;
710 }
711
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000712 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +0000713
714 if (context)
715 {
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +0000716 // Check ES3 specific targets
717 switch (target)
718 {
shannon.woods%transgaming.com@gtempaccount.com51171882013-04-13 03:39:10 +0000719 case GL_COPY_READ_BUFFER:
720 case GL_COPY_WRITE_BUFFER:
shannon.woods%transgaming.com@gtempaccount.comc926e5f2013-04-13 03:39:18 +0000721 case GL_PIXEL_PACK_BUFFER:
722 case GL_PIXEL_UNPACK_BUFFER:
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +0000723 case GL_UNIFORM_BUFFER:
724 case GL_TRANSFORM_FEEDBACK_BUFFER:
725 if (context->getClientVersion() < 3)
726 {
727 return gl::error(GL_INVALID_ENUM);
728 }
729 }
730
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +0000731 gl::Buffer *buffer;
732
733 switch (target)
734 {
735 case GL_ARRAY_BUFFER:
736 buffer = context->getArrayBuffer();
737 break;
738 case GL_ELEMENT_ARRAY_BUFFER:
739 buffer = context->getElementArrayBuffer();
740 break;
shannon.woods%transgaming.com@gtempaccount.com51171882013-04-13 03:39:10 +0000741 case GL_COPY_READ_BUFFER:
742 buffer = context->getCopyReadBuffer();
743 break;
744 case GL_COPY_WRITE_BUFFER:
745 buffer = context->getCopyWriteBuffer();
746 break;
shannon.woods%transgaming.com@gtempaccount.comc926e5f2013-04-13 03:39:18 +0000747 case GL_PIXEL_PACK_BUFFER:
748 buffer = context->getPixelPackBuffer();
749 break;
750 case GL_PIXEL_UNPACK_BUFFER:
751 buffer = context->getPixelUnpackBuffer();
752 break;
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +0000753 case GL_TRANSFORM_FEEDBACK_BUFFER:
754 buffer = context->getGenericTransformFeedbackBuffer();
755 break;
756 case GL_UNIFORM_BUFFER:
757 buffer = context->getGenericUniformBuffer();
758 break;
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +0000759 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000760 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +0000761 }
762
763 if (!buffer)
764 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000765 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +0000766 }
767
daniel@transgaming.comdefa1c32010-05-18 18:51:45 +0000768 if ((size_t)size + offset > buffer->size())
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +0000769 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000770 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +0000771 }
daniel@transgaming.comdefa1c32010-05-18 18:51:45 +0000772
773 buffer->bufferSubData(data, size, offset);
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +0000774 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000775 }
776 catch(std::bad_alloc&)
777 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000778 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000779 }
780}
781
782GLenum __stdcall glCheckFramebufferStatus(GLenum target)
783{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000784 EVENT("(GLenum target = 0x%X)", target);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000785
786 try
787 {
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +0000788 if (target != GL_FRAMEBUFFER && target != GL_DRAW_FRAMEBUFFER_ANGLE && target != GL_READ_FRAMEBUFFER_ANGLE)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000789 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000790 return gl::error(GL_INVALID_ENUM, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000791 }
792
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000793 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000794
795 if (context)
796 {
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +0000797 gl::Framebuffer *framebuffer = NULL;
798 if (target == GL_READ_FRAMEBUFFER_ANGLE)
799 {
800 framebuffer = context->getReadFramebuffer();
801 }
802 else
803 {
804 framebuffer = context->getDrawFramebuffer();
805 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000806
807 return framebuffer->completeness();
808 }
809 }
810 catch(std::bad_alloc&)
811 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000812 return gl::error(GL_OUT_OF_MEMORY, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000813 }
814
815 return 0;
816}
817
818void __stdcall glClear(GLbitfield mask)
819{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +0000820 EVENT("(GLbitfield mask = 0x%X)", mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000821
822 try
823 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000824 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000825
826 if (context)
827 {
828 context->clear(mask);
829 }
830 }
831 catch(std::bad_alloc&)
832 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000833 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000834 }
835}
836
837void __stdcall glClearColor(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha)
838{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000839 EVENT("(GLclampf red = %f, GLclampf green = %f, GLclampf blue = %f, GLclampf alpha = %f)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +0000840 red, green, blue, alpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000841
842 try
843 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000844 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000845
846 if (context)
847 {
848 context->setClearColor(red, green, blue, alpha);
849 }
850 }
851 catch(std::bad_alloc&)
852 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000853 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000854 }
855}
856
857void __stdcall glClearDepthf(GLclampf depth)
858{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000859 EVENT("(GLclampf depth = %f)", depth);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000860
861 try
862 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000863 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000864
865 if (context)
866 {
867 context->setClearDepth(depth);
868 }
869 }
870 catch(std::bad_alloc&)
871 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000872 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000873 }
874}
875
876void __stdcall glClearStencil(GLint s)
877{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000878 EVENT("(GLint s = %d)", s);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000879
880 try
881 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000882 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000883
884 if (context)
885 {
886 context->setClearStencil(s);
887 }
888 }
889 catch(std::bad_alloc&)
890 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000891 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000892 }
893}
894
895void __stdcall glColorMask(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha)
896{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +0000897 EVENT("(GLboolean red = %d, GLboolean green = %u, GLboolean blue = %u, GLboolean alpha = %u)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +0000898 red, green, blue, alpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000899
900 try
901 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000902 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000903
904 if (context)
905 {
daniel@transgaming.coma36f98e2010-05-18 18:51:09 +0000906 context->setColorMask(red == GL_TRUE, green == GL_TRUE, blue == GL_TRUE, alpha == GL_TRUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000907 }
908 }
909 catch(std::bad_alloc&)
910 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000911 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000912 }
913}
914
915void __stdcall glCompileShader(GLuint shader)
916{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000917 EVENT("(GLuint shader = %d)", shader);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000918
919 try
920 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000921 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000922
923 if (context)
924 {
925 gl::Shader *shaderObject = context->getShader(shader);
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +0000926
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000927 if (!shaderObject)
928 {
daniel@transgaming.com0cefaf42010-04-13 03:26:36 +0000929 if (context->getProgram(shader))
930 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000931 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com0cefaf42010-04-13 03:26:36 +0000932 }
933 else
934 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000935 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com0cefaf42010-04-13 03:26:36 +0000936 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000937 }
938
939 shaderObject->compile();
940 }
941 }
942 catch(std::bad_alloc&)
943 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000944 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000945 }
946}
947
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +0000948void __stdcall glCompressedTexImage2D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height,
949 GLint border, GLsizei imageSize, const GLvoid* data)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000950{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000951 EVENT("(GLenum target = 0x%X, GLint level = %d, GLenum internalformat = 0x%X, GLsizei width = %d, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +0000952 "GLsizei height = %d, GLint border = %d, GLsizei imageSize = %d, const GLvoid* data = 0x%0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000953 target, level, internalformat, width, height, border, imageSize, data);
954
955 try
956 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000957 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com01868132010-08-24 19:21:17 +0000958
959 if (context)
960 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000961 if (context->getClientVersion() < 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -0400962 !ValidateES2TexImageParameters(context, target, level, internalformat, true, false,
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000963 0, 0, width, height, 0, GL_NONE, GL_NONE, data))
964 {
965 return;
966 }
967
968 if (context->getClientVersion() >= 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -0400969 !ValidateES3TexImageParameters(context, target, level, internalformat, true, false,
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000970 0, 0, 0, width, height, 1, 0, GL_NONE, GL_NONE))
971 {
972 return;
973 }
974
975 if (imageSize < 0 || imageSize != (GLsizei)gl::GetBlockSize(internalformat, GL_UNSIGNED_BYTE, context->getClientVersion(), width, height))
daniel@transgaming.com5d752f22010-10-07 13:37:20 +0000976 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000977 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +0000978 }
979
980 switch (target)
981 {
982 case GL_TEXTURE_2D:
daniel@transgaming.com5d752f22010-10-07 13:37:20 +0000983 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000984 gl::Texture2D *texture = context->getTexture2D();
985 texture->setCompressedImage(level, internalformat, width, height, imageSize, data);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +0000986 }
987 break;
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000988
daniel@transgaming.com5d752f22010-10-07 13:37:20 +0000989 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
990 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
991 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
992 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
993 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
994 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
daniel@transgaming.com5d752f22010-10-07 13:37:20 +0000995 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000996 gl::TextureCubeMap *texture = context->getTextureCubeMap();
997 texture->setCompressedImage(target, level, internalformat, width, height, imageSize, data);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +0000998 }
999 break;
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001000
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001001 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001002 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001003 }
daniel@transgaming.com01868132010-08-24 19:21:17 +00001004 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001005 }
1006 catch(std::bad_alloc&)
1007 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001008 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001009 }
1010}
1011
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00001012void __stdcall glCompressedTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height,
1013 GLenum format, GLsizei imageSize, const GLvoid* data)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001014{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001015 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001016 "GLsizei width = %d, GLsizei height = %d, GLenum format = 0x%X, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00001017 "GLsizei imageSize = %d, const GLvoid* data = 0x%0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001018 target, level, xoffset, yoffset, width, height, format, imageSize, data);
1019
1020 try
1021 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001022 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com01868132010-08-24 19:21:17 +00001023
1024 if (context)
1025 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001026 if (context->getClientVersion() < 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -04001027 !ValidateES2TexImageParameters(context, target, level, GL_NONE, true, true,
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001028 xoffset, yoffset, width, height, 0, GL_NONE, GL_NONE, data))
1029 {
1030 return;
1031 }
1032
1033 if (context->getClientVersion() >= 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -04001034 !ValidateES3TexImageParameters(context, target, level, GL_NONE, true, true,
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001035 xoffset, yoffset, 0, width, height, 1, 0, GL_NONE, GL_NONE))
1036 {
1037 return;
1038 }
1039
1040 if (imageSize < 0 || imageSize != (GLsizei)gl::GetBlockSize(format, GL_UNSIGNED_BYTE, context->getClientVersion(), width, height))
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001041 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001042 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001043 }
1044
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001045 switch (target)
daniel@transgaming.com01868132010-08-24 19:21:17 +00001046 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001047 case GL_TEXTURE_2D:
daniel@transgaming.com01868132010-08-24 19:21:17 +00001048 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001049 gl::Texture2D *texture = context->getTexture2D();
daniel@transgaming.com343373a2011-11-29 19:42:32 +00001050 texture->subImageCompressed(level, xoffset, yoffset, width, height, format, imageSize, data);
daniel@transgaming.com01868132010-08-24 19:21:17 +00001051 }
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001052 break;
1053
1054 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
1055 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
1056 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
1057 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
1058 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
1059 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
daniel@transgaming.com01868132010-08-24 19:21:17 +00001060 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001061 gl::TextureCubeMap *texture = context->getTextureCubeMap();
daniel@transgaming.com343373a2011-11-29 19:42:32 +00001062 texture->subImageCompressed(target, level, xoffset, yoffset, width, height, format, imageSize, data);
daniel@transgaming.com01868132010-08-24 19:21:17 +00001063 }
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001064 break;
1065
1066 default:
1067 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com01868132010-08-24 19:21:17 +00001068 }
1069 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001070 }
1071 catch(std::bad_alloc&)
1072 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001073 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001074 }
1075}
1076
1077void __stdcall glCopyTexImage2D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border)
1078{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001079 EVENT("(GLenum target = 0x%X, GLint level = %d, GLenum internalformat = 0x%X, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001080 "GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d, GLint border = %d)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001081 target, level, internalformat, x, y, width, height, border);
1082
1083 try
1084 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001085 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001086
1087 if (context)
1088 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001089 if (context->getClientVersion() < 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -04001090 !ValidateES2CopyTexImageParameters(context, target, level, internalformat, false,
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001091 0, 0, x, y, width, height, border))
daniel@transgaming.com32b11442011-11-19 02:42:48 +00001092 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001093 return;
daniel@transgaming.com32b11442011-11-19 02:42:48 +00001094 }
1095
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001096 if (context->getClientVersion() >= 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -04001097 !ValidateES3CopyTexImageParameters(context, target, level, internalformat, false,
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001098 0, 0, 0, x, y, width, height, border))
1099 {
1100 return;
1101 }
1102
1103 gl::Framebuffer *framebuffer = context->getReadFramebuffer();
1104
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001105 switch (target)
1106 {
1107 case GL_TEXTURE_2D:
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001108 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001109 gl::Texture2D *texture = context->getTexture2D();
1110 texture->copyImage(level, internalformat, x, y, width, height, framebuffer);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001111 }
1112 break;
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001113
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001114 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
1115 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
1116 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
1117 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
1118 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
1119 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001120 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001121 gl::TextureCubeMap *texture = context->getTextureCubeMap();
1122 texture->copyImage(target, level, internalformat, x, y, width, height, framebuffer);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001123 }
1124 break;
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001125
1126 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001127 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001128 }
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001129 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001130 }
1131 catch(std::bad_alloc&)
1132 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001133 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001134 }
1135}
1136
1137void __stdcall glCopyTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height)
1138{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001139 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001140 "GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001141 target, level, xoffset, yoffset, x, y, width, height);
1142
1143 try
1144 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001145 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001146
1147 if (context)
1148 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001149 if (context->getClientVersion() < 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -04001150 !ValidateES2CopyTexImageParameters(context, target, level, GL_NONE, true,
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001151 xoffset, yoffset, x, y, width, height, 0))
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001152 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001153 return;
1154 }
1155
1156 if (context->getClientVersion() >= 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -04001157 !ValidateES3CopyTexImageParameters(context, target, level, GL_NONE, true,
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001158 xoffset, yoffset, 0, x, y, width, height, 0))
1159 {
1160 return;
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001161 }
1162
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00001163 gl::Framebuffer *framebuffer = context->getReadFramebuffer();
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001164
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001165 switch (target)
daniel@transgaming.combbc57792010-07-28 19:21:05 +00001166 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001167 case GL_TEXTURE_2D:
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +00001168 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001169 gl::Texture2D *texture = context->getTexture2D();
1170 texture->copySubImage(target, level, xoffset, yoffset, 0, x, y, width, height, framebuffer);
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001171 }
1172 break;
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001173
1174 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
1175 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
1176 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
1177 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
1178 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
1179 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00001180 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001181 gl::TextureCubeMap *texture = context->getTextureCubeMap();
1182 texture->copySubImage(target, level, xoffset, yoffset, 0, x, y, width, height, framebuffer);
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00001183 }
1184 break;
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001185
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001186 default:
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001187 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001188 }
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001189 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001190 }
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001191
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001192 catch(std::bad_alloc&)
1193 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001194 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001195 }
1196}
1197
1198GLuint __stdcall glCreateProgram(void)
1199{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001200 EVENT("()");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001201
1202 try
1203 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001204 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001205
1206 if (context)
1207 {
1208 return context->createProgram();
1209 }
1210 }
1211 catch(std::bad_alloc&)
1212 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001213 return gl::error(GL_OUT_OF_MEMORY, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001214 }
1215
1216 return 0;
1217}
1218
1219GLuint __stdcall glCreateShader(GLenum type)
1220{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001221 EVENT("(GLenum type = 0x%X)", type);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001222
1223 try
1224 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001225 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001226
1227 if (context)
1228 {
1229 switch (type)
1230 {
1231 case GL_FRAGMENT_SHADER:
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00001232 case GL_VERTEX_SHADER:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001233 return context->createShader(type);
1234 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001235 return gl::error(GL_INVALID_ENUM, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001236 }
1237 }
1238 }
1239 catch(std::bad_alloc&)
1240 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001241 return gl::error(GL_OUT_OF_MEMORY, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001242 }
1243
1244 return 0;
1245}
1246
1247void __stdcall glCullFace(GLenum mode)
1248{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001249 EVENT("(GLenum mode = 0x%X)", mode);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001250
1251 try
1252 {
1253 switch (mode)
1254 {
1255 case GL_FRONT:
1256 case GL_BACK:
1257 case GL_FRONT_AND_BACK:
1258 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001259 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001260
1261 if (context)
1262 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00001263 context->setCullMode(mode);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001264 }
1265 }
1266 break;
1267 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001268 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001269 }
1270 }
1271 catch(std::bad_alloc&)
1272 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001273 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001274 }
1275}
1276
1277void __stdcall glDeleteBuffers(GLsizei n, const GLuint* buffers)
1278{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001279 EVENT("(GLsizei n = %d, const GLuint* buffers = 0x%0.8p)", n, buffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001280
1281 try
1282 {
1283 if (n < 0)
1284 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001285 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001286 }
1287
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001288 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001289
1290 if (context)
1291 {
1292 for (int i = 0; i < n; i++)
1293 {
1294 context->deleteBuffer(buffers[i]);
1295 }
1296 }
1297 }
1298 catch(std::bad_alloc&)
1299 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001300 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001301 }
1302}
1303
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001304void __stdcall glDeleteFencesNV(GLsizei n, const GLuint* fences)
1305{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001306 EVENT("(GLsizei n = %d, const GLuint* fences = 0x%0.8p)", n, fences);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001307
1308 try
1309 {
1310 if (n < 0)
1311 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001312 return gl::error(GL_INVALID_VALUE);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001313 }
1314
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001315 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001316
1317 if (context)
1318 {
1319 for (int i = 0; i < n; i++)
1320 {
Jamie Madill33dc8432013-07-26 11:55:05 -04001321 context->deleteFenceNV(fences[i]);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001322 }
1323 }
1324 }
1325 catch(std::bad_alloc&)
1326 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001327 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001328 }
1329}
1330
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001331void __stdcall glDeleteFramebuffers(GLsizei n, const GLuint* framebuffers)
1332{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001333 EVENT("(GLsizei n = %d, const GLuint* framebuffers = 0x%0.8p)", n, framebuffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001334
1335 try
1336 {
1337 if (n < 0)
1338 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001339 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001340 }
1341
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001342 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001343
1344 if (context)
1345 {
1346 for (int i = 0; i < n; i++)
1347 {
1348 if (framebuffers[i] != 0)
1349 {
1350 context->deleteFramebuffer(framebuffers[i]);
1351 }
1352 }
1353 }
1354 }
1355 catch(std::bad_alloc&)
1356 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001357 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001358 }
1359}
1360
1361void __stdcall glDeleteProgram(GLuint program)
1362{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001363 EVENT("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001364
1365 try
1366 {
daniel@transgaming.com75401e62010-04-13 03:26:39 +00001367 if (program == 0)
1368 {
1369 return;
1370 }
1371
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001372 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001373
1374 if (context)
1375 {
daniel@transgaming.com75401e62010-04-13 03:26:39 +00001376 if (!context->getProgram(program))
1377 {
1378 if(context->getShader(program))
1379 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001380 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com75401e62010-04-13 03:26:39 +00001381 }
1382 else
1383 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001384 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com75401e62010-04-13 03:26:39 +00001385 }
1386 }
1387
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001388 context->deleteProgram(program);
1389 }
1390 }
1391 catch(std::bad_alloc&)
1392 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001393 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001394 }
1395}
1396
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00001397void __stdcall glDeleteQueriesEXT(GLsizei n, const GLuint *ids)
1398{
1399 EVENT("(GLsizei n = %d, const GLuint *ids = 0x%0.8p)", n, ids);
1400
1401 try
1402 {
1403 if (n < 0)
1404 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001405 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00001406 }
1407
1408 gl::Context *context = gl::getNonLostContext();
1409
1410 if (context)
1411 {
1412 for (int i = 0; i < n; i++)
1413 {
1414 context->deleteQuery(ids[i]);
1415 }
1416 }
1417 }
1418 catch(std::bad_alloc&)
1419 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001420 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00001421 }
1422}
1423
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001424void __stdcall glDeleteRenderbuffers(GLsizei n, const GLuint* renderbuffers)
1425{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001426 EVENT("(GLsizei n = %d, const GLuint* renderbuffers = 0x%0.8p)", n, renderbuffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001427
1428 try
1429 {
1430 if (n < 0)
1431 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001432 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001433 }
1434
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001435 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001436
1437 if (context)
1438 {
daniel@transgaming.come2b22122010-03-11 19:22:14 +00001439 for (int i = 0; i < n; i++)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001440 {
1441 context->deleteRenderbuffer(renderbuffers[i]);
1442 }
1443 }
1444 }
1445 catch(std::bad_alloc&)
1446 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001447 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001448 }
1449}
1450
1451void __stdcall glDeleteShader(GLuint shader)
1452{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001453 EVENT("(GLuint shader = %d)", shader);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001454
1455 try
1456 {
daniel@transgaming.com75401e62010-04-13 03:26:39 +00001457 if (shader == 0)
1458 {
1459 return;
1460 }
1461
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001462 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001463
1464 if (context)
1465 {
daniel@transgaming.com75401e62010-04-13 03:26:39 +00001466 if (!context->getShader(shader))
1467 {
1468 if(context->getProgram(shader))
1469 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001470 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com75401e62010-04-13 03:26:39 +00001471 }
1472 else
1473 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001474 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com75401e62010-04-13 03:26:39 +00001475 }
1476 }
1477
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001478 context->deleteShader(shader);
1479 }
1480 }
1481 catch(std::bad_alloc&)
1482 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001483 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001484 }
1485}
1486
1487void __stdcall glDeleteTextures(GLsizei n, const GLuint* textures)
1488{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001489 EVENT("(GLsizei n = %d, const GLuint* textures = 0x%0.8p)", n, textures);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001490
1491 try
1492 {
1493 if (n < 0)
1494 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001495 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001496 }
1497
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001498 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001499
1500 if (context)
1501 {
1502 for (int i = 0; i < n; i++)
1503 {
1504 if (textures[i] != 0)
1505 {
1506 context->deleteTexture(textures[i]);
1507 }
1508 }
1509 }
1510 }
1511 catch(std::bad_alloc&)
1512 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001513 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001514 }
1515}
1516
1517void __stdcall glDepthFunc(GLenum func)
1518{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001519 EVENT("(GLenum func = 0x%X)", func);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001520
1521 try
1522 {
1523 switch (func)
1524 {
1525 case GL_NEVER:
1526 case GL_ALWAYS:
1527 case GL_LESS:
1528 case GL_LEQUAL:
1529 case GL_EQUAL:
1530 case GL_GREATER:
1531 case GL_GEQUAL:
1532 case GL_NOTEQUAL:
1533 break;
1534 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001535 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001536 }
1537
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001538 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001539
1540 if (context)
1541 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00001542 context->setDepthFunc(func);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001543 }
1544 }
1545 catch(std::bad_alloc&)
1546 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001547 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001548 }
1549}
1550
1551void __stdcall glDepthMask(GLboolean flag)
1552{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00001553 EVENT("(GLboolean flag = %u)", flag);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001554
1555 try
1556 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001557 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001558
1559 if (context)
1560 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00001561 context->setDepthMask(flag != GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001562 }
1563 }
1564 catch(std::bad_alloc&)
1565 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001566 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001567 }
1568}
1569
1570void __stdcall glDepthRangef(GLclampf zNear, GLclampf zFar)
1571{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001572 EVENT("(GLclampf zNear = %f, GLclampf zFar = %f)", zNear, zFar);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001573
1574 try
1575 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001576 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001577
1578 if (context)
1579 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00001580 context->setDepthRange(zNear, zFar);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001581 }
1582 }
1583 catch(std::bad_alloc&)
1584 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001585 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001586 }
1587}
1588
1589void __stdcall glDetachShader(GLuint program, GLuint shader)
1590{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001591 EVENT("(GLuint program = %d, GLuint shader = %d)", program, shader);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001592
1593 try
1594 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001595 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001596
1597 if (context)
1598 {
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00001599
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001600 gl::Program *programObject = context->getProgram(program);
1601 gl::Shader *shaderObject = context->getShader(shader);
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00001602
1603 if (!programObject)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001604 {
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00001605 gl::Shader *shaderByProgramHandle;
1606 shaderByProgramHandle = context->getShader(program);
1607 if (!shaderByProgramHandle)
1608 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001609 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00001610 }
1611 else
1612 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001613 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00001614 }
1615 }
1616
1617 if (!shaderObject)
1618 {
1619 gl::Program *programByShaderHandle = context->getProgram(shader);
1620 if (!programByShaderHandle)
1621 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001622 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00001623 }
1624 else
1625 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001626 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00001627 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001628 }
1629
1630 if (!programObject->detachShader(shaderObject))
1631 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001632 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001633 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001634 }
1635 }
1636 catch(std::bad_alloc&)
1637 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001638 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001639 }
1640}
1641
1642void __stdcall glDisable(GLenum cap)
1643{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001644 EVENT("(GLenum cap = 0x%X)", cap);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001645
1646 try
1647 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001648 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001649
1650 if (context)
1651 {
1652 switch (cap)
1653 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00001654 case GL_CULL_FACE: context->setCullFace(false); break;
1655 case GL_POLYGON_OFFSET_FILL: context->setPolygonOffsetFill(false); break;
1656 case GL_SAMPLE_ALPHA_TO_COVERAGE: context->setSampleAlphaToCoverage(false); break;
1657 case GL_SAMPLE_COVERAGE: context->setSampleCoverage(false); break;
1658 case GL_SCISSOR_TEST: context->setScissorTest(false); break;
1659 case GL_STENCIL_TEST: context->setStencilTest(false); break;
1660 case GL_DEPTH_TEST: context->setDepthTest(false); break;
1661 case GL_BLEND: context->setBlend(false); break;
1662 case GL_DITHER: context->setDither(false); break;
shannonwoods@chromium.orgabf14cc2013-05-30 00:20:58 +00001663
1664 case GL_PRIMITIVE_RESTART_FIXED_INDEX:
1665 case GL_RASTERIZER_DISCARD:
1666 if (context->getClientVersion() < 3)
1667 {
1668 return gl::error(GL_INVALID_ENUM);
1669 }
1670 UNIMPLEMENTED();
1671 break;
1672
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001673 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001674 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001675 }
1676 }
1677 }
1678 catch(std::bad_alloc&)
1679 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001680 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001681 }
1682}
1683
1684void __stdcall glDisableVertexAttribArray(GLuint index)
1685{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001686 EVENT("(GLuint index = %d)", index);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001687
1688 try
1689 {
1690 if (index >= gl::MAX_VERTEX_ATTRIBS)
1691 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001692 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001693 }
1694
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001695 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001696
1697 if (context)
1698 {
daniel@transgaming.com83921382011-01-08 05:46:00 +00001699 context->setEnableVertexAttribArray(index, false);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001700 }
1701 }
1702 catch(std::bad_alloc&)
1703 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001704 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001705 }
1706}
1707
1708void __stdcall glDrawArrays(GLenum mode, GLint first, GLsizei count)
1709{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001710 EVENT("(GLenum mode = 0x%X, GLint first = %d, GLsizei count = %d)", mode, first, count);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001711
1712 try
1713 {
1714 if (count < 0 || first < 0)
1715 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001716 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001717 }
1718
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001719 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001720
1721 if (context)
1722 {
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00001723 context->drawArrays(mode, first, count, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001724 }
1725 }
1726 catch(std::bad_alloc&)
1727 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001728 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001729 }
1730}
1731
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001732void __stdcall glDrawArraysInstancedANGLE(GLenum mode, GLint first, GLsizei count, GLsizei primcount)
1733{
1734 EVENT("(GLenum mode = 0x%X, GLint first = %d, GLsizei count = %d, GLsizei primcount = %d)", mode, first, count, primcount);
1735
1736 try
1737 {
1738 if (count < 0 || first < 0 || primcount < 0)
1739 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001740 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001741 }
1742
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00001743 if (primcount > 0)
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001744 {
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00001745 gl::Context *context = gl::getNonLostContext();
1746
1747 if (context)
1748 {
1749 context->drawArrays(mode, first, count, primcount);
1750 }
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001751 }
1752 }
1753 catch(std::bad_alloc&)
1754 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001755 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001756 }
1757}
1758
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00001759void __stdcall glDrawElements(GLenum mode, GLsizei count, GLenum type, const GLvoid* indices)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001760{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001761 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 +00001762 mode, count, type, indices);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001763
1764 try
1765 {
1766 if (count < 0)
1767 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001768 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001769 }
1770
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001771 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001772
1773 if (context)
1774 {
daniel@transgaming.com83921382011-01-08 05:46:00 +00001775 switch (type)
1776 {
1777 case GL_UNSIGNED_BYTE:
1778 case GL_UNSIGNED_SHORT:
1779 break;
1780 case GL_UNSIGNED_INT:
1781 if (!context->supports32bitIndices())
1782 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001783 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com83921382011-01-08 05:46:00 +00001784 }
1785 break;
1786 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001787 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com83921382011-01-08 05:46:00 +00001788 }
1789
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00001790 context->drawElements(mode, count, type, indices, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001791 }
1792 }
1793 catch(std::bad_alloc&)
1794 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001795 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001796 }
1797}
1798
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001799void __stdcall glDrawElementsInstancedANGLE(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLsizei primcount)
1800{
1801 EVENT("(GLenum mode = 0x%X, GLsizei count = %d, GLenum type = 0x%X, const GLvoid* indices = 0x%0.8p, GLsizei primcount = %d)",
1802 mode, count, type, indices, primcount);
1803
1804 try
1805 {
1806 if (count < 0 || primcount < 0)
1807 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001808 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001809 }
1810
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00001811 if (primcount > 0)
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001812 {
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00001813 gl::Context *context = gl::getNonLostContext();
1814
1815 if (context)
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001816 {
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00001817 switch (type)
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001818 {
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00001819 case GL_UNSIGNED_BYTE:
1820 case GL_UNSIGNED_SHORT:
1821 break;
1822 case GL_UNSIGNED_INT:
1823 if (!context->supports32bitIndices())
1824 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001825 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00001826 }
1827 break;
1828 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001829 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001830 }
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00001831
1832 context->drawElements(mode, count, type, indices, primcount);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001833 }
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001834 }
1835 }
1836 catch(std::bad_alloc&)
1837 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001838 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001839 }
1840}
1841
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001842void __stdcall glEnable(GLenum cap)
1843{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001844 EVENT("(GLenum cap = 0x%X)", cap);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001845
1846 try
1847 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001848 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001849
1850 if (context)
1851 {
1852 switch (cap)
1853 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00001854 case GL_CULL_FACE: context->setCullFace(true); break;
1855 case GL_POLYGON_OFFSET_FILL: context->setPolygonOffsetFill(true); break;
1856 case GL_SAMPLE_ALPHA_TO_COVERAGE: context->setSampleAlphaToCoverage(true); break;
1857 case GL_SAMPLE_COVERAGE: context->setSampleCoverage(true); break;
1858 case GL_SCISSOR_TEST: context->setScissorTest(true); break;
1859 case GL_STENCIL_TEST: context->setStencilTest(true); break;
1860 case GL_DEPTH_TEST: context->setDepthTest(true); break;
1861 case GL_BLEND: context->setBlend(true); break;
1862 case GL_DITHER: context->setDither(true); break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001863 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001864 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001865 }
1866 }
1867 }
1868 catch(std::bad_alloc&)
1869 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001870 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001871 }
1872}
1873
1874void __stdcall glEnableVertexAttribArray(GLuint index)
1875{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001876 EVENT("(GLuint index = %d)", index);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001877
1878 try
1879 {
1880 if (index >= gl::MAX_VERTEX_ATTRIBS)
1881 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001882 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001883 }
1884
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001885 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001886
1887 if (context)
1888 {
daniel@transgaming.com83921382011-01-08 05:46:00 +00001889 context->setEnableVertexAttribArray(index, true);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001890 }
1891 }
1892 catch(std::bad_alloc&)
1893 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001894 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001895 }
1896}
1897
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00001898void __stdcall glEndQueryEXT(GLenum target)
1899{
1900 EVENT("GLenum target = 0x%X)", target);
1901
1902 try
1903 {
1904 switch (target)
1905 {
1906 case GL_ANY_SAMPLES_PASSED_EXT:
1907 case GL_ANY_SAMPLES_PASSED_CONSERVATIVE_EXT:
1908 break;
1909 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001910 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00001911 }
1912
1913 gl::Context *context = gl::getNonLostContext();
1914
1915 if (context)
1916 {
1917 context->endQuery(target);
1918 }
1919 }
1920 catch(std::bad_alloc&)
1921 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001922 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00001923 }
1924}
1925
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001926void __stdcall glFinishFenceNV(GLuint fence)
1927{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001928 EVENT("(GLuint fence = %d)", fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001929
1930 try
1931 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001932 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001933
1934 if (context)
1935 {
Jamie Madill33dc8432013-07-26 11:55:05 -04001936 gl::FenceNV *fenceObject = context->getFenceNV(fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001937
1938 if (fenceObject == NULL)
1939 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001940 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001941 }
1942
Jamie Madillfb9a7402013-07-26 11:55:01 -04001943 if (fenceObject->isFence() != GL_TRUE)
1944 {
1945 return gl::error(GL_INVALID_OPERATION);
1946 }
1947
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001948 fenceObject->finishFence();
1949 }
1950 }
1951 catch(std::bad_alloc&)
1952 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001953 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001954 }
1955}
1956
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001957void __stdcall glFinish(void)
1958{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001959 EVENT("()");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001960
1961 try
1962 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001963 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001964
1965 if (context)
1966 {
daniel@transgaming.com0d86aa72011-10-26 02:35:10 +00001967 context->sync(true);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001968 }
1969 }
1970 catch(std::bad_alloc&)
1971 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001972 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001973 }
1974}
1975
1976void __stdcall glFlush(void)
1977{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001978 EVENT("()");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001979
1980 try
1981 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001982 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001983
1984 if (context)
1985 {
daniel@transgaming.com0d86aa72011-10-26 02:35:10 +00001986 context->sync(false);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001987 }
1988 }
1989 catch(std::bad_alloc&)
1990 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001991 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001992 }
1993}
1994
1995void __stdcall glFramebufferRenderbuffer(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer)
1996{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001997 EVENT("(GLenum target = 0x%X, GLenum attachment = 0x%X, GLenum renderbuffertarget = 0x%X, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001998 "GLuint renderbuffer = %d)", target, attachment, renderbuffertarget, renderbuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001999
2000 try
2001 {
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002002 if ((target != GL_FRAMEBUFFER && target != GL_DRAW_FRAMEBUFFER_ANGLE && target != GL_READ_FRAMEBUFFER_ANGLE)
daniel@transgaming.com2fa45512011-10-04 18:43:18 +00002003 || (renderbuffertarget != GL_RENDERBUFFER && renderbuffer != 0))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002004 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002005 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002006 }
2007
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002008 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002009
2010 if (context)
2011 {
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002012 gl::Framebuffer *framebuffer = NULL;
2013 GLuint framebufferHandle = 0;
2014 if (target == GL_READ_FRAMEBUFFER_ANGLE)
2015 {
2016 framebuffer = context->getReadFramebuffer();
2017 framebufferHandle = context->getReadFramebufferHandle();
2018 }
daniel@transgaming.com2fa45512011-10-04 18:43:18 +00002019 else
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002020 {
2021 framebuffer = context->getDrawFramebuffer();
2022 framebufferHandle = context->getDrawFramebufferHandle();
2023 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002024
daniel@transgaming.com2fa45512011-10-04 18:43:18 +00002025 if (!framebuffer || (framebufferHandle == 0 && renderbuffer != 0))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002026 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002027 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002028 }
2029
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002030 if (attachment >= GL_COLOR_ATTACHMENT0_EXT && attachment <= GL_COLOR_ATTACHMENT15_EXT)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002031 {
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002032 const unsigned int colorAttachment = (attachment - GL_COLOR_ATTACHMENT0_EXT);
2033
2034 if (colorAttachment >= context->getMaximumRenderTargets())
2035 {
2036 return gl::error(GL_INVALID_VALUE);
2037 }
2038
Geoff Lang309c92a2013-07-25 16:23:19 -04002039 framebuffer->setColorbuffer(colorAttachment, GL_RENDERBUFFER, renderbuffer, 0, 0);
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002040 }
2041 else
2042 {
2043 switch (attachment)
2044 {
2045 case GL_DEPTH_ATTACHMENT:
Geoff Lang309c92a2013-07-25 16:23:19 -04002046 framebuffer->setDepthbuffer(GL_RENDERBUFFER, renderbuffer, 0, 0);
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002047 break;
2048 case GL_STENCIL_ATTACHMENT:
Geoff Lang309c92a2013-07-25 16:23:19 -04002049 framebuffer->setStencilbuffer(GL_RENDERBUFFER, renderbuffer, 0, 0);
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002050 break;
Geoff Lang7e9ee232013-08-05 10:18:42 -04002051 case GL_DEPTH_STENCIL_ATTACHMENT:
2052 if (context->getClientVersion() < 3)
2053 {
2054 return gl::error(GL_INVALID_ENUM);
2055 }
2056 framebuffer->setDepthStencilBuffer(GL_RENDERBUFFER, renderbuffer, 0, 0);
2057 break;
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002058 default:
2059 return gl::error(GL_INVALID_ENUM);
2060 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002061 }
2062 }
2063 }
2064 catch(std::bad_alloc&)
2065 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002066 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002067 }
2068}
2069
2070void __stdcall glFramebufferTexture2D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level)
2071{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002072 EVENT("(GLenum target = 0x%X, GLenum attachment = 0x%X, GLenum textarget = 0x%X, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00002073 "GLuint texture = %d, GLint level = %d)", target, attachment, textarget, texture, level);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002074
2075 try
2076 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002077 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002078 if (context)
2079 {
Geoff Lang3ed0c482013-07-25 17:03:18 -04002080 if (context->getClientVersion() < 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -04002081 !ValidateES2FramebufferTextureParameters(context, target, attachment, textarget, texture, level))
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002082 {
Geoff Lang3ed0c482013-07-25 17:03:18 -04002083 return;
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002084 }
Geoff Lang3ed0c482013-07-25 17:03:18 -04002085
2086 if (context->getClientVersion() >= 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -04002087 !ValidateES3FramebufferTextureParameters(context, target, attachment, textarget, texture, level, 0, false))
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002088 {
Geoff Lang3ed0c482013-07-25 17:03:18 -04002089 return;
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002090 }
2091
daniel@transgaming.com93a81472010-04-20 18:52:58 +00002092 if (texture == 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002093 {
daniel@transgaming.com93a81472010-04-20 18:52:58 +00002094 textarget = GL_NONE;
2095 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002096
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002097 gl::Framebuffer *framebuffer = NULL;
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002098 if (target == GL_READ_FRAMEBUFFER_ANGLE)
2099 {
2100 framebuffer = context->getReadFramebuffer();
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002101 }
2102 else
2103 {
2104 framebuffer = context->getDrawFramebuffer();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002105 }
2106
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002107 if (attachment >= GL_COLOR_ATTACHMENT0_EXT && attachment <= GL_COLOR_ATTACHMENT15_EXT)
daniel@transgaming.comfbc09532010-04-26 15:33:41 +00002108 {
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002109 const unsigned int colorAttachment = (attachment - GL_COLOR_ATTACHMENT0_EXT);
Geoff Lang309c92a2013-07-25 16:23:19 -04002110 framebuffer->setColorbuffer(colorAttachment, textarget, texture, level, 0);
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002111 }
2112 else
2113 {
2114 switch (attachment)
2115 {
Geoff Lang309c92a2013-07-25 16:23:19 -04002116 case GL_DEPTH_ATTACHMENT: framebuffer->setDepthbuffer(textarget, texture, level, 0); break;
2117 case GL_STENCIL_ATTACHMENT: framebuffer->setStencilbuffer(textarget, texture, level, 0); break;
2118 case GL_DEPTH_STENCIL_ATTACHMENT: framebuffer->setDepthStencilBuffer(textarget, texture, level, 0); break;
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002119 }
daniel@transgaming.comfbc09532010-04-26 15:33:41 +00002120 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002121 }
2122 }
2123 catch(std::bad_alloc&)
2124 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002125 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002126 }
2127}
2128
2129void __stdcall glFrontFace(GLenum mode)
2130{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002131 EVENT("(GLenum mode = 0x%X)", mode);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002132
2133 try
2134 {
2135 switch (mode)
2136 {
2137 case GL_CW:
2138 case GL_CCW:
2139 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002140 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002141
2142 if (context)
2143 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00002144 context->setFrontFace(mode);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002145 }
2146 }
2147 break;
2148 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002149 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002150 }
2151 }
2152 catch(std::bad_alloc&)
2153 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002154 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002155 }
2156}
2157
2158void __stdcall glGenBuffers(GLsizei n, GLuint* buffers)
2159{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002160 EVENT("(GLsizei n = %d, GLuint* buffers = 0x%0.8p)", n, buffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002161
2162 try
2163 {
2164 if (n < 0)
2165 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002166 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002167 }
2168
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002169 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002170
2171 if (context)
2172 {
2173 for (int i = 0; i < n; i++)
2174 {
2175 buffers[i] = context->createBuffer();
2176 }
2177 }
2178 }
2179 catch(std::bad_alloc&)
2180 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002181 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002182 }
2183}
2184
2185void __stdcall glGenerateMipmap(GLenum target)
2186{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002187 EVENT("(GLenum target = 0x%X)", target);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002188
2189 try
2190 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002191 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com8fd99e22010-04-20 18:52:00 +00002192
2193 if (context)
2194 {
Geoff Langae4852a2013-06-05 15:00:34 -04002195 gl::Texture *texture = NULL;
2196 GLint internalFormat = GL_NONE;
2197 bool isCompressed = false;
2198 bool isDepth = false;
2199
daniel@transgaming.com8fd99e22010-04-20 18:52:00 +00002200 switch (target)
2201 {
2202 case GL_TEXTURE_2D:
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00002203 {
2204 gl::Texture2D *tex2d = context->getTexture2D();
Geoff Langae4852a2013-06-05 15:00:34 -04002205 if (tex2d)
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00002206 {
Geoff Langae4852a2013-06-05 15:00:34 -04002207 internalFormat = tex2d->getInternalFormat(0);
2208 isCompressed = tex2d->isCompressed(0);
2209 isDepth = tex2d->isDepth(0);
2210 texture = tex2d;
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00002211 }
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00002212 break;
2213 }
daniel@transgaming.com8fd99e22010-04-20 18:52:00 +00002214
2215 case GL_TEXTURE_CUBE_MAP:
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00002216 {
2217 gl::TextureCubeMap *texcube = context->getTextureCubeMap();
Geoff Langae4852a2013-06-05 15:00:34 -04002218 if (texcube)
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00002219 {
Geoff Langae4852a2013-06-05 15:00:34 -04002220 internalFormat = texcube->getInternalFormat(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0);
2221 isCompressed = texcube->isCompressed(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0);
2222 isDepth = false;
2223 texture = texcube;
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00002224 }
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00002225 break;
2226 }
daniel@transgaming.com8fd99e22010-04-20 18:52:00 +00002227
shannon.woods%transgaming.com@gtempaccount.com86740a92013-04-13 03:45:24 +00002228 case GL_TEXTURE_3D:
2229 {
2230 if (context->getClientVersion() < 3)
2231 {
2232 return gl::error(GL_INVALID_ENUM);
2233 }
2234
2235 gl::Texture3D *tex3D = context->getTexture3D();
Geoff Langae4852a2013-06-05 15:00:34 -04002236 if (tex3D)
shannon.woods%transgaming.com@gtempaccount.com86740a92013-04-13 03:45:24 +00002237 {
Geoff Langae4852a2013-06-05 15:00:34 -04002238 internalFormat = tex3D->getInternalFormat(0);
2239 isCompressed = tex3D->isCompressed(0);
2240 isDepth = tex3D->isDepth(0);
2241 texture = tex3D;
shannon.woods%transgaming.com@gtempaccount.com86740a92013-04-13 03:45:24 +00002242 }
shannon.woods%transgaming.com@gtempaccount.com86740a92013-04-13 03:45:24 +00002243 break;
2244 }
2245
shannonwoods@chromium.org30aa1a92013-05-30 00:03:13 +00002246 case GL_TEXTURE_2D_ARRAY:
2247 {
2248 if (context->getClientVersion() < 3)
2249 {
2250 return gl::error(GL_INVALID_ENUM);
2251 }
2252
2253 gl::Texture2DArray *tex2darr = context->getTexture2DArray();
Geoff Langae4852a2013-06-05 15:00:34 -04002254 if (tex2darr)
shannonwoods@chromium.org30aa1a92013-05-30 00:03:13 +00002255 {
Geoff Langae4852a2013-06-05 15:00:34 -04002256 internalFormat = tex2darr->getInternalFormat(0);
2257 isCompressed = tex2darr->isCompressed(0);
2258 isDepth = tex2darr->isDepth(0);
2259 texture = tex2darr;
shannonwoods@chromium.org30aa1a92013-05-30 00:03:13 +00002260 }
shannonwoods@chromium.org30aa1a92013-05-30 00:03:13 +00002261 break;
2262 }
2263
daniel@transgaming.com8fd99e22010-04-20 18:52:00 +00002264 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002265 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com8fd99e22010-04-20 18:52:00 +00002266 }
Geoff Langae4852a2013-06-05 15:00:34 -04002267
2268 if (!texture)
2269 {
2270 return gl::error(GL_INVALID_OPERATION);
2271 }
2272
2273 // Internally, all texture formats are sized so checking if the format
2274 // is color renderable and filterable will not fail.
2275 if (isDepth || isCompressed ||
2276 !gl::IsColorRenderingSupported(internalFormat, context) ||
2277 !gl::IsTextureFilteringSupported(internalFormat, context))
2278 {
2279 return gl::error(GL_INVALID_OPERATION);
2280 }
2281
2282 texture->generateMipmaps();
daniel@transgaming.com8fd99e22010-04-20 18:52:00 +00002283 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002284 }
2285 catch(std::bad_alloc&)
2286 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002287 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002288 }
2289}
2290
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002291void __stdcall glGenFencesNV(GLsizei n, GLuint* fences)
2292{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002293 EVENT("(GLsizei n = %d, GLuint* fences = 0x%0.8p)", n, fences);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002294
2295 try
2296 {
2297 if (n < 0)
2298 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002299 return gl::error(GL_INVALID_VALUE);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002300 }
2301
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002302 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002303
2304 if (context)
2305 {
2306 for (int i = 0; i < n; i++)
2307 {
Jamie Madill33dc8432013-07-26 11:55:05 -04002308 fences[i] = context->createFenceNV();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002309 }
2310 }
2311 }
2312 catch(std::bad_alloc&)
2313 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002314 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002315 }
2316}
2317
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002318void __stdcall glGenFramebuffers(GLsizei n, GLuint* framebuffers)
2319{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002320 EVENT("(GLsizei n = %d, GLuint* framebuffers = 0x%0.8p)", n, framebuffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002321
2322 try
2323 {
2324 if (n < 0)
2325 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002326 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002327 }
2328
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002329 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002330
2331 if (context)
2332 {
2333 for (int i = 0; i < n; i++)
2334 {
2335 framebuffers[i] = context->createFramebuffer();
2336 }
2337 }
2338 }
2339 catch(std::bad_alloc&)
2340 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002341 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002342 }
2343}
2344
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00002345void __stdcall glGenQueriesEXT(GLsizei n, GLuint* ids)
2346{
2347 EVENT("(GLsizei n = %d, GLuint* ids = 0x%0.8p)", n, ids);
2348
2349 try
2350 {
2351 if (n < 0)
2352 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002353 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00002354 }
2355
2356 gl::Context *context = gl::getNonLostContext();
2357
2358 if (context)
2359 {
2360 for (int i = 0; i < n; i++)
2361 {
2362 ids[i] = context->createQuery();
2363 }
2364 }
2365 }
2366 catch(std::bad_alloc&)
2367 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002368 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00002369 }
2370}
2371
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002372void __stdcall glGenRenderbuffers(GLsizei n, GLuint* renderbuffers)
2373{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002374 EVENT("(GLsizei n = %d, GLuint* renderbuffers = 0x%0.8p)", n, renderbuffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002375
2376 try
2377 {
2378 if (n < 0)
2379 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002380 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002381 }
2382
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002383 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002384
2385 if (context)
2386 {
2387 for (int i = 0; i < n; i++)
2388 {
2389 renderbuffers[i] = context->createRenderbuffer();
2390 }
2391 }
2392 }
2393 catch(std::bad_alloc&)
2394 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002395 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002396 }
2397}
2398
2399void __stdcall glGenTextures(GLsizei n, GLuint* textures)
2400{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002401 EVENT("(GLsizei n = %d, GLuint* textures = 0x%0.8p)", n, textures);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002402
2403 try
2404 {
2405 if (n < 0)
2406 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002407 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002408 }
2409
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002410 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002411
2412 if (context)
2413 {
2414 for (int i = 0; i < n; i++)
2415 {
2416 textures[i] = context->createTexture();
2417 }
2418 }
2419 }
2420 catch(std::bad_alloc&)
2421 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002422 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002423 }
2424}
2425
daniel@transgaming.com85423182010-04-22 13:35:27 +00002426void __stdcall glGetActiveAttrib(GLuint program, GLuint index, GLsizei bufsize, GLsizei *length, GLint *size, GLenum *type, GLchar *name)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002427{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002428 EVENT("(GLuint program = %d, GLuint index = %d, GLsizei bufsize = %d, GLsizei *length = 0x%0.8p, "
daniel@transgaming.com85423182010-04-22 13:35:27 +00002429 "GLint *size = 0x%0.8p, GLenum *type = %0.8p, GLchar *name = %0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002430 program, index, bufsize, length, size, type, name);
2431
2432 try
2433 {
2434 if (bufsize < 0)
2435 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002436 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002437 }
2438
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002439 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com85423182010-04-22 13:35:27 +00002440
2441 if (context)
2442 {
2443 gl::Program *programObject = context->getProgram(program);
2444
2445 if (!programObject)
2446 {
2447 if (context->getShader(program))
2448 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002449 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com85423182010-04-22 13:35:27 +00002450 }
2451 else
2452 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002453 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com85423182010-04-22 13:35:27 +00002454 }
2455 }
2456
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00002457 if (index >= (GLuint)programObject->getActiveAttributeCount())
daniel@transgaming.com85423182010-04-22 13:35:27 +00002458 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002459 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com85423182010-04-22 13:35:27 +00002460 }
2461
2462 programObject->getActiveAttribute(index, bufsize, length, size, type, name);
2463 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002464 }
2465 catch(std::bad_alloc&)
2466 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002467 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002468 }
2469}
2470
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00002471void __stdcall glGetActiveUniform(GLuint program, GLuint index, GLsizei bufsize, GLsizei* length, GLint* size, GLenum* type, GLchar* name)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002472{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002473 EVENT("(GLuint program = %d, GLuint index = %d, GLsizei bufsize = %d, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00002474 "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 +00002475 program, index, bufsize, length, size, type, name);
2476
2477 try
2478 {
2479 if (bufsize < 0)
2480 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002481 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002482 }
2483
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002484 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00002485
2486 if (context)
2487 {
2488 gl::Program *programObject = context->getProgram(program);
2489
2490 if (!programObject)
2491 {
2492 if (context->getShader(program))
2493 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002494 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00002495 }
2496 else
2497 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002498 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00002499 }
2500 }
2501
2502 if (index >= (GLuint)programObject->getActiveUniformCount())
2503 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002504 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00002505 }
2506
2507 programObject->getActiveUniform(index, bufsize, length, size, type, name);
2508 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002509 }
2510 catch(std::bad_alloc&)
2511 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002512 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002513 }
2514}
2515
2516void __stdcall glGetAttachedShaders(GLuint program, GLsizei maxcount, GLsizei* count, GLuint* shaders)
2517{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002518 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 +00002519 program, maxcount, count, shaders);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002520
2521 try
2522 {
2523 if (maxcount < 0)
2524 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002525 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002526 }
2527
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002528 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com6c785212010-03-30 03:36:17 +00002529
2530 if (context)
2531 {
2532 gl::Program *programObject = context->getProgram(program);
2533
2534 if (!programObject)
2535 {
daniel@transgaming.com23953e32010-04-13 19:53:31 +00002536 if (context->getShader(program))
2537 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002538 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com23953e32010-04-13 19:53:31 +00002539 }
2540 else
2541 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002542 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com23953e32010-04-13 19:53:31 +00002543 }
daniel@transgaming.com6c785212010-03-30 03:36:17 +00002544 }
2545
2546 return programObject->getAttachedShaders(maxcount, count, shaders);
2547 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002548 }
2549 catch(std::bad_alloc&)
2550 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002551 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002552 }
2553}
2554
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00002555int __stdcall glGetAttribLocation(GLuint program, const GLchar* name)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002556{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002557 EVENT("(GLuint program = %d, const GLchar* name = %s)", program, name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002558
2559 try
2560 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002561 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002562
2563 if (context)
2564 {
daniel@transgaming.combb274c32010-04-13 03:26:21 +00002565
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002566 gl::Program *programObject = context->getProgram(program);
2567
2568 if (!programObject)
2569 {
daniel@transgaming.combb274c32010-04-13 03:26:21 +00002570 if (context->getShader(program))
2571 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002572 return gl::error(GL_INVALID_OPERATION, -1);
daniel@transgaming.combb274c32010-04-13 03:26:21 +00002573 }
2574 else
2575 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002576 return gl::error(GL_INVALID_VALUE, -1);
daniel@transgaming.combb274c32010-04-13 03:26:21 +00002577 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002578 }
2579
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00002580 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
daniel@transgaming.com716056c2012-07-24 18:38:59 +00002581 if (!programObject->isLinked() || !programBinary)
daniel@transgaming.comcf4aa872010-04-13 03:26:27 +00002582 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002583 return gl::error(GL_INVALID_OPERATION, -1);
daniel@transgaming.comcf4aa872010-04-13 03:26:27 +00002584 }
2585
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00002586 return programBinary->getAttributeLocation(name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002587 }
2588 }
2589 catch(std::bad_alloc&)
2590 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002591 return gl::error(GL_OUT_OF_MEMORY, -1);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002592 }
2593
2594 return -1;
2595}
2596
2597void __stdcall glGetBooleanv(GLenum pname, GLboolean* params)
2598{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002599 EVENT("(GLenum pname = 0x%X, GLboolean* params = 0x%0.8p)", pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002600
2601 try
2602 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002603 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com777f2672010-04-07 03:25:16 +00002604
2605 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002606 {
daniel@transgaming.com777f2672010-04-07 03:25:16 +00002607 if (!(context->getBooleanv(pname, params)))
2608 {
2609 GLenum nativeType;
2610 unsigned int numParams = 0;
2611 if (!context->getQueryParameterInfo(pname, &nativeType, &numParams))
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002612 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com777f2672010-04-07 03:25:16 +00002613
2614 if (numParams == 0)
2615 return; // it is known that the pname is valid, but there are no parameters to return
2616
2617 if (nativeType == GL_FLOAT)
2618 {
2619 GLfloat *floatParams = NULL;
2620 floatParams = new GLfloat[numParams];
2621
2622 context->getFloatv(pname, floatParams);
2623
2624 for (unsigned int i = 0; i < numParams; ++i)
2625 {
2626 if (floatParams[i] == 0.0f)
2627 params[i] = GL_FALSE;
2628 else
2629 params[i] = GL_TRUE;
2630 }
2631
2632 delete [] floatParams;
2633 }
2634 else if (nativeType == GL_INT)
2635 {
2636 GLint *intParams = NULL;
2637 intParams = new GLint[numParams];
2638
2639 context->getIntegerv(pname, intParams);
2640
2641 for (unsigned int i = 0; i < numParams; ++i)
2642 {
2643 if (intParams[i] == 0)
2644 params[i] = GL_FALSE;
2645 else
2646 params[i] = GL_TRUE;
2647 }
2648
2649 delete [] intParams;
2650 }
Jamie Madill71fbd602013-07-19 16:36:55 -04002651 else if (nativeType == GL_INT_64_ANGLEX)
2652 {
2653 GLint64 *int64Params = NULL;
2654 int64Params = new GLint64[numParams];
2655
2656 context->getInteger64v(pname, int64Params);
2657
2658 for (unsigned int i = 0; i < numParams; ++i)
2659 {
2660 if (int64Params[i] == 0)
2661 params[i] = GL_FALSE;
2662 else
2663 params[i] = GL_TRUE;
2664 }
2665
2666 delete [] int64Params;
2667 }
daniel@transgaming.com777f2672010-04-07 03:25:16 +00002668 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002669 }
2670 }
2671 catch(std::bad_alloc&)
2672 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002673 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002674 }
2675}
2676
2677void __stdcall glGetBufferParameteriv(GLenum target, GLenum pname, GLint* params)
2678{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002679 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 +00002680
2681 try
2682 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002683 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comaa0ccbd2010-04-15 20:45:05 +00002684
2685 if (context)
2686 {
2687 gl::Buffer *buffer;
2688
2689 switch (target)
2690 {
2691 case GL_ARRAY_BUFFER:
2692 buffer = context->getArrayBuffer();
2693 break;
2694 case GL_ELEMENT_ARRAY_BUFFER:
2695 buffer = context->getElementArrayBuffer();
2696 break;
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002697 default: return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comaa0ccbd2010-04-15 20:45:05 +00002698 }
2699
2700 if (!buffer)
2701 {
2702 // A null buffer means that "0" is bound to the requested buffer target
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002703 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comaa0ccbd2010-04-15 20:45:05 +00002704 }
2705
2706 switch (pname)
2707 {
2708 case GL_BUFFER_USAGE:
2709 *params = buffer->usage();
2710 break;
2711 case GL_BUFFER_SIZE:
2712 *params = buffer->size();
2713 break;
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002714 default: return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comaa0ccbd2010-04-15 20:45:05 +00002715 }
2716 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002717 }
2718 catch(std::bad_alloc&)
2719 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002720 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002721 }
2722}
2723
2724GLenum __stdcall glGetError(void)
2725{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002726 EVENT("()");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002727
2728 gl::Context *context = gl::getContext();
2729
2730 if (context)
2731 {
daniel@transgaming.com82b28912011-12-12 21:01:35 +00002732 return context->getError();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002733 }
2734
2735 return GL_NO_ERROR;
2736}
2737
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002738void __stdcall glGetFenceivNV(GLuint fence, GLenum pname, GLint *params)
2739{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002740 EVENT("(GLuint fence = %d, GLenum pname = 0x%X, GLint *params = 0x%0.8p)", fence, pname, params);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002741
2742 try
2743 {
2744
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002745 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002746
2747 if (context)
2748 {
Jamie Madill33dc8432013-07-26 11:55:05 -04002749 gl::FenceNV *fenceObject = context->getFenceNV(fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002750
2751 if (fenceObject == NULL)
2752 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002753 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002754 }
2755
Jamie Madillfb9a7402013-07-26 11:55:01 -04002756 if (fenceObject->isFence() != GL_TRUE)
2757 {
2758 return gl::error(GL_INVALID_OPERATION);
2759 }
2760
2761 switch (pname)
2762 {
2763 case GL_FENCE_STATUS_NV:
2764 case GL_FENCE_CONDITION_NV:
2765 break;
2766
2767 default: return gl::error(GL_INVALID_ENUM);
2768 }
2769
2770 params[0] = fenceObject->getFencei(pname);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002771 }
2772 }
2773 catch(std::bad_alloc&)
2774 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002775 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002776 }
2777}
2778
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002779void __stdcall glGetFloatv(GLenum pname, GLfloat* params)
2780{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002781 EVENT("(GLenum pname = 0x%X, GLfloat* params = 0x%0.8p)", pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002782
2783 try
2784 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002785 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com32e58cd2010-03-24 09:44:10 +00002786
2787 if (context)
2788 {
daniel@transgaming.com777f2672010-04-07 03:25:16 +00002789 if (!(context->getFloatv(pname, params)))
daniel@transgaming.com32e58cd2010-03-24 09:44:10 +00002790 {
daniel@transgaming.com777f2672010-04-07 03:25:16 +00002791 GLenum nativeType;
2792 unsigned int numParams = 0;
2793 if (!context->getQueryParameterInfo(pname, &nativeType, &numParams))
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002794 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com777f2672010-04-07 03:25:16 +00002795
2796 if (numParams == 0)
2797 return; // it is known that the pname is valid, but that there are no parameters to return.
2798
2799 if (nativeType == GL_BOOL)
2800 {
2801 GLboolean *boolParams = NULL;
2802 boolParams = new GLboolean[numParams];
2803
2804 context->getBooleanv(pname, boolParams);
2805
2806 for (unsigned int i = 0; i < numParams; ++i)
2807 {
2808 if (boolParams[i] == GL_FALSE)
2809 params[i] = 0.0f;
2810 else
2811 params[i] = 1.0f;
2812 }
2813
2814 delete [] boolParams;
2815 }
2816 else if (nativeType == GL_INT)
2817 {
2818 GLint *intParams = NULL;
2819 intParams = new GLint[numParams];
2820
2821 context->getIntegerv(pname, intParams);
2822
2823 for (unsigned int i = 0; i < numParams; ++i)
2824 {
Jamie Madill71fbd602013-07-19 16:36:55 -04002825 params[i] = static_cast<GLfloat>(intParams[i]);
daniel@transgaming.com777f2672010-04-07 03:25:16 +00002826 }
2827
2828 delete [] intParams;
2829 }
Jamie Madill71fbd602013-07-19 16:36:55 -04002830 else if (nativeType == GL_INT_64_ANGLEX)
2831 {
2832 GLint64 *int64Params = NULL;
2833 int64Params = new GLint64[numParams];
2834
2835 context->getInteger64v(pname, int64Params);
2836
2837 for (unsigned int i = 0; i < numParams; ++i)
2838 {
2839 params[i] = static_cast<GLfloat>(int64Params[i]);
2840 }
2841
2842 delete [] int64Params;
2843 }
daniel@transgaming.com32e58cd2010-03-24 09:44:10 +00002844 }
2845 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002846 }
2847 catch(std::bad_alloc&)
2848 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002849 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002850 }
2851}
2852
2853void __stdcall glGetFramebufferAttachmentParameteriv(GLenum target, GLenum attachment, GLenum pname, GLint* params)
2854{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002855 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 +00002856 target, attachment, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002857
2858 try
2859 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002860 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002861
2862 if (context)
2863 {
Geoff Lang646559f2013-08-15 11:08:15 -04002864 META_ASSERT(GL_DRAW_FRAMEBUFFER_ANGLE == GL_DRAW_FRAMEBUFFER && GL_READ_FRAMEBUFFER_ANGLE == GL_READ_FRAMEBUFFER);
2865 if (target != GL_FRAMEBUFFER && target != GL_DRAW_FRAMEBUFFER && target != GL_READ_FRAMEBUFFER)
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002866 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002867 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002868 }
2869
Geoff Lang646559f2013-08-15 11:08:15 -04002870 switch (pname)
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002871 {
Geoff Lang646559f2013-08-15 11:08:15 -04002872 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE:
2873 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME:
2874 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL:
2875 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE:
2876 break;
2877 case GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE:
2878 case GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE:
2879 case GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE:
2880 case GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE:
2881 case GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE:
2882 case GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE:
2883 case GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE:
2884 case GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING:
2885 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER:
2886 if (context->getClientVersion() >= 3)
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002887 {
Geoff Lang646559f2013-08-15 11:08:15 -04002888 break;
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002889 }
Geoff Lang646559f2013-08-15 11:08:15 -04002890 default:
2891 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002892 }
Geoff Lang646559f2013-08-15 11:08:15 -04002893
2894 // Determine if the attachment is a valid enum
2895 switch (attachment)
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002896 {
Geoff Lang646559f2013-08-15 11:08:15 -04002897 case GL_BACK:
2898 case GL_FRONT:
2899 case GL_STENCIL:
2900 case GL_DEPTH_STENCIL_ATTACHMENT:
2901 if (context->getClientVersion() < 3)
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002902 {
Geoff Lang646559f2013-08-15 11:08:15 -04002903 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002904 }
Geoff Lang646559f2013-08-15 11:08:15 -04002905 break;
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002906
Geoff Lang646559f2013-08-15 11:08:15 -04002907 case GL_DEPTH_ATTACHMENT:
2908 case GL_STENCIL_ATTACHMENT:
2909 break;
2910
2911 default:
2912 if (attachment < GL_COLOR_ATTACHMENT0_EXT ||
2913 (attachment - GL_COLOR_ATTACHMENT0_EXT) >= context->getMaximumRenderTargets())
2914 {
2915 return gl::error(GL_INVALID_ENUM);
2916 }
2917 break;
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002918 }
2919
Geoff Lang646559f2013-08-15 11:08:15 -04002920 GLuint framebufferHandle = (target == GL_READ_FRAMEBUFFER) ? context->getReadFramebufferHandle()
2921 : context->getDrawFramebufferHandle();
2922
2923 gl::Framebuffer *framebuffer = context->getFramebuffer(framebufferHandle);
2924
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002925 GLenum attachmentType;
2926 GLuint attachmentHandle;
Geoff Lang309c92a2013-07-25 16:23:19 -04002927 GLuint attachmentLevel;
2928 GLuint attachmentLayer;
Geoff Lang646559f2013-08-15 11:08:15 -04002929 gl::Renderbuffer *renderbuffer;
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002930
Geoff Lang646559f2013-08-15 11:08:15 -04002931 if(framebufferHandle == 0)
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002932 {
Geoff Lang646559f2013-08-15 11:08:15 -04002933 if(context->getClientVersion() < 3)
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002934 {
Geoff Lang646559f2013-08-15 11:08:15 -04002935 return gl::error(GL_INVALID_OPERATION);
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002936 }
2937
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002938 switch (attachment)
2939 {
Geoff Lang646559f2013-08-15 11:08:15 -04002940 case GL_BACK:
2941 attachmentType = framebuffer->getColorbufferType(0);
2942 attachmentHandle = framebuffer->getColorbufferHandle(0);
2943 attachmentLevel = framebuffer->getColorbufferMipLevel(0);
2944 attachmentLayer = framebuffer->getColorbufferLayer(0);
2945 renderbuffer = framebuffer->getColorbuffer(0);
2946 break;
2947 case GL_DEPTH:
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002948 attachmentType = framebuffer->getDepthbufferType();
2949 attachmentHandle = framebuffer->getDepthbufferHandle();
Geoff Lang309c92a2013-07-25 16:23:19 -04002950 attachmentLevel = framebuffer->getDepthbufferMipLevel();
2951 attachmentLayer = framebuffer->getDepthbufferLayer();
Geoff Lang646559f2013-08-15 11:08:15 -04002952 renderbuffer = framebuffer->getDepthbuffer();
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002953 break;
Geoff Lang646559f2013-08-15 11:08:15 -04002954 case GL_STENCIL:
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002955 attachmentType = framebuffer->getStencilbufferType();
2956 attachmentHandle = framebuffer->getStencilbufferHandle();
Geoff Lang309c92a2013-07-25 16:23:19 -04002957 attachmentLevel = framebuffer->getStencilbufferMipLevel();
2958 attachmentLayer = framebuffer->getStencilbufferLayer();
Geoff Lang646559f2013-08-15 11:08:15 -04002959 renderbuffer = framebuffer->getStencilbuffer();
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002960 break;
Geoff Lang646559f2013-08-15 11:08:15 -04002961 default:
2962 return gl::error(GL_INVALID_OPERATION);
2963 }
2964 }
2965 else
2966 {
2967 if (attachment >= GL_COLOR_ATTACHMENT0_EXT && attachment <= GL_COLOR_ATTACHMENT15_EXT)
2968 {
2969 const unsigned int colorAttachment = (attachment - GL_COLOR_ATTACHMENT0_EXT);
2970 attachmentType = framebuffer->getColorbufferType(colorAttachment);
2971 attachmentHandle = framebuffer->getColorbufferHandle(colorAttachment);
2972 attachmentLevel = framebuffer->getColorbufferMipLevel(colorAttachment);
2973 attachmentLayer = framebuffer->getColorbufferLayer(colorAttachment);
2974 renderbuffer = framebuffer->getColorbuffer(colorAttachment);
2975 }
2976 else
2977 {
2978 switch (attachment)
Geoff Lang55ba29c2013-07-11 16:57:53 -04002979 {
Geoff Lang646559f2013-08-15 11:08:15 -04002980 case GL_DEPTH_ATTACHMENT:
2981 attachmentType = framebuffer->getDepthbufferType();
2982 attachmentHandle = framebuffer->getDepthbufferHandle();
2983 attachmentLevel = framebuffer->getDepthbufferMipLevel();
2984 attachmentLayer = framebuffer->getDepthbufferLayer();
2985 renderbuffer = framebuffer->getDepthbuffer();
2986 break;
2987 case GL_STENCIL_ATTACHMENT:
2988 attachmentType = framebuffer->getStencilbufferType();
2989 attachmentHandle = framebuffer->getStencilbufferHandle();
2990 attachmentLevel = framebuffer->getStencilbufferMipLevel();
2991 attachmentLayer = framebuffer->getStencilbufferLayer();
2992 renderbuffer = framebuffer->getStencilbuffer();
2993 break;
2994 case GL_DEPTH_STENCIL_ATTACHMENT:
2995 if (framebuffer->getDepthbufferHandle() != framebuffer->getStencilbufferHandle())
2996 {
2997 return gl::error(GL_INVALID_OPERATION);
2998 }
2999 attachmentType = framebuffer->getDepthStencilbufferType();
3000 attachmentHandle = framebuffer->getDepthStencilbufferHandle();
3001 attachmentLevel = framebuffer->getDepthStencilbufferMipLevel();
3002 attachmentLayer = framebuffer->getDepthStencilbufferLayer();
3003 renderbuffer = framebuffer->getDepthStencilBuffer();
3004 break;
3005 default:
Geoff Lang55ba29c2013-07-11 16:57:53 -04003006 return gl::error(GL_INVALID_OPERATION);
3007 }
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00003008 }
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003009 }
3010
3011 GLenum attachmentObjectType; // Type category
Geoff Lang646559f2013-08-15 11:08:15 -04003012 if (framebufferHandle == 0)
3013 {
3014 attachmentObjectType = GL_FRAMEBUFFER_DEFAULT;
3015 }
3016 else if (attachmentType == GL_NONE || attachmentType == GL_RENDERBUFFER)
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003017 {
3018 attachmentObjectType = attachmentType;
3019 }
Geoff Lang0fe19492013-07-25 17:04:31 -04003020 else if (gl::IsInternalTextureTarget(attachmentType, context->getClientVersion()))
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003021 {
3022 attachmentObjectType = GL_TEXTURE;
3023 }
apatrick@chromium.orga1d80592012-01-25 21:52:10 +00003024 else
3025 {
3026 UNREACHABLE();
3027 return;
3028 }
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003029
Geoff Lang646559f2013-08-15 11:08:15 -04003030 if (attachmentObjectType == GL_NONE)
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003031 {
Geoff Lang646559f2013-08-15 11:08:15 -04003032 // ES 2.0.25 spec pg 127 states that if the value of FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE
3033 // is NONE, then querying any other pname will generate INVALID_ENUM.
3034
3035 // ES 3.0.2 spec pg 235 states that if the attachment type is none,
3036 // GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME will return zero and be an
3037 // INVALID_OPERATION for all other pnames
3038
3039 switch (pname)
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003040 {
Geoff Lang646559f2013-08-15 11:08:15 -04003041 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE:
3042 *params = attachmentObjectType;
3043 break;
3044
3045 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME:
3046 if (context->getClientVersion() < 3)
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003047 {
Geoff Lang646559f2013-08-15 11:08:15 -04003048 return gl::error(GL_INVALID_ENUM);
3049 }
3050 *params = 0;
3051 break;
3052
3053 default:
3054 if (context->getClientVersion() < 3)
3055 {
3056 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003057 }
3058 else
3059 {
Geoff Lang646559f2013-08-15 11:08:15 -04003060 gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003061 }
3062 }
Geoff Lang646559f2013-08-15 11:08:15 -04003063 }
3064 else
3065 {
3066 ASSERT(attachmentObjectType == GL_RENDERBUFFER || attachmentObjectType == GL_TEXTURE ||
3067 attachmentObjectType == GL_FRAMEBUFFER_DEFAULT);
3068 ASSERT(renderbuffer != NULL);
3069
3070 switch (pname)
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003071 {
Geoff Lang646559f2013-08-15 11:08:15 -04003072 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE:
3073 *params = attachmentObjectType;
3074 break;
3075
3076 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME:
3077 if (attachmentObjectType != GL_RENDERBUFFER && attachmentObjectType != GL_TEXTURE)
3078 {
3079 return gl::error(GL_INVALID_ENUM);
3080 }
3081 *params = attachmentHandle;
3082 break;
3083
3084 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL:
3085 if (attachmentObjectType != GL_TEXTURE)
3086 {
3087 return gl::error(GL_INVALID_ENUM);
3088 }
3089 *params = attachmentLevel;
3090 break;
3091
3092 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE:
3093 if (attachmentObjectType != GL_TEXTURE)
3094 {
3095 return gl::error(GL_INVALID_ENUM);
3096 }
3097 *params = gl::IsCubemapTextureTarget(attachmentType) ? attachmentType : 0;
3098 break;
3099
3100 case GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE:
3101 *params = renderbuffer->getRedSize();
3102 break;
3103
3104 case GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE:
3105 *params = renderbuffer->getGreenSize();
3106 break;
3107
3108 case GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE:
3109 *params = renderbuffer->getBlueSize();
3110 break;
3111
3112 case GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE:
3113 *params = renderbuffer->getAlphaSize();
3114 break;
3115
3116 case GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE:
3117 *params = renderbuffer->getDepthSize();
3118 break;
3119
3120 case GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE:
3121 *params = renderbuffer->getStencilSize();
3122 break;
3123
3124 case GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE:
3125 if (attachment == GL_DEPTH_STENCIL)
3126 {
3127 gl::error(GL_INVALID_OPERATION);
3128 }
3129 *params = renderbuffer->getComponentType();
3130 break;
3131
3132 case GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING:
3133 *params = renderbuffer->getColorEncoding();
3134 break;
3135
3136 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER:
3137 if (attachmentObjectType != GL_TEXTURE)
3138 {
3139 return gl::error(GL_INVALID_ENUM);
3140 }
3141 *params = attachmentLayer;
3142 break;
3143
3144 default:
3145 UNREACHABLE();
3146 break;
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003147 }
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003148 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003149 }
3150 }
3151 catch(std::bad_alloc&)
3152 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003153 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003154 }
3155}
3156
daniel@transgaming.com17f548c2011-11-09 17:47:02 +00003157GLenum __stdcall glGetGraphicsResetStatusEXT(void)
3158{
3159 EVENT("()");
3160
3161 try
3162 {
3163 gl::Context *context = gl::getContext();
3164
3165 if (context)
3166 {
3167 return context->getResetStatus();
3168 }
3169
3170 return GL_NO_ERROR;
3171 }
3172 catch(std::bad_alloc&)
3173 {
3174 return GL_OUT_OF_MEMORY;
3175 }
3176}
3177
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003178void __stdcall glGetIntegerv(GLenum pname, GLint* params)
3179{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003180 EVENT("(GLenum pname = 0x%X, GLint* params = 0x%0.8p)", pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003181
3182 try
3183 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003184 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003185
3186 if (context)
3187 {
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003188 if (!(context->getIntegerv(pname, params)))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003189 {
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003190 GLenum nativeType;
3191 unsigned int numParams = 0;
3192 if (!context->getQueryParameterInfo(pname, &nativeType, &numParams))
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003193 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003194
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003195 if (numParams == 0)
3196 return; // it is known that pname is valid, but there are no parameters to return
3197
3198 if (nativeType == GL_BOOL)
3199 {
3200 GLboolean *boolParams = NULL;
3201 boolParams = new GLboolean[numParams];
3202
3203 context->getBooleanv(pname, boolParams);
3204
3205 for (unsigned int i = 0; i < numParams; ++i)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003206 {
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003207 if (boolParams[i] == GL_FALSE)
3208 params[i] = 0;
3209 else
3210 params[i] = 1;
3211 }
3212
3213 delete [] boolParams;
3214 }
3215 else if (nativeType == GL_FLOAT)
3216 {
3217 GLfloat *floatParams = NULL;
3218 floatParams = new GLfloat[numParams];
3219
3220 context->getFloatv(pname, floatParams);
3221
3222 for (unsigned int i = 0; i < numParams; ++i)
3223 {
Jamie Madill71fbd602013-07-19 16:36:55 -04003224 // RGBA color values and DepthRangeF values are converted to integer using Equation 2.4 from Table 4.5
daniel@transgaming.comc1641352010-04-26 15:33:36 +00003225 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 +00003226 {
Jamie Madill71fbd602013-07-19 16:36:55 -04003227 params[i] = static_cast<GLint>((static_cast<GLfloat>(0xFFFFFFFF) * floatParams[i] - 1.0f) / 2.0f);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003228 }
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003229 else
Jamie Madill71fbd602013-07-19 16:36:55 -04003230 {
Jamie Madillaf496912013-07-19 16:36:54 -04003231 params[i] = gl::iround<GLint>(floatParams[i]);
Jamie Madill71fbd602013-07-19 16:36:55 -04003232 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003233 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003234
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003235 delete [] floatParams;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003236 }
Jamie Madill71fbd602013-07-19 16:36:55 -04003237 else if (nativeType == GL_INT_64_ANGLEX)
3238 {
3239 GLint64 minIntValue = static_cast<GLint64>(std::numeric_limits<int>::min());
3240 GLint64 maxIntValue = static_cast<GLint64>(std::numeric_limits<int>::max());
3241 GLint64 *int64Params = NULL;
3242 int64Params = new GLint64[numParams];
3243
3244 context->getInteger64v(pname, int64Params);
3245
3246 for (unsigned int i = 0; i < numParams; ++i)
3247 {
3248 GLint64 clampedValue = std::max(std::min(int64Params[i], maxIntValue), minIntValue);
3249 params[i] = static_cast<GLint>(clampedValue);
3250 }
3251
3252 delete [] int64Params;
3253 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003254 }
3255 }
3256 }
3257 catch(std::bad_alloc&)
3258 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003259 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003260 }
3261}
3262
3263void __stdcall glGetProgramiv(GLuint program, GLenum pname, GLint* params)
3264{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003265 EVENT("(GLuint program = %d, GLenum pname = %d, GLint* params = 0x%0.8p)", program, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003266
3267 try
3268 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003269 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003270
3271 if (context)
3272 {
3273 gl::Program *programObject = context->getProgram(program);
3274
3275 if (!programObject)
3276 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003277 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003278 }
3279
shannonwoods@chromium.orge684b582013-05-30 00:07:42 +00003280 if (context->getClientVersion() < 3)
3281 {
3282 switch (pname)
3283 {
3284 case GL_ACTIVE_UNIFORM_BLOCKS:
3285 case GL_ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH:
3286 return gl::error(GL_INVALID_ENUM);
3287 }
3288 }
3289
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003290 switch (pname)
3291 {
3292 case GL_DELETE_STATUS:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003293 *params = programObject->isFlaggedForDeletion();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003294 return;
3295 case GL_LINK_STATUS:
daniel@transgaming.com716056c2012-07-24 18:38:59 +00003296 *params = programObject->isLinked();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003297 return;
3298 case GL_VALIDATE_STATUS:
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00003299 *params = programObject->isValidated();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003300 return;
3301 case GL_INFO_LOG_LENGTH:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003302 *params = programObject->getInfoLogLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003303 return;
3304 case GL_ATTACHED_SHADERS:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003305 *params = programObject->getAttachedShadersCount();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003306 return;
3307 case GL_ACTIVE_ATTRIBUTES:
daniel@transgaming.com85423182010-04-22 13:35:27 +00003308 *params = programObject->getActiveAttributeCount();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003309 return;
3310 case GL_ACTIVE_ATTRIBUTE_MAX_LENGTH:
daniel@transgaming.com85423182010-04-22 13:35:27 +00003311 *params = programObject->getActiveAttributeMaxLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003312 return;
3313 case GL_ACTIVE_UNIFORMS:
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00003314 *params = programObject->getActiveUniformCount();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003315 return;
3316 case GL_ACTIVE_UNIFORM_MAX_LENGTH:
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00003317 *params = programObject->getActiveUniformMaxLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003318 return;
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00003319 case GL_PROGRAM_BINARY_LENGTH_OES:
apatrick@chromium.org90080e32012-07-09 22:15:33 +00003320 *params = programObject->getProgramBinaryLength();
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00003321 return;
shannonwoods@chromium.orge684b582013-05-30 00:07:42 +00003322 case GL_ACTIVE_UNIFORM_BLOCKS:
3323 *params = programObject->getActiveUniformBlockCount();
3324 return;
3325 case GL_ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH:
3326 *params = programObject->getActiveUniformBlockMaxLength();
3327 break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003328 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003329 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003330 }
3331 }
3332 }
3333 catch(std::bad_alloc&)
3334 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003335 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003336 }
3337}
3338
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00003339void __stdcall glGetProgramInfoLog(GLuint program, GLsizei bufsize, GLsizei* length, GLchar* infolog)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003340{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003341 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 +00003342 program, bufsize, length, infolog);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003343
3344 try
3345 {
3346 if (bufsize < 0)
3347 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003348 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003349 }
3350
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003351 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003352
3353 if (context)
3354 {
3355 gl::Program *programObject = context->getProgram(program);
3356
3357 if (!programObject)
3358 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003359 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003360 }
3361
3362 programObject->getInfoLog(bufsize, length, infolog);
3363 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003364 }
3365 catch(std::bad_alloc&)
3366 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003367 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003368 }
3369}
3370
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003371void __stdcall glGetQueryivEXT(GLenum target, GLenum pname, GLint *params)
3372{
3373 EVENT("GLenum target = 0x%X, GLenum pname = 0x%X, GLint *params = 0x%0.8p)", target, pname, params);
3374
3375 try
3376 {
3377 switch (pname)
3378 {
3379 case GL_CURRENT_QUERY_EXT:
3380 break;
3381 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003382 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003383 }
3384
3385 gl::Context *context = gl::getNonLostContext();
3386
3387 if (context)
3388 {
3389 params[0] = context->getActiveQuery(target);
3390 }
3391 }
3392 catch(std::bad_alloc&)
3393 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003394 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003395 }
3396}
3397
3398void __stdcall glGetQueryObjectuivEXT(GLuint id, GLenum pname, GLuint *params)
3399{
3400 EVENT("(GLuint id = %d, GLenum pname = 0x%X, GLuint *params = 0x%0.8p)", id, pname, params);
3401
3402 try
3403 {
3404 switch (pname)
3405 {
3406 case GL_QUERY_RESULT_EXT:
3407 case GL_QUERY_RESULT_AVAILABLE_EXT:
3408 break;
3409 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003410 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003411 }
3412 gl::Context *context = gl::getNonLostContext();
3413
3414 if (context)
3415 {
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003416 gl::Query *queryObject = context->getQuery(id, false, GL_NONE);
3417
3418 if (!queryObject)
3419 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003420 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003421 }
3422
3423 if (context->getActiveQuery(queryObject->getType()) == id)
3424 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003425 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003426 }
3427
3428 switch(pname)
3429 {
3430 case GL_QUERY_RESULT_EXT:
3431 params[0] = queryObject->getResult();
3432 break;
3433 case GL_QUERY_RESULT_AVAILABLE_EXT:
3434 params[0] = queryObject->isResultAvailable();
3435 break;
3436 default:
3437 ASSERT(false);
3438 }
3439 }
3440 }
3441 catch(std::bad_alloc&)
3442 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003443 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003444 }
3445}
3446
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003447void __stdcall glGetRenderbufferParameteriv(GLenum target, GLenum pname, GLint* params)
3448{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003449 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 +00003450
3451 try
3452 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003453 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003454
3455 if (context)
3456 {
3457 if (target != GL_RENDERBUFFER)
3458 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003459 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003460 }
3461
daniel@transgaming.com428d1582010-05-04 03:35:25 +00003462 if (context->getRenderbufferHandle() == 0)
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003463 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003464 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003465 }
3466
daniel@transgaming.com428d1582010-05-04 03:35:25 +00003467 gl::Renderbuffer *renderbuffer = context->getRenderbuffer(context->getRenderbufferHandle());
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003468
3469 switch (pname)
3470 {
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +00003471 case GL_RENDERBUFFER_WIDTH: *params = renderbuffer->getWidth(); break;
3472 case GL_RENDERBUFFER_HEIGHT: *params = renderbuffer->getHeight(); break;
3473 case GL_RENDERBUFFER_INTERNAL_FORMAT: *params = renderbuffer->getInternalFormat(); break;
3474 case GL_RENDERBUFFER_RED_SIZE: *params = renderbuffer->getRedSize(); break;
3475 case GL_RENDERBUFFER_GREEN_SIZE: *params = renderbuffer->getGreenSize(); break;
3476 case GL_RENDERBUFFER_BLUE_SIZE: *params = renderbuffer->getBlueSize(); break;
3477 case GL_RENDERBUFFER_ALPHA_SIZE: *params = renderbuffer->getAlphaSize(); break;
3478 case GL_RENDERBUFFER_DEPTH_SIZE: *params = renderbuffer->getDepthSize(); break;
3479 case GL_RENDERBUFFER_STENCIL_SIZE: *params = renderbuffer->getStencilSize(); break;
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00003480 case GL_RENDERBUFFER_SAMPLES_ANGLE:
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +00003481 if (context->getMaxSupportedSamples() != 0)
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00003482 {
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +00003483 *params = renderbuffer->getSamples();
3484 }
3485 else
3486 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003487 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00003488 }
3489 break;
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003490 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003491 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003492 }
3493 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003494 }
3495 catch(std::bad_alloc&)
3496 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003497 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003498 }
3499}
3500
3501void __stdcall glGetShaderiv(GLuint shader, GLenum pname, GLint* params)
3502{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003503 EVENT("(GLuint shader = %d, GLenum pname = %d, GLint* params = 0x%0.8p)", shader, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003504
3505 try
3506 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003507 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003508
3509 if (context)
3510 {
3511 gl::Shader *shaderObject = context->getShader(shader);
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00003512
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003513 if (!shaderObject)
3514 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003515 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003516 }
3517
3518 switch (pname)
3519 {
3520 case GL_SHADER_TYPE:
3521 *params = shaderObject->getType();
3522 return;
3523 case GL_DELETE_STATUS:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003524 *params = shaderObject->isFlaggedForDeletion();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003525 return;
3526 case GL_COMPILE_STATUS:
3527 *params = shaderObject->isCompiled() ? GL_TRUE : GL_FALSE;
3528 return;
3529 case GL_INFO_LOG_LENGTH:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003530 *params = shaderObject->getInfoLogLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003531 return;
3532 case GL_SHADER_SOURCE_LENGTH:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003533 *params = shaderObject->getSourceLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003534 return;
zmo@google.coma574f782011-10-03 21:45:23 +00003535 case GL_TRANSLATED_SHADER_SOURCE_LENGTH_ANGLE:
3536 *params = shaderObject->getTranslatedSourceLength();
3537 return;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003538 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003539 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003540 }
3541 }
3542 }
3543 catch(std::bad_alloc&)
3544 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003545 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003546 }
3547}
3548
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00003549void __stdcall glGetShaderInfoLog(GLuint shader, GLsizei bufsize, GLsizei* length, GLchar* infolog)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003550{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003551 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 +00003552 shader, bufsize, length, infolog);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003553
3554 try
3555 {
3556 if (bufsize < 0)
3557 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003558 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003559 }
3560
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003561 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003562
3563 if (context)
3564 {
3565 gl::Shader *shaderObject = context->getShader(shader);
3566
3567 if (!shaderObject)
3568 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003569 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003570 }
3571
3572 shaderObject->getInfoLog(bufsize, length, infolog);
3573 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003574 }
3575 catch(std::bad_alloc&)
3576 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003577 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003578 }
3579}
3580
3581void __stdcall glGetShaderPrecisionFormat(GLenum shadertype, GLenum precisiontype, GLint* range, GLint* precision)
3582{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003583 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 +00003584 shadertype, precisiontype, range, precision);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003585
3586 try
3587 {
daniel@transgaming.com6c785212010-03-30 03:36:17 +00003588 switch (shadertype)
3589 {
3590 case GL_VERTEX_SHADER:
3591 case GL_FRAGMENT_SHADER:
3592 break;
3593 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003594 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com6c785212010-03-30 03:36:17 +00003595 }
3596
3597 switch (precisiontype)
3598 {
3599 case GL_LOW_FLOAT:
3600 case GL_MEDIUM_FLOAT:
3601 case GL_HIGH_FLOAT:
3602 // Assume IEEE 754 precision
3603 range[0] = 127;
3604 range[1] = 127;
daniel@transgaming.comc5c15382010-04-23 18:34:49 +00003605 *precision = 23;
daniel@transgaming.com6c785212010-03-30 03:36:17 +00003606 break;
3607 case GL_LOW_INT:
3608 case GL_MEDIUM_INT:
3609 case GL_HIGH_INT:
3610 // Some (most) hardware only supports single-precision floating-point numbers,
3611 // which can accurately represent integers up to +/-16777216
3612 range[0] = 24;
3613 range[1] = 24;
daniel@transgaming.comc5c15382010-04-23 18:34:49 +00003614 *precision = 0;
daniel@transgaming.com6c785212010-03-30 03:36:17 +00003615 break;
3616 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003617 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com6c785212010-03-30 03:36:17 +00003618 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003619 }
3620 catch(std::bad_alloc&)
3621 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003622 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003623 }
3624}
3625
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00003626void __stdcall glGetShaderSource(GLuint shader, GLsizei bufsize, GLsizei* length, GLchar* source)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003627{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003628 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 +00003629 shader, bufsize, length, source);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003630
3631 try
3632 {
3633 if (bufsize < 0)
3634 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003635 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003636 }
3637
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003638 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003639
3640 if (context)
3641 {
3642 gl::Shader *shaderObject = context->getShader(shader);
3643
3644 if (!shaderObject)
3645 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003646 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003647 }
3648
3649 shaderObject->getSource(bufsize, length, source);
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
zmo@google.coma574f782011-10-03 21:45:23 +00003658void __stdcall glGetTranslatedShaderSourceANGLE(GLuint shader, GLsizei bufsize, GLsizei* length, GLchar* source)
3659{
3660 EVENT("(GLuint shader = %d, GLsizei bufsize = %d, GLsizei* length = 0x%0.8p, GLchar* source = 0x%0.8p)",
3661 shader, bufsize, length, source);
3662
3663 try
3664 {
3665 if (bufsize < 0)
3666 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003667 return gl::error(GL_INVALID_VALUE);
zmo@google.coma574f782011-10-03 21:45:23 +00003668 }
3669
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003670 gl::Context *context = gl::getNonLostContext();
zmo@google.coma574f782011-10-03 21:45:23 +00003671
3672 if (context)
3673 {
3674 gl::Shader *shaderObject = context->getShader(shader);
3675
3676 if (!shaderObject)
3677 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003678 return gl::error(GL_INVALID_OPERATION);
zmo@google.coma574f782011-10-03 21:45:23 +00003679 }
3680
3681 shaderObject->getTranslatedSource(bufsize, length, source);
3682 }
3683 }
3684 catch(std::bad_alloc&)
3685 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003686 return gl::error(GL_OUT_OF_MEMORY);
zmo@google.coma574f782011-10-03 21:45:23 +00003687 }
3688}
3689
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003690const GLubyte* __stdcall glGetString(GLenum name)
3691{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003692 EVENT("(GLenum name = 0x%X)", name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003693
3694 try
3695 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003696 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com3e4c6002010-05-05 18:50:13 +00003697
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003698 switch (name)
3699 {
3700 case GL_VENDOR:
daniel@transgaming.coma0ce7e62011-01-25 14:47:16 +00003701 return (GLubyte*)"Google Inc.";
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003702 case GL_RENDERER:
daniel@transgaming.comc23ff642011-08-16 20:28:45 +00003703 return (GLubyte*)((context != NULL) ? context->getRendererString() : "ANGLE");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003704 case GL_VERSION:
shannonwoods@chromium.orge2865d02013-05-30 00:06:01 +00003705 if (context->getClientVersion() == 2)
3706 {
3707 return (GLubyte*)"OpenGL ES 2.0 (ANGLE " VERSION_STRING ")";
3708 }
3709 else
3710 {
3711 return (GLubyte*)"OpenGL ES 3.0 (ANGLE " VERSION_STRING ")";
3712 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003713 case GL_SHADING_LANGUAGE_VERSION:
shannonwoods@chromium.orge2865d02013-05-30 00:06:01 +00003714 if (context->getClientVersion() == 2)
3715 {
3716 return (GLubyte*)"OpenGL ES GLSL ES 1.00 (ANGLE " VERSION_STRING ")";
3717 }
3718 else
3719 {
3720 return (GLubyte*)"OpenGL ES GLSL ES 3.00 (ANGLE " VERSION_STRING ")";
3721 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003722 case GL_EXTENSIONS:
shannonwoods@chromium.org302df742013-05-30 00:05:54 +00003723 return (GLubyte*)((context != NULL) ? context->getCombinedExtensionsString() : "");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003724 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003725 return gl::error(GL_INVALID_ENUM, (GLubyte*)NULL);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003726 }
3727 }
3728 catch(std::bad_alloc&)
3729 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003730 return gl::error(GL_OUT_OF_MEMORY, (GLubyte*)NULL);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003731 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003732}
3733
3734void __stdcall glGetTexParameterfv(GLenum target, GLenum pname, GLfloat* params)
3735{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003736 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 +00003737
3738 try
3739 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003740 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003741
3742 if (context)
3743 {
Jamie Madillfb8a8302013-07-03 14:24:12 -04003744 gl::Texture *texture = getTargetTexture(context, target);
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003745
Jamie Madillfb8a8302013-07-03 14:24:12 -04003746 if (!texture)
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003747 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003748 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003749 }
3750
3751 switch (pname)
3752 {
3753 case GL_TEXTURE_MAG_FILTER:
3754 *params = (GLfloat)texture->getMagFilter();
3755 break;
3756 case GL_TEXTURE_MIN_FILTER:
3757 *params = (GLfloat)texture->getMinFilter();
3758 break;
3759 case GL_TEXTURE_WRAP_S:
3760 *params = (GLfloat)texture->getWrapS();
3761 break;
3762 case GL_TEXTURE_WRAP_T:
3763 *params = (GLfloat)texture->getWrapT();
3764 break;
shannon.woods%transgaming.com@gtempaccount.com0b3a8df2013-04-13 03:44:51 +00003765 case GL_TEXTURE_WRAP_R:
3766 if (context->getClientVersion() < 3)
3767 {
3768 return gl::error(GL_INVALID_ENUM);
3769 }
3770 *params = (GLfloat)texture->getWrapR();
3771 break;
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00003772 case GL_TEXTURE_IMMUTABLE_FORMAT:
3773 // Exposed to ES2.0 through EXT_texture_storage, no client version validation.
daniel@transgaming.comd30bd0a2011-11-11 04:10:34 +00003774 *params = (GLfloat)(texture->isImmutable() ? GL_TRUE : GL_FALSE);
3775 break;
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00003776 case GL_TEXTURE_IMMUTABLE_LEVELS:
3777 if (context->getClientVersion() < 3)
3778 {
3779 return gl::error(GL_INVALID_ENUM);
3780 }
3781 *params = (GLfloat)(texture->isImmutable() ? texture->levelCount() : 0);
3782 break;
daniel@transgaming.com7d18c172011-11-11 04:18:21 +00003783 case GL_TEXTURE_USAGE_ANGLE:
3784 *params = (GLfloat)texture->getUsage();
3785 break;
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00003786 case GL_TEXTURE_MAX_ANISOTROPY_EXT:
3787 if (!context->supportsTextureFilterAnisotropy())
3788 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003789 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00003790 }
3791 *params = (GLfloat)texture->getMaxAnisotropy();
3792 break;
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003793 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003794 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003795 }
3796 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003797 }
3798 catch(std::bad_alloc&)
3799 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003800 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003801 }
3802}
3803
3804void __stdcall glGetTexParameteriv(GLenum target, GLenum pname, GLint* params)
3805{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003806 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 +00003807
3808 try
3809 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003810 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003811
3812 if (context)
3813 {
Jamie Madillfb8a8302013-07-03 14:24:12 -04003814 gl::Texture *texture = getTargetTexture(context, target);
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003815
Jamie Madillfb8a8302013-07-03 14:24:12 -04003816 if (!texture)
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003817 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003818 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003819 }
3820
3821 switch (pname)
3822 {
3823 case GL_TEXTURE_MAG_FILTER:
3824 *params = texture->getMagFilter();
3825 break;
3826 case GL_TEXTURE_MIN_FILTER:
3827 *params = texture->getMinFilter();
3828 break;
3829 case GL_TEXTURE_WRAP_S:
3830 *params = texture->getWrapS();
3831 break;
3832 case GL_TEXTURE_WRAP_T:
3833 *params = texture->getWrapT();
3834 break;
shannon.woods%transgaming.com@gtempaccount.com0b3a8df2013-04-13 03:44:51 +00003835 case GL_TEXTURE_WRAP_R:
3836 if (context->getClientVersion() < 3)
3837 {
3838 return gl::error(GL_INVALID_ENUM);
3839 }
3840 *params = texture->getWrapR();
3841 break;
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00003842 case GL_TEXTURE_IMMUTABLE_FORMAT:
3843 // Exposed to ES2.0 through EXT_texture_storage, no client version validation.
daniel@transgaming.comd30bd0a2011-11-11 04:10:34 +00003844 *params = texture->isImmutable() ? GL_TRUE : GL_FALSE;
3845 break;
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00003846 case GL_TEXTURE_IMMUTABLE_LEVELS:
3847 if (context->getClientVersion() < 3)
3848 {
3849 return gl::error(GL_INVALID_ENUM);
3850 }
3851 *params = texture->isImmutable() ? texture->levelCount() : 0;
3852 break;
daniel@transgaming.com7d18c172011-11-11 04:18:21 +00003853 case GL_TEXTURE_USAGE_ANGLE:
3854 *params = texture->getUsage();
3855 break;
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00003856 case GL_TEXTURE_MAX_ANISOTROPY_EXT:
3857 if (!context->supportsTextureFilterAnisotropy())
3858 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003859 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00003860 }
3861 *params = (GLint)texture->getMaxAnisotropy();
3862 break;
shannonwoods@chromium.orgabf14cc2013-05-30 00:20:58 +00003863
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003864 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003865 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003866 }
3867 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003868 }
3869 catch(std::bad_alloc&)
3870 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003871 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003872 }
3873}
3874
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003875void __stdcall glGetnUniformfvEXT(GLuint program, GLint location, GLsizei bufSize, GLfloat* params)
3876{
3877 EVENT("(GLuint program = %d, GLint location = %d, GLsizei bufSize = %d, GLfloat* params = 0x%0.8p)",
3878 program, location, bufSize, params);
3879
3880 try
3881 {
3882 if (bufSize < 0)
3883 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003884 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003885 }
3886
3887 gl::Context *context = gl::getNonLostContext();
3888
3889 if (context)
3890 {
3891 if (program == 0)
3892 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003893 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003894 }
3895
3896 gl::Program *programObject = context->getProgram(program);
3897
daniel@transgaming.com716056c2012-07-24 18:38:59 +00003898 if (!programObject || !programObject->isLinked())
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003899 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003900 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003901 }
3902
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003903 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
3904 if (!programBinary)
3905 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003906 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003907 }
3908
3909 if (!programBinary->getUniformfv(location, &bufSize, params))
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003910 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003911 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003912 }
3913 }
3914 }
3915 catch(std::bad_alloc&)
3916 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003917 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003918 }
3919}
3920
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003921void __stdcall glGetUniformfv(GLuint program, GLint location, GLfloat* params)
3922{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003923 EVENT("(GLuint program = %d, GLint location = %d, GLfloat* params = 0x%0.8p)", program, location, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003924
3925 try
3926 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003927 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003928
3929 if (context)
3930 {
3931 if (program == 0)
3932 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003933 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003934 }
3935
3936 gl::Program *programObject = context->getProgram(program);
3937
daniel@transgaming.com716056c2012-07-24 18:38:59 +00003938 if (!programObject || !programObject->isLinked())
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003939 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003940 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003941 }
3942
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003943 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
3944 if (!programBinary)
3945 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003946 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003947 }
3948
3949 if (!programBinary->getUniformfv(location, NULL, params))
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003950 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003951 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003952 }
3953 }
3954 }
3955 catch(std::bad_alloc&)
3956 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003957 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003958 }
3959}
3960
3961void __stdcall glGetnUniformivEXT(GLuint program, GLint location, GLsizei bufSize, GLint* params)
3962{
3963 EVENT("(GLuint program = %d, GLint location = %d, GLsizei bufSize = %d, GLint* params = 0x%0.8p)",
3964 program, location, bufSize, params);
3965
3966 try
3967 {
3968 if (bufSize < 0)
3969 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003970 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003971 }
3972
3973 gl::Context *context = gl::getNonLostContext();
3974
3975 if (context)
3976 {
3977 if (program == 0)
3978 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003979 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003980 }
3981
3982 gl::Program *programObject = context->getProgram(program);
3983
daniel@transgaming.com716056c2012-07-24 18:38:59 +00003984 if (!programObject || !programObject->isLinked())
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003985 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003986 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003987 }
3988
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003989 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
3990 if (!programBinary)
3991 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003992 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003993 }
3994
3995 if (!programBinary->getUniformiv(location, &bufSize, params))
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003996 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003997 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003998 }
3999 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004000 }
4001 catch(std::bad_alloc&)
4002 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004003 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004004 }
4005}
4006
4007void __stdcall glGetUniformiv(GLuint program, GLint location, GLint* params)
4008{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004009 EVENT("(GLuint program = %d, GLint location = %d, GLint* params = 0x%0.8p)", program, location, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004010
4011 try
4012 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004013 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004014
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.combb3d9d02010-04-13 03:26:06 +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.combb3d9d02010-04-13 03:26:06 +00004025 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004026 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +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->getUniformiv(location, NULL, params))
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004036 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004037 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004038 }
4039 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004040 }
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.com4f39fd92010-03-08 20:26:45 +00004044 }
4045}
4046
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00004047int __stdcall glGetUniformLocation(GLuint program, const GLchar* name)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004048{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004049 EVENT("(GLuint program = %d, const GLchar* name = 0x%0.8p)", program, name);
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.com4f39fd92010-03-08 20:26:45 +00004054
4055 if (strstr(name, "gl_") == name)
4056 {
4057 return -1;
4058 }
4059
4060 if (context)
4061 {
4062 gl::Program *programObject = context->getProgram(program);
4063
4064 if (!programObject)
4065 {
daniel@transgaming.comd1abe5b2010-04-13 19:53:33 +00004066 if (context->getShader(program))
4067 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004068 return gl::error(GL_INVALID_OPERATION, -1);
daniel@transgaming.comd1abe5b2010-04-13 19:53:33 +00004069 }
4070 else
4071 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004072 return gl::error(GL_INVALID_VALUE, -1);
daniel@transgaming.comd1abe5b2010-04-13 19:53:33 +00004073 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004074 }
4075
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00004076 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
daniel@transgaming.com716056c2012-07-24 18:38:59 +00004077 if (!programObject->isLinked() || !programBinary)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004078 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004079 return gl::error(GL_INVALID_OPERATION, -1);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004080 }
4081
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00004082 return programBinary->getUniformLocation(name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004083 }
4084 }
4085 catch(std::bad_alloc&)
4086 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004087 return gl::error(GL_OUT_OF_MEMORY, -1);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004088 }
4089
4090 return -1;
4091}
4092
4093void __stdcall glGetVertexAttribfv(GLuint index, GLenum pname, GLfloat* params)
4094{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004095 EVENT("(GLuint index = %d, GLenum pname = 0x%X, GLfloat* params = 0x%0.8p)", index, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004096
4097 try
4098 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004099 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004100
daniel@transgaming.come0078962010-04-15 20:45:08 +00004101 if (context)
4102 {
4103 if (index >= gl::MAX_VERTEX_ATTRIBS)
4104 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004105 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004106 }
4107
daniel@transgaming.com83921382011-01-08 05:46:00 +00004108 const gl::VertexAttribute &attribState = context->getVertexAttribState(index);
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004109
Geoff Lang34dbb6f2013-08-05 15:05:47 -04004110 if (!gl::ValidateGetVertexAttribParameters(pname, context->getClientVersion()))
daniel@transgaming.come0078962010-04-15 20:45:08 +00004111 {
Jamie Madillaff71502013-07-02 11:57:05 -04004112 return;
4113 }
4114
4115 if (pname == GL_CURRENT_VERTEX_ATTRIB)
4116 {
4117 const gl::VertexAttribCurrentValueData &currentValueData = context->getVertexAttribCurrentValue(index);
4118 for (int i = 0; i < 4; ++i)
daniel@transgaming.come0078962010-04-15 20:45:08 +00004119 {
Jamie Madillaff71502013-07-02 11:57:05 -04004120 params[i] = currentValueData.FloatValues[i];
daniel@transgaming.come0078962010-04-15 20:45:08 +00004121 }
Jamie Madillaff71502013-07-02 11:57:05 -04004122 }
4123 else
4124 {
4125 *params = attribState.querySingleParameter<GLfloat>(pname);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004126 }
4127 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004128 }
4129 catch(std::bad_alloc&)
4130 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004131 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004132 }
4133}
4134
4135void __stdcall glGetVertexAttribiv(GLuint index, GLenum pname, GLint* params)
4136{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004137 EVENT("(GLuint index = %d, GLenum pname = 0x%X, GLint* params = 0x%0.8p)", index, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004138
4139 try
4140 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004141 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004142
daniel@transgaming.come0078962010-04-15 20:45:08 +00004143 if (context)
4144 {
4145 if (index >= gl::MAX_VERTEX_ATTRIBS)
4146 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004147 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004148 }
4149
daniel@transgaming.com83921382011-01-08 05:46:00 +00004150 const gl::VertexAttribute &attribState = context->getVertexAttribState(index);
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004151
Geoff Lang34dbb6f2013-08-05 15:05:47 -04004152 if (!gl::ValidateGetVertexAttribParameters(pname, context->getClientVersion()))
daniel@transgaming.come0078962010-04-15 20:45:08 +00004153 {
Jamie Madillaff71502013-07-02 11:57:05 -04004154 return;
4155 }
4156
4157 if (pname == GL_CURRENT_VERTEX_ATTRIB)
4158 {
4159 const gl::VertexAttribCurrentValueData &currentValueData = context->getVertexAttribCurrentValue(index);
4160 for (int i = 0; i < 4; ++i)
daniel@transgaming.come0078962010-04-15 20:45:08 +00004161 {
Jamie Madillaff71502013-07-02 11:57:05 -04004162 float currentValue = currentValueData.FloatValues[i];
Jamie Madillaf496912013-07-19 16:36:54 -04004163 params[i] = gl::iround<GLint>(currentValue);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004164 }
Jamie Madillaff71502013-07-02 11:57:05 -04004165 }
4166 else
4167 {
4168 *params = attribState.querySingleParameter<GLint>(pname);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004169 }
4170 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004171 }
4172 catch(std::bad_alloc&)
4173 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004174 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004175 }
4176}
4177
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00004178void __stdcall glGetVertexAttribPointerv(GLuint index, GLenum pname, GLvoid** pointer)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004179{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004180 EVENT("(GLuint index = %d, GLenum pname = 0x%X, GLvoid** pointer = 0x%0.8p)", index, pname, pointer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004181
4182 try
4183 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004184 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004185
daniel@transgaming.come0078962010-04-15 20:45:08 +00004186 if (context)
4187 {
4188 if (index >= gl::MAX_VERTEX_ATTRIBS)
4189 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004190 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004191 }
4192
4193 if (pname != GL_VERTEX_ATTRIB_ARRAY_POINTER)
4194 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004195 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004196 }
4197
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004198 *pointer = const_cast<GLvoid*>(context->getVertexAttribPointer(index));
daniel@transgaming.come0078962010-04-15 20:45:08 +00004199 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004200 }
4201 catch(std::bad_alloc&)
4202 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004203 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004204 }
4205}
4206
4207void __stdcall glHint(GLenum target, GLenum mode)
4208{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004209 EVENT("(GLenum target = 0x%X, GLenum mode = 0x%X)", target, mode);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004210
4211 try
4212 {
alokp@chromium.orgd303ef92010-09-09 17:30:15 +00004213 switch (mode)
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00004214 {
alokp@chromium.orgd303ef92010-09-09 17:30:15 +00004215 case GL_FASTEST:
4216 case GL_NICEST:
4217 case GL_DONT_CARE:
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00004218 break;
4219 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004220 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00004221 }
4222
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004223 gl::Context *context = gl::getNonLostContext();
alokp@chromium.orgd303ef92010-09-09 17:30:15 +00004224 switch (target)
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00004225 {
alokp@chromium.orgd303ef92010-09-09 17:30:15 +00004226 case GL_GENERATE_MIPMAP_HINT:
4227 if (context) context->setGenerateMipmapHint(mode);
4228 break;
4229 case GL_FRAGMENT_SHADER_DERIVATIVE_HINT_OES:
4230 if (context) context->setFragmentShaderDerivativeHint(mode);
4231 break;
4232 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004233 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00004234 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004235 }
4236 catch(std::bad_alloc&)
4237 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004238 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004239 }
4240}
4241
4242GLboolean __stdcall glIsBuffer(GLuint buffer)
4243{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004244 EVENT("(GLuint buffer = %d)", buffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004245
4246 try
4247 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004248 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004249
4250 if (context && buffer)
4251 {
4252 gl::Buffer *bufferObject = context->getBuffer(buffer);
4253
4254 if (bufferObject)
4255 {
4256 return GL_TRUE;
4257 }
4258 }
4259 }
4260 catch(std::bad_alloc&)
4261 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004262 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004263 }
4264
4265 return GL_FALSE;
4266}
4267
4268GLboolean __stdcall glIsEnabled(GLenum cap)
4269{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004270 EVENT("(GLenum cap = 0x%X)", cap);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004271
4272 try
4273 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004274 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004275
4276 if (context)
4277 {
4278 switch (cap)
4279 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004280 case GL_CULL_FACE: return context->isCullFaceEnabled();
4281 case GL_POLYGON_OFFSET_FILL: return context->isPolygonOffsetFillEnabled();
4282 case GL_SAMPLE_ALPHA_TO_COVERAGE: return context->isSampleAlphaToCoverageEnabled();
4283 case GL_SAMPLE_COVERAGE: return context->isSampleCoverageEnabled();
4284 case GL_SCISSOR_TEST: return context->isScissorTestEnabled();
4285 case GL_STENCIL_TEST: return context->isStencilTestEnabled();
4286 case GL_DEPTH_TEST: return context->isDepthTestEnabled();
4287 case GL_BLEND: return context->isBlendEnabled();
4288 case GL_DITHER: return context->isDitherEnabled();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004289 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004290 return gl::error(GL_INVALID_ENUM, false);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004291 }
4292 }
4293 }
4294 catch(std::bad_alloc&)
4295 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004296 return gl::error(GL_OUT_OF_MEMORY, false);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004297 }
4298
4299 return false;
4300}
4301
daniel@transgaming.comfe208882010-09-01 15:47:57 +00004302GLboolean __stdcall glIsFenceNV(GLuint fence)
4303{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004304 EVENT("(GLuint fence = %d)", fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004305
4306 try
4307 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004308 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004309
4310 if (context)
4311 {
Jamie Madill33dc8432013-07-26 11:55:05 -04004312 gl::FenceNV *fenceObject = context->getFenceNV(fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004313
4314 if (fenceObject == NULL)
4315 {
4316 return GL_FALSE;
4317 }
4318
4319 return fenceObject->isFence();
4320 }
4321 }
4322 catch(std::bad_alloc&)
4323 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004324 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004325 }
4326
4327 return GL_FALSE;
daniel@transgaming.comfe208882010-09-01 15:47:57 +00004328}
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004329
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004330GLboolean __stdcall glIsFramebuffer(GLuint framebuffer)
4331{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004332 EVENT("(GLuint framebuffer = %d)", framebuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004333
4334 try
4335 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004336 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004337
4338 if (context && framebuffer)
4339 {
4340 gl::Framebuffer *framebufferObject = context->getFramebuffer(framebuffer);
4341
4342 if (framebufferObject)
4343 {
4344 return GL_TRUE;
4345 }
4346 }
4347 }
4348 catch(std::bad_alloc&)
4349 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004350 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004351 }
4352
4353 return GL_FALSE;
4354}
4355
4356GLboolean __stdcall glIsProgram(GLuint program)
4357{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004358 EVENT("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004359
4360 try
4361 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004362 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004363
4364 if (context && program)
4365 {
4366 gl::Program *programObject = context->getProgram(program);
4367
4368 if (programObject)
4369 {
4370 return GL_TRUE;
4371 }
4372 }
4373 }
4374 catch(std::bad_alloc&)
4375 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004376 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004377 }
4378
4379 return GL_FALSE;
4380}
4381
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00004382GLboolean __stdcall glIsQueryEXT(GLuint id)
4383{
4384 EVENT("(GLuint id = %d)", id);
4385
4386 try
4387 {
4388 if (id == 0)
4389 {
4390 return GL_FALSE;
4391 }
4392
4393 gl::Context *context = gl::getNonLostContext();
4394
4395 if (context)
4396 {
4397 gl::Query *queryObject = context->getQuery(id, false, GL_NONE);
4398
4399 if (queryObject)
4400 {
4401 return GL_TRUE;
4402 }
4403 }
4404 }
4405 catch(std::bad_alloc&)
4406 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004407 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00004408 }
4409
4410 return GL_FALSE;
4411}
4412
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004413GLboolean __stdcall glIsRenderbuffer(GLuint renderbuffer)
4414{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004415 EVENT("(GLuint renderbuffer = %d)", renderbuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004416
4417 try
4418 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004419 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004420
4421 if (context && renderbuffer)
4422 {
4423 gl::Renderbuffer *renderbufferObject = context->getRenderbuffer(renderbuffer);
4424
4425 if (renderbufferObject)
4426 {
4427 return GL_TRUE;
4428 }
4429 }
4430 }
4431 catch(std::bad_alloc&)
4432 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004433 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004434 }
4435
4436 return GL_FALSE;
4437}
4438
4439GLboolean __stdcall glIsShader(GLuint shader)
4440{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004441 EVENT("(GLuint shader = %d)", shader);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004442
4443 try
4444 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004445 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004446
4447 if (context && shader)
4448 {
4449 gl::Shader *shaderObject = context->getShader(shader);
4450
4451 if (shaderObject)
4452 {
4453 return GL_TRUE;
4454 }
4455 }
4456 }
4457 catch(std::bad_alloc&)
4458 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004459 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004460 }
4461
4462 return GL_FALSE;
4463}
4464
4465GLboolean __stdcall glIsTexture(GLuint texture)
4466{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004467 EVENT("(GLuint texture = %d)", texture);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004468
4469 try
4470 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004471 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004472
4473 if (context && texture)
4474 {
4475 gl::Texture *textureObject = context->getTexture(texture);
4476
4477 if (textureObject)
4478 {
4479 return GL_TRUE;
4480 }
4481 }
4482 }
4483 catch(std::bad_alloc&)
4484 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004485 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004486 }
4487
4488 return GL_FALSE;
4489}
4490
4491void __stdcall glLineWidth(GLfloat width)
4492{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004493 EVENT("(GLfloat width = %f)", width);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004494
4495 try
4496 {
4497 if (width <= 0.0f)
4498 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004499 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004500 }
4501
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004502 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com32e58cd2010-03-24 09:44:10 +00004503
4504 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004505 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004506 context->setLineWidth(width);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004507 }
4508 }
4509 catch(std::bad_alloc&)
4510 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004511 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004512 }
4513}
4514
4515void __stdcall glLinkProgram(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)
4524 {
4525 gl::Program *programObject = context->getProgram(program);
4526
4527 if (!programObject)
4528 {
daniel@transgaming.com277b7142010-04-13 03:26:44 +00004529 if (context->getShader(program))
4530 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004531 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com277b7142010-04-13 03:26:44 +00004532 }
4533 else
4534 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004535 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com277b7142010-04-13 03:26:44 +00004536 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004537 }
4538
daniel@transgaming.com95d29422012-07-24 18:36:10 +00004539 context->linkProgram(program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004540 }
4541 }
4542 catch(std::bad_alloc&)
4543 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004544 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004545 }
4546}
4547
4548void __stdcall glPixelStorei(GLenum pname, GLint param)
4549{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004550 EVENT("(GLenum pname = 0x%X, GLint param = %d)", pname, param);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004551
4552 try
4553 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004554 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004555
4556 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004557 {
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004558 switch (pname)
4559 {
4560 case GL_UNPACK_ALIGNMENT:
4561 if (param != 1 && param != 2 && param != 4 && param != 8)
4562 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004563 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004564 }
4565
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004566 context->setUnpackAlignment(param);
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004567 break;
4568
4569 case GL_PACK_ALIGNMENT:
4570 if (param != 1 && param != 2 && param != 4 && param != 8)
4571 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004572 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004573 }
4574
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004575 context->setPackAlignment(param);
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004576 break;
4577
bsalomon@google.com56d46ab2011-11-23 14:53:10 +00004578 case GL_PACK_REVERSE_ROW_ORDER_ANGLE:
4579 context->setPackReverseRowOrder(param != 0);
4580 break;
4581
shannonwoods@chromium.orgabf14cc2013-05-30 00:20:58 +00004582 case GL_UNPACK_IMAGE_HEIGHT:
4583 case GL_UNPACK_SKIP_IMAGES:
4584 case GL_UNPACK_ROW_LENGTH:
4585 case GL_UNPACK_SKIP_ROWS:
4586 case GL_UNPACK_SKIP_PIXELS:
4587 case GL_PACK_ROW_LENGTH:
4588 case GL_PACK_SKIP_ROWS:
4589 case GL_PACK_SKIP_PIXELS:
4590 if (context->getClientVersion() < 3)
4591 {
4592 return gl::error(GL_INVALID_ENUM);
4593 }
4594 UNIMPLEMENTED();
4595 break;
4596
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004597 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004598 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004599 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004600 }
4601 }
4602 catch(std::bad_alloc&)
4603 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004604 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004605 }
4606}
4607
4608void __stdcall glPolygonOffset(GLfloat factor, GLfloat units)
4609{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004610 EVENT("(GLfloat factor = %f, GLfloat units = %f)", factor, units);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004611
4612 try
4613 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004614 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comaede6302010-04-29 03:35:48 +00004615
4616 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004617 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004618 context->setPolygonOffsetParams(factor, units);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004619 }
4620 }
4621 catch(std::bad_alloc&)
4622 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004623 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004624 }
4625}
4626
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00004627void __stdcall glReadnPixelsEXT(GLint x, GLint y, GLsizei width, GLsizei height,
4628 GLenum format, GLenum type, GLsizei bufSize,
4629 GLvoid *data)
4630{
4631 EVENT("(GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d, "
4632 "GLenum format = 0x%X, GLenum type = 0x%X, GLsizei bufSize = 0x%d, GLvoid *data = 0x%0.8p)",
4633 x, y, width, height, format, type, bufSize, data);
4634
4635 try
4636 {
4637 if (width < 0 || height < 0 || bufSize < 0)
4638 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004639 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00004640 }
4641
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00004642 gl::Context *context = gl::getNonLostContext();
4643
4644 if (context)
4645 {
shannonwoods@chromium.org44a4f982013-05-30 00:13:49 +00004646 GLint currentInternalFormat;
daniel@transgaming.com42944b02012-09-27 17:45:57 +00004647 GLenum currentFormat, currentType;
shannonwoods@chromium.org44a4f982013-05-30 00:13:49 +00004648
daniel@transgaming.com42944b02012-09-27 17:45:57 +00004649 // Failure in getCurrentReadFormatType indicates that no color attachment is currently bound,
4650 // and attempting to read back if that's the case is an error. The error will be registered
4651 // by getCurrentReadFormat.
shannonwoods@chromium.org44a4f982013-05-30 00:13:49 +00004652 if (!context->getCurrentReadFormatType(&currentInternalFormat, &currentFormat, &currentType))
daniel@transgaming.com42944b02012-09-27 17:45:57 +00004653 return;
4654
Geoff Lang34dbb6f2013-08-05 15:05:47 -04004655 bool validReadFormat = (context->getClientVersion() < 3) ? gl::ValidES2ReadFormatType(format, type) :
4656 gl::ValidES3ReadFormatType(currentInternalFormat, format, type);
shannonwoods@chromium.org44a4f982013-05-30 00:13:49 +00004657
4658 if (!(currentFormat == format && currentType == type) && !validReadFormat)
daniel@transgaming.com42944b02012-09-27 17:45:57 +00004659 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004660 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com42944b02012-09-27 17:45:57 +00004661 }
4662
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00004663 context->readPixels(x, y, width, height, format, type, &bufSize, data);
4664 }
4665 }
4666 catch(std::bad_alloc&)
4667 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004668 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00004669 }
4670}
4671
4672void __stdcall glReadPixels(GLint x, GLint y, GLsizei width, GLsizei height,
4673 GLenum format, GLenum type, GLvoid* pixels)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004674{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004675 EVENT("(GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00004676 "GLenum format = 0x%X, GLenum type = 0x%X, GLvoid* pixels = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00004677 x, y, width, height, format, type, pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004678
4679 try
4680 {
4681 if (width < 0 || height < 0)
4682 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004683 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004684 }
4685
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004686 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004687
4688 if (context)
4689 {
shannonwoods@chromium.org44a4f982013-05-30 00:13:49 +00004690 GLint currentInternalFormat;
daniel@transgaming.com42944b02012-09-27 17:45:57 +00004691 GLenum currentFormat, currentType;
shannonwoods@chromium.org44a4f982013-05-30 00:13:49 +00004692
daniel@transgaming.com42944b02012-09-27 17:45:57 +00004693 // Failure in getCurrentReadFormatType indicates that no color attachment is currently bound,
4694 // and attempting to read back if that's the case is an error. The error will be registered
4695 // by getCurrentReadFormat.
shannonwoods@chromium.org44a4f982013-05-30 00:13:49 +00004696 if (!context->getCurrentReadFormatType(&currentInternalFormat, &currentFormat, &currentType))
daniel@transgaming.com42944b02012-09-27 17:45:57 +00004697 return;
4698
Geoff Lang34dbb6f2013-08-05 15:05:47 -04004699 bool validReadFormat = (context->getClientVersion() < 3) ? gl::ValidES2ReadFormatType(format, type) :
4700 gl::ValidES3ReadFormatType(currentInternalFormat, format, type);
shannonwoods@chromium.org44a4f982013-05-30 00:13:49 +00004701
4702 if (!(currentFormat == format && currentType == type) && !validReadFormat)
daniel@transgaming.com42944b02012-09-27 17:45:57 +00004703 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004704 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com42944b02012-09-27 17:45:57 +00004705 }
4706
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00004707 context->readPixels(x, y, width, height, format, type, NULL, pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004708 }
4709 }
4710 catch(std::bad_alloc&)
4711 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004712 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004713 }
4714}
4715
4716void __stdcall glReleaseShaderCompiler(void)
4717{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004718 EVENT("()");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004719
4720 try
4721 {
4722 gl::Shader::releaseCompiler();
4723 }
4724 catch(std::bad_alloc&)
4725 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004726 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004727 }
4728}
4729
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00004730void __stdcall glRenderbufferStorageMultisampleANGLE(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004731{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004732 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 +00004733 target, samples, internalformat, width, height);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004734
4735 try
4736 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004737 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004738
4739 if (context)
4740 {
Geoff Lang34dbb6f2013-08-05 15:05:47 -04004741 if (!ValidateRenderbufferStorageParameters(context, target, samples, internalformat,
Geoff Lang2e1dcd52013-05-29 10:34:08 -04004742 width, height, true))
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +00004743 {
Geoff Lang2e1dcd52013-05-29 10:34:08 -04004744 return;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004745 }
shannon.woods%transgaming.com@gtempaccount.com8dce6512013-04-13 03:42:19 +00004746
4747 context->setRenderbufferStorage(width, height, internalformat, samples);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004748 }
4749 }
4750 catch(std::bad_alloc&)
4751 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004752 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004753 }
4754}
4755
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00004756void __stdcall glRenderbufferStorage(GLenum target, GLenum internalformat, GLsizei width, GLsizei height)
4757{
4758 glRenderbufferStorageMultisampleANGLE(target, 0, internalformat, width, height);
4759}
4760
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004761void __stdcall glSampleCoverage(GLclampf value, GLboolean invert)
4762{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00004763 EVENT("(GLclampf value = %f, GLboolean invert = %u)", value, invert);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004764
4765 try
4766 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004767 gl::Context* context = gl::getNonLostContext();
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00004768
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004769 if (context)
4770 {
daniel@transgaming.coma36f98e2010-05-18 18:51:09 +00004771 context->setSampleCoverageParams(gl::clamp01(value), invert == GL_TRUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004772 }
4773 }
4774 catch(std::bad_alloc&)
4775 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004776 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004777 }
4778}
4779
daniel@transgaming.comfe208882010-09-01 15:47:57 +00004780void __stdcall glSetFenceNV(GLuint fence, GLenum condition)
4781{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004782 EVENT("(GLuint fence = %d, GLenum condition = 0x%X)", fence, condition);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004783
4784 try
4785 {
4786 if (condition != GL_ALL_COMPLETED_NV)
4787 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004788 return gl::error(GL_INVALID_ENUM);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004789 }
4790
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004791 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004792
4793 if (context)
4794 {
Jamie Madill33dc8432013-07-26 11:55:05 -04004795 gl::FenceNV *fenceObject = context->getFenceNV(fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004796
4797 if (fenceObject == NULL)
4798 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004799 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004800 }
4801
4802 fenceObject->setFence(condition);
4803 }
4804 }
4805 catch(std::bad_alloc&)
4806 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004807 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004808 }
daniel@transgaming.comfe208882010-09-01 15:47:57 +00004809}
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004810
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004811void __stdcall glScissor(GLint x, GLint y, GLsizei width, GLsizei height)
4812{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004813 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 +00004814
4815 try
4816 {
4817 if (width < 0 || height < 0)
4818 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004819 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004820 }
4821
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004822 gl::Context* context = gl::getNonLostContext();
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00004823
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004824 if (context)
4825 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004826 context->setScissorParams(x, y, width, height);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004827 }
4828 }
4829 catch(std::bad_alloc&)
4830 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004831 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004832 }
4833}
4834
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00004835void __stdcall glShaderBinary(GLsizei n, const GLuint* shaders, GLenum binaryformat, const GLvoid* binary, GLsizei length)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004836{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004837 EVENT("(GLsizei n = %d, const GLuint* shaders = 0x%0.8p, GLenum binaryformat = 0x%X, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00004838 "const GLvoid* binary = 0x%0.8p, GLsizei length = %d)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00004839 n, shaders, binaryformat, binary, length);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004840
4841 try
4842 {
daniel@transgaming.comd1f667f2010-04-29 03:38:52 +00004843 // No binary shader formats are supported.
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004844 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004845 }
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
shannon.woods%transgaming.com@gtempaccount.com5f339332013-04-13 03:29:02 +00004852void __stdcall glShaderSource(GLuint shader, GLsizei count, const GLchar* const* string, const GLint* length)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004853{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004854 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 +00004855 shader, count, string, length);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004856
4857 try
4858 {
daniel@transgaming.com8e6a6be2010-04-13 03:26:41 +00004859 if (count < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004860 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004861 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004862 }
4863
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004864 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004865
4866 if (context)
4867 {
4868 gl::Shader *shaderObject = context->getShader(shader);
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00004869
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004870 if (!shaderObject)
4871 {
daniel@transgaming.com8e6a6be2010-04-13 03:26:41 +00004872 if (context->getProgram(shader))
4873 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004874 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com8e6a6be2010-04-13 03:26:41 +00004875 }
4876 else
4877 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004878 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com8e6a6be2010-04-13 03:26:41 +00004879 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004880 }
4881
4882 shaderObject->setSource(count, string, length);
4883 }
4884 }
4885 catch(std::bad_alloc&)
4886 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004887 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004888 }
4889}
4890
4891void __stdcall glStencilFunc(GLenum func, GLint ref, GLuint mask)
4892{
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00004893 glStencilFuncSeparate(GL_FRONT_AND_BACK, func, ref, mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004894}
4895
4896void __stdcall glStencilFuncSeparate(GLenum face, GLenum func, GLint ref, GLuint mask)
4897{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004898 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 +00004899
4900 try
4901 {
4902 switch (face)
4903 {
4904 case GL_FRONT:
4905 case GL_BACK:
4906 case GL_FRONT_AND_BACK:
4907 break;
4908 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004909 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004910 }
4911
4912 switch (func)
4913 {
4914 case GL_NEVER:
4915 case GL_ALWAYS:
4916 case GL_LESS:
4917 case GL_LEQUAL:
4918 case GL_EQUAL:
4919 case GL_GEQUAL:
4920 case GL_GREATER:
4921 case GL_NOTEQUAL:
4922 break;
4923 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004924 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004925 }
4926
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004927 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004928
4929 if (context)
4930 {
4931 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
4932 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004933 context->setStencilParams(func, ref, mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004934 }
4935
4936 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
4937 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004938 context->setStencilBackParams(func, ref, mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004939 }
4940 }
4941 }
4942 catch(std::bad_alloc&)
4943 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004944 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004945 }
4946}
4947
4948void __stdcall glStencilMask(GLuint mask)
4949{
4950 glStencilMaskSeparate(GL_FRONT_AND_BACK, mask);
4951}
4952
4953void __stdcall glStencilMaskSeparate(GLenum face, GLuint mask)
4954{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004955 EVENT("(GLenum face = 0x%X, GLuint mask = %d)", face, mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004956
4957 try
4958 {
4959 switch (face)
4960 {
4961 case GL_FRONT:
4962 case GL_BACK:
4963 case GL_FRONT_AND_BACK:
4964 break;
4965 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004966 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004967 }
4968
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004969 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004970
4971 if (context)
4972 {
4973 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
4974 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004975 context->setStencilWritemask(mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004976 }
4977
4978 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
4979 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004980 context->setStencilBackWritemask(mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004981 }
4982 }
4983 }
4984 catch(std::bad_alloc&)
4985 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004986 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004987 }
4988}
4989
4990void __stdcall glStencilOp(GLenum fail, GLenum zfail, GLenum zpass)
4991{
4992 glStencilOpSeparate(GL_FRONT_AND_BACK, fail, zfail, zpass);
4993}
4994
4995void __stdcall glStencilOpSeparate(GLenum face, GLenum fail, GLenum zfail, GLenum zpass)
4996{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004997 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 +00004998 face, fail, zfail, zpass);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004999
5000 try
5001 {
5002 switch (face)
5003 {
5004 case GL_FRONT:
5005 case GL_BACK:
5006 case GL_FRONT_AND_BACK:
5007 break;
5008 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005009 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005010 }
5011
5012 switch (fail)
5013 {
5014 case GL_ZERO:
5015 case GL_KEEP:
5016 case GL_REPLACE:
5017 case GL_INCR:
5018 case GL_DECR:
5019 case GL_INVERT:
5020 case GL_INCR_WRAP:
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00005021 case GL_DECR_WRAP:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005022 break;
5023 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005024 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005025 }
5026
5027 switch (zfail)
5028 {
5029 case GL_ZERO:
5030 case GL_KEEP:
5031 case GL_REPLACE:
5032 case GL_INCR:
5033 case GL_DECR:
5034 case GL_INVERT:
5035 case GL_INCR_WRAP:
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00005036 case GL_DECR_WRAP:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005037 break;
5038 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005039 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005040 }
5041
5042 switch (zpass)
5043 {
5044 case GL_ZERO:
5045 case GL_KEEP:
5046 case GL_REPLACE:
5047 case GL_INCR:
5048 case GL_DECR:
5049 case GL_INVERT:
5050 case GL_INCR_WRAP:
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00005051 case GL_DECR_WRAP:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005052 break;
5053 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005054 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005055 }
5056
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005057 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005058
5059 if (context)
5060 {
5061 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
5062 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00005063 context->setStencilOperations(fail, zfail, zpass);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005064 }
5065
5066 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
5067 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00005068 context->setStencilBackOperations(fail, zfail, zpass);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005069 }
5070 }
5071 }
5072 catch(std::bad_alloc&)
5073 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005074 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005075 }
5076}
5077
daniel@transgaming.comfe208882010-09-01 15:47:57 +00005078GLboolean __stdcall glTestFenceNV(GLuint fence)
5079{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005080 EVENT("(GLuint fence = %d)", fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005081
5082 try
5083 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005084 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005085
5086 if (context)
5087 {
Jamie Madill33dc8432013-07-26 11:55:05 -04005088 gl::FenceNV *fenceObject = context->getFenceNV(fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005089
5090 if (fenceObject == NULL)
5091 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005092 return gl::error(GL_INVALID_OPERATION, GL_TRUE);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005093 }
5094
Jamie Madillfb9a7402013-07-26 11:55:01 -04005095 if (fenceObject->isFence() != GL_TRUE)
5096 {
5097 return gl::error(GL_INVALID_OPERATION, GL_TRUE);
5098 }
5099
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005100 return fenceObject->testFence();
5101 }
5102 }
5103 catch(std::bad_alloc&)
5104 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005105 gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005106 }
5107
5108 return GL_TRUE;
daniel@transgaming.comfe208882010-09-01 15:47:57 +00005109}
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005110
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00005111void __stdcall glTexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height,
5112 GLint border, GLenum format, GLenum type, const GLvoid* pixels)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005113{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005114 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 +00005115 "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 +00005116 target, level, internalformat, width, height, border, format, type, pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005117
5118 try
5119 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005120 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005121
5122 if (context)
5123 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005124 if (context->getClientVersion() < 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -04005125 !ValidateES2TexImageParameters(context, target, level, internalformat, false, false,
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005126 0, 0, width, height, border, format, type, pixels))
daniel@transgaming.com32b11442011-11-19 02:42:48 +00005127 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005128 return;
5129 }
5130
5131 if (context->getClientVersion() >= 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -04005132 !ValidateES3TexImageParameters(context, target, level, internalformat, false, false,
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005133 0, 0, 0, width, height, 1, border, format, type))
5134 {
5135 return;
daniel@transgaming.com32b11442011-11-19 02:42:48 +00005136 }
5137
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00005138 switch (target)
5139 {
5140 case GL_TEXTURE_2D:
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00005141 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005142 gl::Texture2D *texture = context->getTexture2D();
5143 texture->setImage(level, width, height, internalformat, format, type, context->getUnpackAlignment(), pixels);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00005144 }
5145 break;
5146 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00005147 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005148 gl::TextureCubeMap *texture = context->getTextureCubeMap();
shannonwoods@chromium.org4ad58e02013-05-30 00:08:11 +00005149 texture->setImagePosX(level, width, height, internalformat, format, type, context->getUnpackAlignment(), pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005150 }
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005151 break;
5152 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
5153 {
5154 gl::TextureCubeMap *texture = context->getTextureCubeMap();
5155 texture->setImageNegX(level, width, height, internalformat, format, type, context->getUnpackAlignment(), pixels);
5156 }
5157 break;
5158 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
5159 {
5160 gl::TextureCubeMap *texture = context->getTextureCubeMap();
5161 texture->setImagePosY(level, width, height, internalformat, format, type, context->getUnpackAlignment(), pixels);
5162 }
5163 break;
5164 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
5165 {
5166 gl::TextureCubeMap *texture = context->getTextureCubeMap();
5167 texture->setImageNegY(level, width, height, internalformat, format, type, context->getUnpackAlignment(), pixels);
5168 }
5169 break;
5170 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
5171 {
5172 gl::TextureCubeMap *texture = context->getTextureCubeMap();
5173 texture->setImagePosZ(level, width, height, internalformat, format, type, context->getUnpackAlignment(), pixels);
5174 }
5175 break;
5176 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
5177 {
5178 gl::TextureCubeMap *texture = context->getTextureCubeMap();
5179 texture->setImageNegZ(level, width, height, internalformat, format, type, context->getUnpackAlignment(), pixels);
5180 }
5181 break;
5182 default: UNREACHABLE();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005183 }
5184 }
5185 }
5186 catch(std::bad_alloc&)
5187 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005188 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005189 }
5190}
5191
5192void __stdcall glTexParameterf(GLenum target, GLenum pname, GLfloat param)
5193{
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005194 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLint param = %f)", target, pname, param);
5195
5196 try
5197 {
5198 gl::Context *context = gl::getNonLostContext();
5199
5200 if (context)
5201 {
Geoff Lang34dbb6f2013-08-05 15:05:47 -04005202 if (!ValidateTexParamParameters(context, pname, static_cast<GLint>(param)))
Jamie Madill478fdb22013-07-19 16:36:59 -04005203 {
5204 return;
5205 }
5206
Jamie Madillfb8a8302013-07-03 14:24:12 -04005207 gl::Texture *texture = getTargetTexture(context, target);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005208
Jamie Madillfb8a8302013-07-03 14:24:12 -04005209 if (!texture)
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005210 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005211 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005212 }
5213
5214 switch (pname)
5215 {
Jamie Madill478fdb22013-07-19 16:36:59 -04005216 case GL_TEXTURE_WRAP_S: texture->setWrapS(gl::uiround<GLenum>(param)); break;
5217 case GL_TEXTURE_WRAP_T: texture->setWrapT(gl::uiround<GLenum>(param)); break;
5218 case GL_TEXTURE_WRAP_R: texture->setWrapR(gl::uiround<GLenum>(param)); break;
5219 case GL_TEXTURE_MIN_FILTER: texture->setMinFilter(gl::uiround<GLenum>(param)); break;
5220 case GL_TEXTURE_MAG_FILTER: texture->setMagFilter(gl::uiround<GLenum>(param)); break;
5221 case GL_TEXTURE_USAGE_ANGLE: texture->setUsage(gl::uiround<GLenum>(param)); break;
5222 case GL_TEXTURE_MAX_ANISOTROPY_EXT: texture->setMaxAnisotropy(static_cast<GLfloat>(param), context->getTextureMaxAnisotropy()); break;
5223 case GL_TEXTURE_COMPARE_MODE: texture->setCompareMode(gl::uiround<GLenum>(param)); break;
5224 case GL_TEXTURE_COMPARE_FUNC: texture->setCompareFunc(gl::uiround<GLenum>(param)); break;
shannonwoods@chromium.orgabf14cc2013-05-30 00:20:58 +00005225
Jamie Madill478fdb22013-07-19 16:36:59 -04005226 case GL_TEXTURE_SWIZZLE_R:
5227 case GL_TEXTURE_SWIZZLE_G:
5228 case GL_TEXTURE_SWIZZLE_B:
5229 case GL_TEXTURE_SWIZZLE_A:
5230 case GL_TEXTURE_BASE_LEVEL:
5231 case GL_TEXTURE_MAX_LEVEL:
shannonwoods@chromium.orgabf14cc2013-05-30 00:20:58 +00005232 case GL_TEXTURE_MIN_LOD:
5233 case GL_TEXTURE_MAX_LOD:
shannonwoods@chromium.orgabf14cc2013-05-30 00:20:58 +00005234 UNIMPLEMENTED();
5235 break;
5236
Jamie Madill478fdb22013-07-19 16:36:59 -04005237 default: UNREACHABLE(); break;
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005238 }
5239 }
5240 }
5241 catch(std::bad_alloc&)
5242 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005243 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005244 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005245}
5246
5247void __stdcall glTexParameterfv(GLenum target, GLenum pname, const GLfloat* params)
5248{
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005249 glTexParameterf(target, pname, (GLfloat)*params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005250}
5251
5252void __stdcall glTexParameteri(GLenum target, GLenum pname, GLint param)
5253{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005254 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLint param = %d)", target, pname, param);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005255
5256 try
5257 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005258 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005259
5260 if (context)
5261 {
Geoff Lang34dbb6f2013-08-05 15:05:47 -04005262 if (!ValidateTexParamParameters(context, pname, param))
Jamie Madill478fdb22013-07-19 16:36:59 -04005263 {
5264 return;
5265 }
5266
Jamie Madillfb8a8302013-07-03 14:24:12 -04005267 gl::Texture *texture = getTargetTexture(context, target);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005268
Jamie Madillfb8a8302013-07-03 14:24:12 -04005269 if (!texture)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005270 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005271 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005272 }
5273
5274 switch (pname)
5275 {
Jamie Madill478fdb22013-07-19 16:36:59 -04005276 case GL_TEXTURE_WRAP_S: texture->setWrapS((GLenum)param); break;
5277 case GL_TEXTURE_WRAP_T: texture->setWrapT((GLenum)param); break;
5278 case GL_TEXTURE_WRAP_R: texture->setWrapR((GLenum)param); break;
5279 case GL_TEXTURE_MIN_FILTER: texture->setMinFilter((GLenum)param); break;
5280 case GL_TEXTURE_MAG_FILTER: texture->setMagFilter((GLenum)param); break;
5281 case GL_TEXTURE_USAGE_ANGLE: texture->setUsage((GLenum)param); break;
5282 case GL_TEXTURE_MAX_ANISOTROPY_EXT: texture->setMaxAnisotropy((float)param, context->getTextureMaxAnisotropy()); break;
5283 case GL_TEXTURE_COMPARE_MODE: texture->setCompareMode((GLenum)param); break;
5284 case GL_TEXTURE_COMPARE_FUNC: texture->setCompareFunc((GLenum)param); break;
shannonwoods@chromium.orgabf14cc2013-05-30 00:20:58 +00005285
5286 case GL_TEXTURE_SWIZZLE_R:
5287 case GL_TEXTURE_SWIZZLE_G:
5288 case GL_TEXTURE_SWIZZLE_B:
5289 case GL_TEXTURE_SWIZZLE_A:
5290 case GL_TEXTURE_BASE_LEVEL:
5291 case GL_TEXTURE_MAX_LEVEL:
Jamie Madill478fdb22013-07-19 16:36:59 -04005292 case GL_TEXTURE_MIN_LOD:
5293 case GL_TEXTURE_MAX_LOD:
shannonwoods@chromium.orgabf14cc2013-05-30 00:20:58 +00005294 UNIMPLEMENTED();
5295 break;
5296
Jamie Madill478fdb22013-07-19 16:36:59 -04005297 default: UNREACHABLE(); break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005298 }
5299 }
5300 }
5301 catch(std::bad_alloc&)
5302 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005303 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005304 }
5305}
5306
5307void __stdcall glTexParameteriv(GLenum target, GLenum pname, const GLint* params)
5308{
5309 glTexParameteri(target, pname, *params);
5310}
5311
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005312void __stdcall glTexStorage2DEXT(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height)
5313{
5314 EVENT("(GLenum target = 0x%X, GLsizei levels = %d, GLenum internalformat = 0x%X, GLsizei width = %d, GLsizei height = %d)",
5315 target, levels, internalformat, width, height);
5316
5317 try
5318 {
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005319 gl::Context *context = gl::getNonLostContext();
5320
5321 if (context)
5322 {
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00005323 if (context->getClientVersion() < 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -04005324 !ValidateES2TexStorageParameters(context, target, levels, internalformat, width, height))
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +00005325 {
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00005326 return;
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +00005327 }
5328
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00005329 if (context->getClientVersion() >= 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -04005330 !ValidateES3TexStorageParameters(context, target, levels, internalformat, width, height, 1))
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +00005331 {
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00005332 return;
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +00005333 }
5334
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00005335 switch (target)
5336 {
5337 case GL_TEXTURE_2D:
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00005338 {
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00005339 gl::Texture2D *texture2d = context->getTexture2D();
5340 texture2d->storage(levels, internalformat, width, height);
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00005341 }
5342 break;
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00005343
5344 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
5345 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
5346 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
5347 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
5348 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
5349 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00005350 {
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00005351 gl::TextureCubeMap *textureCube = context->getTextureCubeMap();
5352 textureCube->storage(levels, internalformat, width);
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00005353 }
5354 break;
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00005355
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00005356 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005357 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00005358 }
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005359 }
5360 }
5361 catch(std::bad_alloc&)
5362 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005363 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005364 }
5365}
5366
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00005367void __stdcall glTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height,
5368 GLenum format, GLenum type, const GLvoid* pixels)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005369{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005370 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00005371 "GLsizei width = %d, GLsizei height = %d, GLenum format = 0x%X, GLenum type = 0x%X, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00005372 "const GLvoid* pixels = 0x%0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005373 target, level, xoffset, yoffset, width, height, format, type, pixels);
5374
5375 try
5376 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005377 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005378
5379 if (context)
5380 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005381 if (context->getClientVersion() < 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -04005382 !ValidateES2TexImageParameters(context, target, level, GL_NONE, false, true,
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005383 0, 0, width, height, 0, format, type, pixels))
daniel@transgaming.com1d2d3c42012-05-31 01:14:15 +00005384 {
5385 return;
5386 }
5387
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005388 if (context->getClientVersion() >= 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -04005389 !ValidateES3TexImageParameters(context, target, level, GL_NONE, false, true,
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005390 0, 0, 0, width, height, 1, 0, format, type))
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005391 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005392 return;
5393 }
5394
5395 switch (target)
5396 {
5397 case GL_TEXTURE_2D:
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005398 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005399 gl::Texture2D *texture = context->getTexture2D();
daniel@transgaming.com343373a2011-11-29 19:42:32 +00005400 texture->subImage(level, xoffset, yoffset, width, height, format, type, context->getUnpackAlignment(), pixels);
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005401 }
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005402 break;
5403
5404 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
5405 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
5406 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
5407 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
5408 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
5409 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005410 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005411 gl::TextureCubeMap *texture = context->getTextureCubeMap();
daniel@transgaming.com343373a2011-11-29 19:42:32 +00005412 texture->subImage(target, level, xoffset, yoffset, width, height, format, type, context->getUnpackAlignment(), pixels);
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005413 }
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005414 break;
5415
5416 default:
5417 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005418 }
5419 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005420 }
5421 catch(std::bad_alloc&)
5422 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005423 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005424 }
5425}
5426
5427void __stdcall glUniform1f(GLint location, GLfloat x)
5428{
5429 glUniform1fv(location, 1, &x);
5430}
5431
5432void __stdcall glUniform1fv(GLint location, GLsizei count, const GLfloat* v)
5433{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005434 EVENT("(GLint location = %d, GLsizei count = %d, const GLfloat* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005435
5436 try
5437 {
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005438 if (count < 0)
5439 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005440 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005441 }
5442
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005443 if (location == -1)
5444 {
5445 return;
5446 }
5447
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005448 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005449
5450 if (context)
5451 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00005452 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005453 if (!programBinary)
5454 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005455 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005456 }
5457
5458 if (!programBinary->setUniform1fv(location, count, v))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005459 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005460 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005461 }
5462 }
5463 }
5464 catch(std::bad_alloc&)
5465 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005466 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005467 }
5468}
5469
5470void __stdcall glUniform1i(GLint location, GLint x)
5471{
5472 glUniform1iv(location, 1, &x);
5473}
5474
5475void __stdcall glUniform1iv(GLint location, GLsizei count, const GLint* v)
5476{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005477 EVENT("(GLint location = %d, GLsizei count = %d, const GLint* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005478
5479 try
5480 {
5481 if (count < 0)
5482 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005483 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005484 }
5485
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005486 if (location == -1)
5487 {
5488 return;
5489 }
5490
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005491 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005492
5493 if (context)
5494 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00005495 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005496 if (!programBinary)
5497 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005498 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005499 }
5500
5501 if (!programBinary->setUniform1iv(location, count, v))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005502 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005503 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005504 }
5505 }
5506 }
5507 catch(std::bad_alloc&)
5508 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005509 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005510 }
5511}
5512
5513void __stdcall glUniform2f(GLint location, GLfloat x, GLfloat y)
5514{
5515 GLfloat xy[2] = {x, y};
5516
5517 glUniform2fv(location, 1, (GLfloat*)&xy);
5518}
5519
5520void __stdcall glUniform2fv(GLint location, GLsizei count, const GLfloat* v)
5521{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005522 EVENT("(GLint location = %d, GLsizei count = %d, const GLfloat* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005523
5524 try
5525 {
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005526 if (count < 0)
5527 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005528 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005529 }
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005530
5531 if (location == -1)
5532 {
5533 return;
5534 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005535
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005536 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005537
5538 if (context)
5539 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00005540 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005541 if (!programBinary)
5542 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005543 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005544 }
5545
5546 if (!programBinary->setUniform2fv(location, count, v))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005547 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005548 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005549 }
5550 }
5551 }
5552 catch(std::bad_alloc&)
5553 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005554 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005555 }
5556}
5557
5558void __stdcall glUniform2i(GLint location, GLint x, GLint y)
5559{
5560 GLint xy[4] = {x, y};
5561
5562 glUniform2iv(location, 1, (GLint*)&xy);
5563}
5564
5565void __stdcall glUniform2iv(GLint location, GLsizei count, const GLint* v)
5566{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005567 EVENT("(GLint location = %d, GLsizei count = %d, const GLint* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005568
5569 try
5570 {
5571 if (count < 0)
5572 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005573 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005574 }
5575
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005576 if (location == -1)
5577 {
5578 return;
5579 }
5580
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005581 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005582
5583 if (context)
5584 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00005585 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005586 if (!programBinary)
5587 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005588 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005589 }
5590
5591 if (!programBinary->setUniform2iv(location, count, v))
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005592 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005593 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005594 }
5595 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005596 }
5597 catch(std::bad_alloc&)
5598 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005599 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005600 }
5601}
5602
5603void __stdcall glUniform3f(GLint location, GLfloat x, GLfloat y, GLfloat z)
5604{
5605 GLfloat xyz[3] = {x, y, z};
5606
5607 glUniform3fv(location, 1, (GLfloat*)&xyz);
5608}
5609
5610void __stdcall glUniform3fv(GLint location, GLsizei count, const GLfloat* v)
5611{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005612 EVENT("(GLint location = %d, GLsizei count = %d, const GLfloat* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005613
5614 try
5615 {
5616 if (count < 0)
5617 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005618 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005619 }
5620
5621 if (location == -1)
5622 {
5623 return;
5624 }
5625
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005626 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005627
5628 if (context)
5629 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00005630 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005631 if (!programBinary)
5632 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005633 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005634 }
5635
5636 if (!programBinary->setUniform3fv(location, count, v))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005637 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005638 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005639 }
5640 }
5641 }
5642 catch(std::bad_alloc&)
5643 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005644 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005645 }
5646}
5647
5648void __stdcall glUniform3i(GLint location, GLint x, GLint y, GLint z)
5649{
5650 GLint xyz[3] = {x, y, z};
5651
5652 glUniform3iv(location, 1, (GLint*)&xyz);
5653}
5654
5655void __stdcall glUniform3iv(GLint location, GLsizei count, const GLint* v)
5656{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005657 EVENT("(GLint location = %d, GLsizei count = %d, const GLint* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005658
5659 try
5660 {
5661 if (count < 0)
5662 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005663 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005664 }
5665
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005666 if (location == -1)
5667 {
5668 return;
5669 }
5670
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005671 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005672
5673 if (context)
5674 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00005675 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005676 if (!programBinary)
5677 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005678 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005679 }
5680
5681 if (!programBinary->setUniform3iv(location, count, v))
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005682 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005683 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005684 }
5685 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005686 }
5687 catch(std::bad_alloc&)
5688 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005689 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005690 }
5691}
5692
5693void __stdcall glUniform4f(GLint location, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
5694{
5695 GLfloat xyzw[4] = {x, y, z, w};
5696
5697 glUniform4fv(location, 1, (GLfloat*)&xyzw);
5698}
5699
5700void __stdcall glUniform4fv(GLint location, GLsizei count, const GLfloat* v)
5701{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005702 EVENT("(GLint location = %d, GLsizei count = %d, const GLfloat* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005703
5704 try
5705 {
5706 if (count < 0)
5707 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005708 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005709 }
5710
5711 if (location == -1)
5712 {
5713 return;
5714 }
5715
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005716 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005717
5718 if (context)
5719 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00005720 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005721 if (!programBinary)
5722 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005723 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005724 }
5725
5726 if (!programBinary->setUniform4fv(location, count, v))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005727 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005728 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005729 }
5730 }
5731 }
5732 catch(std::bad_alloc&)
5733 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005734 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005735 }
5736}
5737
5738void __stdcall glUniform4i(GLint location, GLint x, GLint y, GLint z, GLint w)
5739{
5740 GLint xyzw[4] = {x, y, z, w};
5741
5742 glUniform4iv(location, 1, (GLint*)&xyzw);
5743}
5744
5745void __stdcall glUniform4iv(GLint location, GLsizei count, const GLint* v)
5746{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005747 EVENT("(GLint location = %d, GLsizei count = %d, const GLint* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005748
5749 try
5750 {
5751 if (count < 0)
5752 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005753 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005754 }
5755
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005756 if (location == -1)
5757 {
5758 return;
5759 }
5760
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005761 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005762
5763 if (context)
5764 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00005765 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005766 if (!programBinary)
5767 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005768 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005769 }
5770
5771 if (!programBinary->setUniform4iv(location, count, v))
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005772 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005773 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005774 }
5775 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005776 }
5777 catch(std::bad_alloc&)
5778 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005779 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005780 }
5781}
5782
5783void __stdcall glUniformMatrix2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
5784{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005785 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00005786 location, count, transpose, value);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005787
5788 try
5789 {
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00005790 if (count < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005791 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005792 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005793 }
5794
5795 if (location == -1)
5796 {
5797 return;
5798 }
5799
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005800 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005801
5802 if (context)
5803 {
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00005804 if (transpose != GL_FALSE && context->getClientVersion() < 3)
5805 {
5806 return gl::error(GL_INVALID_VALUE);
5807 }
5808
daniel@transgaming.com62a28462012-07-24 18:33:59 +00005809 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005810 if (!programBinary)
5811 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005812 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005813 }
5814
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00005815 if (!programBinary->setUniformMatrix2fv(location, count, transpose, value))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005816 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005817 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005818 }
5819 }
5820 }
5821 catch(std::bad_alloc&)
5822 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005823 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005824 }
5825}
5826
5827void __stdcall glUniformMatrix3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
5828{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005829 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00005830 location, count, transpose, value);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005831
5832 try
5833 {
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00005834 if (count < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005835 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005836 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005837 }
5838
5839 if (location == -1)
5840 {
5841 return;
5842 }
5843
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005844 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005845
5846 if (context)
5847 {
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00005848 if (transpose != GL_FALSE && context->getClientVersion() < 3)
5849 {
5850 return gl::error(GL_INVALID_VALUE);
5851 }
5852
daniel@transgaming.com62a28462012-07-24 18:33:59 +00005853 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005854 if (!programBinary)
5855 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005856 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005857 }
5858
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00005859 if (!programBinary->setUniformMatrix3fv(location, count, transpose, value))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005860 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005861 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005862 }
5863 }
5864 }
5865 catch(std::bad_alloc&)
5866 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005867 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005868 }
5869}
5870
5871void __stdcall glUniformMatrix4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
5872{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005873 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00005874 location, count, transpose, value);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005875
5876 try
5877 {
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00005878 if (count < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005879 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005880 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005881 }
5882
5883 if (location == -1)
5884 {
5885 return;
5886 }
5887
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005888 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005889
5890 if (context)
5891 {
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00005892 if (transpose != GL_FALSE && context->getClientVersion() < 3)
5893 {
5894 return gl::error(GL_INVALID_VALUE);
5895 }
5896
daniel@transgaming.com62a28462012-07-24 18:33:59 +00005897 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005898 if (!programBinary)
5899 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005900 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005901 }
5902
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00005903 if (!programBinary->setUniformMatrix4fv(location, count, transpose, value))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005904 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005905 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005906 }
5907 }
5908 }
5909 catch(std::bad_alloc&)
5910 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005911 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005912 }
5913}
5914
5915void __stdcall glUseProgram(GLuint program)
5916{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005917 EVENT("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005918
5919 try
5920 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005921 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005922
5923 if (context)
5924 {
5925 gl::Program *programObject = context->getProgram(program);
5926
daniel@transgaming.comc8478202010-04-13 19:53:35 +00005927 if (!programObject && program != 0)
5928 {
5929 if (context->getShader(program))
5930 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005931 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comc8478202010-04-13 19:53:35 +00005932 }
5933 else
5934 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005935 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comc8478202010-04-13 19:53:35 +00005936 }
5937 }
5938
daniel@transgaming.com716056c2012-07-24 18:38:59 +00005939 if (program != 0 && !programObject->isLinked())
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005940 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005941 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005942 }
5943
5944 context->useProgram(program);
5945 }
5946 }
5947 catch(std::bad_alloc&)
5948 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005949 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005950 }
5951}
5952
5953void __stdcall glValidateProgram(GLuint program)
5954{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005955 EVENT("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005956
5957 try
5958 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005959 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00005960
5961 if (context)
5962 {
5963 gl::Program *programObject = context->getProgram(program);
5964
5965 if (!programObject)
5966 {
5967 if (context->getShader(program))
5968 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005969 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00005970 }
5971 else
5972 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005973 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00005974 }
5975 }
5976
apatrick@chromium.org253b8d22012-06-22 19:27:21 +00005977 programObject->validate();
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00005978 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005979 }
5980 catch(std::bad_alloc&)
5981 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005982 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005983 }
5984}
5985
5986void __stdcall glVertexAttrib1f(GLuint index, GLfloat x)
5987{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005988 EVENT("(GLuint index = %d, GLfloat x = %f)", index, x);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005989
5990 try
5991 {
5992 if (index >= gl::MAX_VERTEX_ATTRIBS)
5993 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005994 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005995 }
5996
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005997 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005998
5999 if (context)
6000 {
6001 GLfloat vals[4] = { x, 0, 0, 1 };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00006002 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006003 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006004 }
6005 catch(std::bad_alloc&)
6006 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006007 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006008 }
6009}
6010
6011void __stdcall glVertexAttrib1fv(GLuint index, const GLfloat* values)
6012{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006013 EVENT("(GLuint index = %d, const GLfloat* values = 0x%0.8p)", index, values);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006014
6015 try
6016 {
6017 if (index >= gl::MAX_VERTEX_ATTRIBS)
6018 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006019 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006020 }
6021
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006022 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006023
6024 if (context)
6025 {
6026 GLfloat vals[4] = { values[0], 0, 0, 1 };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00006027 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006028 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006029 }
6030 catch(std::bad_alloc&)
6031 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006032 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006033 }
6034}
6035
6036void __stdcall glVertexAttrib2f(GLuint index, GLfloat x, GLfloat y)
6037{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006038 EVENT("(GLuint index = %d, GLfloat x = %f, GLfloat y = %f)", index, x, y);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006039
6040 try
6041 {
6042 if (index >= gl::MAX_VERTEX_ATTRIBS)
6043 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006044 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006045 }
6046
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006047 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006048
6049 if (context)
6050 {
6051 GLfloat vals[4] = { x, y, 0, 1 };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00006052 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006053 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006054 }
6055 catch(std::bad_alloc&)
6056 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006057 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006058 }
6059}
6060
6061void __stdcall glVertexAttrib2fv(GLuint index, const GLfloat* values)
6062{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006063 EVENT("(GLuint index = %d, const GLfloat* values = 0x%0.8p)", index, values);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006064
6065 try
6066 {
6067 if (index >= gl::MAX_VERTEX_ATTRIBS)
6068 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006069 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006070 }
6071
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006072 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006073
6074 if (context)
6075 {
6076 GLfloat vals[4] = { values[0], values[1], 0, 1 };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00006077 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006078 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006079 }
6080 catch(std::bad_alloc&)
6081 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006082 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006083 }
6084}
6085
6086void __stdcall glVertexAttrib3f(GLuint index, GLfloat x, GLfloat y, GLfloat z)
6087{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006088 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 +00006089
6090 try
6091 {
6092 if (index >= gl::MAX_VERTEX_ATTRIBS)
6093 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006094 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006095 }
6096
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006097 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006098
6099 if (context)
6100 {
6101 GLfloat vals[4] = { x, y, z, 1 };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00006102 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006103 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006104 }
6105 catch(std::bad_alloc&)
6106 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006107 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006108 }
6109}
6110
6111void __stdcall glVertexAttrib3fv(GLuint index, const GLfloat* values)
6112{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006113 EVENT("(GLuint index = %d, const GLfloat* values = 0x%0.8p)", index, values);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006114
6115 try
6116 {
6117 if (index >= gl::MAX_VERTEX_ATTRIBS)
6118 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006119 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006120 }
6121
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006122 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006123
6124 if (context)
6125 {
6126 GLfloat vals[4] = { values[0], values[1], values[2], 1 };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00006127 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006128 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006129 }
6130 catch(std::bad_alloc&)
6131 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006132 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006133 }
6134}
6135
6136void __stdcall glVertexAttrib4f(GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
6137{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006138 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 +00006139
6140 try
6141 {
6142 if (index >= gl::MAX_VERTEX_ATTRIBS)
6143 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006144 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006145 }
6146
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006147 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006148
6149 if (context)
6150 {
6151 GLfloat vals[4] = { x, y, z, w };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00006152 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006153 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006154 }
6155 catch(std::bad_alloc&)
6156 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006157 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006158 }
6159}
6160
6161void __stdcall glVertexAttrib4fv(GLuint index, const GLfloat* values)
6162{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006163 EVENT("(GLuint index = %d, const GLfloat* values = 0x%0.8p)", index, values);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006164
6165 try
6166 {
6167 if (index >= gl::MAX_VERTEX_ATTRIBS)
6168 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006169 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006170 }
6171
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006172 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006173
6174 if (context)
6175 {
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00006176 context->setVertexAttribf(index, values);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006177 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006178 }
6179 catch(std::bad_alloc&)
6180 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006181 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006182 }
6183}
6184
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00006185void __stdcall glVertexAttribDivisorANGLE(GLuint index, GLuint divisor)
6186{
6187 EVENT("(GLuint index = %d, GLuint divisor = %d)", index, divisor);
6188
6189 try
6190 {
6191 if (index >= gl::MAX_VERTEX_ATTRIBS)
6192 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006193 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00006194 }
6195
6196 gl::Context *context = gl::getNonLostContext();
6197
6198 if (context)
6199 {
6200 context->setVertexAttribDivisor(index, divisor);
6201 }
6202 }
6203 catch(std::bad_alloc&)
6204 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006205 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00006206 }
6207}
6208
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00006209void __stdcall glVertexAttribPointer(GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid* ptr)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006210{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006211 EVENT("(GLuint index = %d, GLint size = %d, GLenum type = 0x%X, "
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006212 "GLboolean normalized = %u, GLsizei stride = %d, const GLvoid* ptr = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00006213 index, size, type, normalized, stride, ptr);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006214
6215 try
6216 {
6217 if (index >= gl::MAX_VERTEX_ATTRIBS)
6218 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006219 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006220 }
6221
6222 if (size < 1 || size > 4)
6223 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006224 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006225 }
6226
shannon.woods%transgaming.com@gtempaccount.com1a4e09a2013-04-13 03:33:30 +00006227 gl::Context *context = gl::getNonLostContext();
6228
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006229 switch (type)
6230 {
6231 case GL_BYTE:
6232 case GL_UNSIGNED_BYTE:
6233 case GL_SHORT:
6234 case GL_UNSIGNED_SHORT:
6235 case GL_FIXED:
6236 case GL_FLOAT:
6237 break;
shannon.woods%transgaming.com@gtempaccount.com1a4e09a2013-04-13 03:33:30 +00006238 case GL_HALF_FLOAT:
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00006239 case GL_INT:
6240 case GL_UNSIGNED_INT:
shannon.woods%transgaming.com@gtempaccount.com1ab57be2013-04-13 03:38:39 +00006241 case GL_INT_2_10_10_10_REV:
6242 case GL_UNSIGNED_INT_2_10_10_10_REV:
shannon.woods%transgaming.com@gtempaccount.com1a4e09a2013-04-13 03:33:30 +00006243 if (context && context->getClientVersion() < 3)
6244 {
6245 return gl::error(GL_INVALID_ENUM);
6246 }
6247 else
6248 {
6249 break;
6250 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006251 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006252 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006253 }
6254
6255 if (stride < 0)
6256 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006257 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006258 }
6259
shannon.woods%transgaming.com@gtempaccount.com1ab57be2013-04-13 03:38:39 +00006260 if ((type == GL_INT_2_10_10_10_REV || type == GL_UNSIGNED_INT_2_10_10_10_REV) && size != 4)
6261 {
6262 return gl::error(GL_INVALID_OPERATION);
6263 }
6264
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006265 if (context)
6266 {
Jamie Madilld8db8662013-07-02 11:57:04 -04006267 // [OpenGL ES 3.0.2] Section 2.8 page 24:
6268 // An INVALID_OPERATION error is generated when a non-zero vertex array object
6269 // is bound, zero is bound to the ARRAY_BUFFER buffer object binding point,
6270 // and the pointer argument is not NULL.
6271 if (context->getVertexArrayHandle() != 0 && context->getArrayBufferHandle() == 0 && ptr != NULL)
6272 {
6273 return gl::error(GL_INVALID_OPERATION);
6274 }
6275
shannon.woods%transgaming.com@gtempaccount.com8de4e6a2013-04-13 03:37:44 +00006276 context->setVertexAttribState(index, context->getArrayBuffer(), size, type,
6277 normalized == GL_TRUE, false, stride, ptr);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006278 }
6279 }
6280 catch(std::bad_alloc&)
6281 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006282 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006283 }
6284}
6285
6286void __stdcall glViewport(GLint x, GLint y, GLsizei width, GLsizei height)
6287{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006288 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 +00006289
6290 try
6291 {
6292 if (width < 0 || height < 0)
6293 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006294 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006295 }
6296
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006297 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006298
6299 if (context)
6300 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00006301 context->setViewportParams(x, y, width, height);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006302 }
6303 }
6304 catch(std::bad_alloc&)
6305 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006306 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006307 }
6308}
6309
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006310// OpenGL ES 3.0 functions
6311
6312void __stdcall glReadBuffer(GLenum mode)
6313{
6314 EVENT("(GLenum mode = 0x%X)", mode);
6315
6316 try
6317 {
6318 gl::Context *context = gl::getNonLostContext();
6319
6320 if (context)
6321 {
6322 if (context->getClientVersion() < 3)
6323 {
6324 return gl::error(GL_INVALID_OPERATION);
6325 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006326
Jamie Madill54133512013-06-21 09:33:07 -04006327 // glReadBuffer
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006328 UNIMPLEMENTED();
6329 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006330 }
6331 catch(std::bad_alloc&)
6332 {
6333 return gl::error(GL_OUT_OF_MEMORY);
6334 }
6335}
6336
6337void __stdcall glDrawRangeElements(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid* indices)
6338{
6339 EVENT("(GLenum mode = 0x%X, GLuint start = %u, GLuint end = %u, GLsizei count = %d, GLenum type = 0x%X, "
6340 "const GLvoid* indices = 0x%0.8p)", mode, start, end, count, type, indices);
6341
6342 try
6343 {
6344 gl::Context *context = gl::getNonLostContext();
6345
6346 if (context)
6347 {
6348 if (context->getClientVersion() < 3)
6349 {
6350 return gl::error(GL_INVALID_OPERATION);
6351 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006352
Jamie Madill54133512013-06-21 09:33:07 -04006353 // glDrawRangeElements
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006354 UNIMPLEMENTED();
6355 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006356 }
6357 catch(std::bad_alloc&)
6358 {
6359 return gl::error(GL_OUT_OF_MEMORY);
6360 }
6361}
6362
6363void __stdcall glTexImage3D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid* pixels)
6364{
6365 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint internalformat = %d, GLsizei width = %d, "
6366 "GLsizei height = %d, GLsizei depth = %d, GLint border = %d, GLenum format = 0x%X, "
6367 "GLenum type = 0x%X, const GLvoid* pixels = 0x%0.8p)",
6368 target, level, internalformat, width, height, depth, border, format, type, pixels);
6369
6370 try
6371 {
6372 gl::Context *context = gl::getNonLostContext();
6373
6374 if (context)
6375 {
6376 if (context->getClientVersion() < 3)
6377 {
6378 return gl::error(GL_INVALID_OPERATION);
6379 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006380
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006381 // validateES3TexImageFormat sets the error code if there is an error
Geoff Lang34dbb6f2013-08-05 15:05:47 -04006382 if (!ValidateES3TexImageParameters(context, target, level, internalformat, false, false,
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006383 0, 0, 0, width, height, depth, border, format, type))
6384 {
6385 return;
6386 }
6387
6388 switch(target)
6389 {
6390 case GL_TEXTURE_3D:
6391 {
6392 gl::Texture3D *texture = context->getTexture3D();
shannonwoods@chromium.org4ad58e02013-05-30 00:08:11 +00006393 texture->setImage(level, width, height, depth, internalformat, format, type, context->getUnpackAlignment(), pixels);
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006394 }
6395 break;
6396
6397 case GL_TEXTURE_2D_ARRAY:
shannon.woods%transgaming.com@gtempaccount.com14e8f592013-04-13 03:46:21 +00006398 {
6399 gl::Texture2DArray *texture = context->getTexture2DArray();
shannonwoods@chromium.org4ad58e02013-05-30 00:08:11 +00006400 texture->setImage(level, width, height, depth, internalformat, format, type, context->getUnpackAlignment(), pixels);
shannon.woods%transgaming.com@gtempaccount.com14e8f592013-04-13 03:46:21 +00006401 }
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006402 break;
6403
6404 default:
6405 return gl::error(GL_INVALID_ENUM);
6406 }
6407 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006408 }
6409 catch(std::bad_alloc&)
6410 {
6411 return gl::error(GL_OUT_OF_MEMORY);
6412 }
6413}
6414
6415void __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)
6416{
6417 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
6418 "GLint zoffset = %d, GLsizei width = %d, GLsizei height = %d, GLsizei depth = %d, "
6419 "GLenum format = 0x%X, GLenum type = 0x%X, const GLvoid* pixels = 0x%0.8p)",
6420 target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels);
6421
6422 try
6423 {
6424 gl::Context *context = gl::getNonLostContext();
6425
6426 if (context)
6427 {
6428 if (context->getClientVersion() < 3)
6429 {
6430 return gl::error(GL_INVALID_OPERATION);
6431 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006432
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006433 if (!pixels)
6434 {
6435 return gl::error(GL_INVALID_VALUE);
6436 }
6437
6438 // validateES3TexImageFormat sets the error code if there is an error
Geoff Lang34dbb6f2013-08-05 15:05:47 -04006439 if (!ValidateES3TexImageParameters(context, target, level, GL_NONE, false, true,
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006440 xoffset, yoffset, zoffset, width, height, depth, 0,
6441 format, type))
6442 {
6443 return;
6444 }
6445
6446 switch(target)
6447 {
6448 case GL_TEXTURE_3D:
6449 {
6450 gl::Texture3D *texture = context->getTexture3D();
6451 texture->subImage(level, xoffset, yoffset, zoffset, width, height, depth, format, type, context->getUnpackAlignment(), pixels);
6452 }
6453 break;
6454
6455 case GL_TEXTURE_2D_ARRAY:
shannon.woods%transgaming.com@gtempaccount.com14e8f592013-04-13 03:46:21 +00006456 {
6457 gl::Texture2DArray *texture = context->getTexture2DArray();
6458 texture->subImage(level, xoffset, yoffset, zoffset, width, height, depth, format, type, context->getUnpackAlignment(), pixels);
6459 }
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006460 break;
6461
6462 default:
6463 return gl::error(GL_INVALID_ENUM);
6464 }
6465 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006466 }
6467 catch(std::bad_alloc&)
6468 {
6469 return gl::error(GL_OUT_OF_MEMORY);
6470 }
6471}
6472
6473void __stdcall glCopyTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height)
6474{
6475 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
6476 "GLint zoffset = %d, GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d)",
6477 target, level, xoffset, yoffset, zoffset, x, y, width, height);
6478
6479 try
6480 {
6481 gl::Context *context = gl::getNonLostContext();
6482
6483 if (context)
6484 {
6485 if (context->getClientVersion() < 3)
6486 {
6487 return gl::error(GL_INVALID_OPERATION);
6488 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006489
Geoff Lang34dbb6f2013-08-05 15:05:47 -04006490 if (!ValidateES3CopyTexImageParameters(context, target, level, GL_NONE, false, xoffset, yoffset, zoffset,
shannonwoods@chromium.org6cf2b0e2013-05-30 00:13:36 +00006491 x, y, width, height, 0))
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006492 {
6493 return;
6494 }
6495
6496 gl::Framebuffer *framebuffer = context->getReadFramebuffer();
6497 gl::Texture *texture = NULL;
6498 switch (target)
6499 {
6500 case GL_TEXTURE_3D:
6501 texture = context->getTexture3D();
6502 break;
6503
6504 case GL_TEXTURE_2D_ARRAY:
shannon.woods%transgaming.com@gtempaccount.com14e8f592013-04-13 03:46:21 +00006505 texture = context->getTexture2DArray();
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006506 break;
6507
6508 default:
6509 return gl::error(GL_INVALID_ENUM);
6510 }
6511
6512 texture->copySubImage(target, level, xoffset, yoffset, zoffset, x, y, width, height, framebuffer);
6513 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006514 }
6515 catch(std::bad_alloc&)
6516 {
6517 return gl::error(GL_OUT_OF_MEMORY);
6518 }
6519}
6520
6521void __stdcall glCompressedTexImage3D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid* data)
6522{
6523 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint internalformat = %d, GLsizei width = %d, "
6524 "GLsizei height = %d, GLsizei depth = %d, GLint border = %d, GLsizei imageSize = %d, "
6525 "const GLvoid* data = 0x%0.8p)",
6526 target, level, internalformat, width, height, depth, border, imageSize, data);
6527
6528 try
6529 {
6530 gl::Context *context = gl::getNonLostContext();
6531
6532 if (context)
6533 {
6534 if (context->getClientVersion() < 3)
6535 {
6536 return gl::error(GL_INVALID_OPERATION);
6537 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006538
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +00006539 if (imageSize < 0 || imageSize != (GLsizei)gl::GetBlockSize(internalformat, GL_UNSIGNED_BYTE, context->getClientVersion(), width, height))
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006540 {
6541 return gl::error(GL_INVALID_VALUE);
6542 }
6543
6544 // validateES3TexImageFormat sets the error code if there is an error
Geoff Lang34dbb6f2013-08-05 15:05:47 -04006545 if (!ValidateES3TexImageParameters(context, target, level, internalformat, true, false,
shannonwoods@chromium.org6cf2b0e2013-05-30 00:13:36 +00006546 0, 0, 0, width, height, depth, border, GL_NONE, GL_NONE))
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006547 {
6548 return;
6549 }
6550
6551 switch(target)
6552 {
6553 case GL_TEXTURE_3D:
6554 {
6555 gl::Texture3D *texture = context->getTexture3D();
6556 texture->setCompressedImage(level, internalformat, width, height, depth, imageSize, data);
6557 }
6558 break;
6559
6560 case GL_TEXTURE_2D_ARRAY:
shannon.woods%transgaming.com@gtempaccount.com14e8f592013-04-13 03:46:21 +00006561 {
6562 gl::Texture2DArray *texture = context->getTexture2DArray();
6563 texture->setCompressedImage(level, internalformat, width, height, depth, imageSize, data);
6564 }
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006565 break;
6566
6567 default:
6568 return gl::error(GL_INVALID_ENUM);
6569 }
6570 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006571 }
6572 catch(std::bad_alloc&)
6573 {
6574 return gl::error(GL_OUT_OF_MEMORY);
6575 }
6576}
6577
6578void __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)
6579{
6580 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
6581 "GLint zoffset = %d, GLsizei width = %d, GLsizei height = %d, GLsizei depth = %d, "
6582 "GLenum format = 0x%X, GLsizei imageSize = %d, const GLvoid* data = 0x%0.8p)",
6583 target, level, xoffset, yoffset, zoffset, width, height, depth, format, imageSize, data);
6584
6585 try
6586 {
6587 gl::Context *context = gl::getNonLostContext();
6588
6589 if (context)
6590 {
6591 if (context->getClientVersion() < 3)
6592 {
6593 return gl::error(GL_INVALID_OPERATION);
6594 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006595
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +00006596 if (imageSize < 0 || imageSize != (GLsizei)gl::GetBlockSize(format, GL_UNSIGNED_BYTE, context->getClientVersion(), width, height))
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006597 {
6598 return gl::error(GL_INVALID_VALUE);
6599 }
6600
6601 if (!data)
6602 {
6603 return gl::error(GL_INVALID_VALUE);
6604 }
6605
6606 // validateES3TexImageFormat sets the error code if there is an error
Geoff Lang34dbb6f2013-08-05 15:05:47 -04006607 if (!ValidateES3TexImageParameters(context, target, level, GL_NONE, true, true,
shannonwoods@chromium.org6cf2b0e2013-05-30 00:13:36 +00006608 0, 0, 0, width, height, depth, 0, GL_NONE, GL_NONE))
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006609 {
6610 return;
6611 }
6612
6613 switch(target)
6614 {
6615 case GL_TEXTURE_3D:
6616 {
6617 gl::Texture3D *texture = context->getTexture3D();
6618 texture->subImageCompressed(level, xoffset, yoffset, zoffset, width, height, depth,
6619 format, imageSize, data);
6620 }
6621 break;
6622
6623 case GL_TEXTURE_2D_ARRAY:
shannon.woods%transgaming.com@gtempaccount.com14e8f592013-04-13 03:46:21 +00006624 {
6625 gl::Texture2DArray *texture = context->getTexture2DArray();
6626 texture->subImageCompressed(level, xoffset, yoffset, zoffset, width, height, depth,
6627 format, imageSize, data);
6628 }
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006629 break;
6630
6631 default:
6632 return gl::error(GL_INVALID_ENUM);
6633 }
6634 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006635 }
6636 catch(std::bad_alloc&)
6637 {
6638 return gl::error(GL_OUT_OF_MEMORY);
6639 }
6640}
6641
6642void __stdcall glGenQueries(GLsizei n, GLuint* ids)
6643{
6644 EVENT("(GLsizei n = %d, GLuint* ids = 0x%0.8p)", n, ids);
6645
6646 try
6647 {
6648 gl::Context *context = gl::getNonLostContext();
6649
6650 if (context)
6651 {
6652 if (context->getClientVersion() < 3)
6653 {
6654 return gl::error(GL_INVALID_OPERATION);
6655 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006656
Jamie Madill3641b4b2013-07-26 12:54:59 -04006657 glGenQueriesEXT(n, ids);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006658 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006659 }
6660 catch(std::bad_alloc&)
6661 {
6662 return gl::error(GL_OUT_OF_MEMORY);
6663 }
6664}
6665
6666void __stdcall glDeleteQueries(GLsizei n, const GLuint* ids)
6667{
6668 EVENT("(GLsizei n = %d, GLuint* ids = 0x%0.8p)", n, ids);
6669
6670 try
6671 {
6672 gl::Context *context = gl::getNonLostContext();
6673
6674 if (context)
6675 {
6676 if (context->getClientVersion() < 3)
6677 {
6678 return gl::error(GL_INVALID_OPERATION);
6679 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006680
Jamie Madill3641b4b2013-07-26 12:54:59 -04006681 glDeleteQueriesEXT(n, ids);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006682 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006683 }
6684 catch(std::bad_alloc&)
6685 {
6686 return gl::error(GL_OUT_OF_MEMORY);
6687 }
6688}
6689
6690GLboolean __stdcall glIsQuery(GLuint id)
6691{
6692 EVENT("(GLuint id = %u)", id);
6693
6694 try
6695 {
6696 gl::Context *context = gl::getNonLostContext();
6697
6698 if (context)
6699 {
6700 if (context->getClientVersion() < 3)
6701 {
6702 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
6703 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006704
Jamie Madill3641b4b2013-07-26 12:54:59 -04006705 // TODO: XFB queries
6706 return glIsQueryEXT(id);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006707 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006708 }
6709 catch(std::bad_alloc&)
6710 {
6711 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
6712 }
6713
6714 return GL_FALSE;
6715}
6716
6717void __stdcall glBeginQuery(GLenum target, GLuint id)
6718{
6719 EVENT("(GLenum target = 0x%X, GLuint id = %u)", target, id);
6720
6721 try
6722 {
6723 gl::Context *context = gl::getNonLostContext();
6724
6725 if (context)
6726 {
6727 if (context->getClientVersion() < 3)
6728 {
6729 return gl::error(GL_INVALID_OPERATION);
6730 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006731
Jamie Madill3641b4b2013-07-26 12:54:59 -04006732 switch (target)
6733 {
6734 case GL_ANY_SAMPLES_PASSED:
6735 case GL_ANY_SAMPLES_PASSED_CONSERVATIVE:
6736 case GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN:
6737 break;
6738 default:
6739 return gl::error(GL_INVALID_ENUM);
6740 }
6741
6742 if (id == 0)
6743 {
6744 return gl::error(GL_INVALID_OPERATION);
6745 }
6746
6747 if (target == GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN)
6748 {
6749 // TODO: XFB queries
6750 UNIMPLEMENTED();
6751 }
6752 else
6753 {
6754 context->beginQuery(target, id);
6755 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006756 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006757 }
6758 catch(std::bad_alloc&)
6759 {
6760 return gl::error(GL_OUT_OF_MEMORY);
6761 }
6762}
6763
6764void __stdcall glEndQuery(GLenum target)
6765{
6766 EVENT("(GLenum target = 0x%X)", target);
6767
6768 try
6769 {
6770 gl::Context *context = gl::getNonLostContext();
6771
6772 if (context)
6773 {
6774 if (context->getClientVersion() < 3)
6775 {
6776 return gl::error(GL_INVALID_OPERATION);
6777 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006778
Jamie Madill3641b4b2013-07-26 12:54:59 -04006779 if (target == GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN)
6780 {
6781 // TODO: XFB queries
6782 UNIMPLEMENTED();
6783 }
6784 else
6785 {
6786 glEndQueryEXT(target);
6787 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006788 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006789 }
6790 catch(std::bad_alloc&)
6791 {
6792 return gl::error(GL_OUT_OF_MEMORY);
6793 }
6794}
6795
6796void __stdcall glGetQueryiv(GLenum target, GLenum pname, GLint* params)
6797{
6798 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLint* params = 0x%0.8p)", target, pname, params);
6799
6800 try
6801 {
6802 gl::Context *context = gl::getNonLostContext();
6803
6804 if (context)
6805 {
6806 if (context->getClientVersion() < 3)
6807 {
6808 return gl::error(GL_INVALID_OPERATION);
6809 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006810
Jamie Madill3641b4b2013-07-26 12:54:59 -04006811 if (target == GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN)
6812 {
6813 // TODO: XFB queries
6814 UNIMPLEMENTED();
6815 }
6816 else
6817 {
6818 glGetQueryivEXT(target, pname, params);
6819 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006820 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006821 }
6822 catch(std::bad_alloc&)
6823 {
6824 return gl::error(GL_OUT_OF_MEMORY);
6825 }
6826}
6827
6828void __stdcall glGetQueryObjectuiv(GLuint id, GLenum pname, GLuint* params)
6829{
6830 EVENT("(GLuint id = %u, GLenum pname = 0x%X, GLint* params = 0x%0.8p)", id, pname, params);
6831
6832 try
6833 {
6834 gl::Context *context = gl::getNonLostContext();
6835
6836 if (context)
6837 {
6838 if (context->getClientVersion() < 3)
6839 {
6840 return gl::error(GL_INVALID_OPERATION);
6841 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006842
Jamie Madill3641b4b2013-07-26 12:54:59 -04006843 // TODO: XFB queries
6844 glGetQueryObjectuivEXT(id, pname, params);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006845 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006846 }
6847 catch(std::bad_alloc&)
6848 {
6849 return gl::error(GL_OUT_OF_MEMORY);
6850 }
6851}
6852
6853GLboolean __stdcall glUnmapBuffer(GLenum target)
6854{
6855 EVENT("(GLenum target = 0x%X)", target);
6856
6857 try
6858 {
6859 gl::Context *context = gl::getNonLostContext();
6860
6861 if (context)
6862 {
6863 if (context->getClientVersion() < 3)
6864 {
6865 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
6866 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006867
Jamie Madill54133512013-06-21 09:33:07 -04006868 // glUnmapBuffer
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006869 UNIMPLEMENTED();
6870 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006871 }
6872 catch(std::bad_alloc&)
6873 {
6874 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
6875 }
6876
6877 return GL_FALSE;
6878}
6879
6880void __stdcall glGetBufferPointerv(GLenum target, GLenum pname, GLvoid** params)
6881{
6882 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLvoid** params = 0x%0.8p)", target, pname, params);
6883
6884 try
6885 {
6886 gl::Context *context = gl::getNonLostContext();
6887
6888 if (context)
6889 {
6890 if (context->getClientVersion() < 3)
6891 {
6892 return gl::error(GL_INVALID_OPERATION);
6893 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006894
Jamie Madill54133512013-06-21 09:33:07 -04006895 // glGetBufferPointerv
shannonwoods@chromium.org2d2190a2013-05-30 00:17:35 +00006896 UNIMPLEMENTED();
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006897 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006898 }
6899 catch(std::bad_alloc&)
6900 {
6901 return gl::error(GL_OUT_OF_MEMORY);
6902 }
6903}
6904
6905void __stdcall glDrawBuffers(GLsizei n, const GLenum* bufs)
6906{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006907 try
6908 {
6909 gl::Context *context = gl::getNonLostContext();
6910
6911 if (context)
6912 {
6913 if (context->getClientVersion() < 3)
6914 {
6915 return gl::error(GL_INVALID_OPERATION);
6916 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006917
shannon.woods%transgaming.com@gtempaccount.com7948c5f2013-04-13 03:38:58 +00006918 glDrawBuffersEXT(n, bufs);
6919 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006920 }
6921 catch(std::bad_alloc&)
6922 {
6923 return gl::error(GL_OUT_OF_MEMORY);
6924 }
6925}
6926
6927void __stdcall glUniformMatrix2x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
6928{
6929 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
6930 location, count, transpose, value);
6931
6932 try
6933 {
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006934 if (count < 0)
6935 {
6936 return gl::error(GL_INVALID_VALUE);
6937 }
6938
6939 if (location == -1)
6940 {
6941 return;
6942 }
6943
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006944 gl::Context *context = gl::getNonLostContext();
6945
6946 if (context)
6947 {
6948 if (context->getClientVersion() < 3)
6949 {
6950 return gl::error(GL_INVALID_OPERATION);
6951 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006952
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006953 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
6954 if (!programBinary)
6955 {
6956 return gl::error(GL_INVALID_OPERATION);
6957 }
6958
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00006959 if (!programBinary->setUniformMatrix2x3fv(location, count, transpose, value))
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006960 {
6961 return gl::error(GL_INVALID_OPERATION);
6962 }
6963 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006964 }
6965 catch(std::bad_alloc&)
6966 {
6967 return gl::error(GL_OUT_OF_MEMORY);
6968 }
6969}
6970
6971void __stdcall glUniformMatrix3x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
6972{
6973 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
6974 location, count, transpose, value);
6975
6976 try
6977 {
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006978 if (count < 0)
6979 {
6980 return gl::error(GL_INVALID_VALUE);
6981 }
6982
6983 if (location == -1)
6984 {
6985 return;
6986 }
6987
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006988 gl::Context *context = gl::getNonLostContext();
6989
6990 if (context)
6991 {
6992 if (context->getClientVersion() < 3)
6993 {
6994 return gl::error(GL_INVALID_OPERATION);
6995 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006996
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006997 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
6998 if (!programBinary)
6999 {
7000 return gl::error(GL_INVALID_OPERATION);
7001 }
7002
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00007003 if (!programBinary->setUniformMatrix3x2fv(location, count, transpose, value))
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00007004 {
7005 return gl::error(GL_INVALID_OPERATION);
7006 }
7007 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007008 }
7009 catch(std::bad_alloc&)
7010 {
7011 return gl::error(GL_OUT_OF_MEMORY);
7012 }
7013}
7014
7015void __stdcall glUniformMatrix2x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
7016{
7017 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
7018 location, count, transpose, value);
7019
7020 try
7021 {
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00007022 if (count < 0)
7023 {
7024 return gl::error(GL_INVALID_VALUE);
7025 }
7026
7027 if (location == -1)
7028 {
7029 return;
7030 }
7031
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007032 gl::Context *context = gl::getNonLostContext();
7033
7034 if (context)
7035 {
7036 if (context->getClientVersion() < 3)
7037 {
7038 return gl::error(GL_INVALID_OPERATION);
7039 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007040
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00007041 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
7042 if (!programBinary)
7043 {
7044 return gl::error(GL_INVALID_OPERATION);
7045 }
7046
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00007047 if (!programBinary->setUniformMatrix2x4fv(location, count, transpose, value))
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00007048 {
7049 return gl::error(GL_INVALID_OPERATION);
7050 }
7051 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007052 }
7053 catch(std::bad_alloc&)
7054 {
7055 return gl::error(GL_OUT_OF_MEMORY);
7056 }
7057}
7058
7059void __stdcall glUniformMatrix4x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
7060{
7061 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
7062 location, count, transpose, value);
7063
7064 try
7065 {
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00007066 if (count < 0)
7067 {
7068 return gl::error(GL_INVALID_VALUE);
7069 }
7070
7071 if (location == -1)
7072 {
7073 return;
7074 }
7075
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007076 gl::Context *context = gl::getNonLostContext();
7077
7078 if (context)
7079 {
7080 if (context->getClientVersion() < 3)
7081 {
7082 return gl::error(GL_INVALID_OPERATION);
7083 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007084
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00007085 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
7086 if (!programBinary)
7087 {
7088 return gl::error(GL_INVALID_OPERATION);
7089 }
7090
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00007091 if (!programBinary->setUniformMatrix4x2fv(location, count, transpose, value))
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00007092 {
7093 return gl::error(GL_INVALID_OPERATION);
7094 }
7095 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007096 }
7097 catch(std::bad_alloc&)
7098 {
7099 return gl::error(GL_OUT_OF_MEMORY);
7100 }
7101}
7102
7103void __stdcall glUniformMatrix3x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
7104{
7105 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
7106 location, count, transpose, value);
7107
7108 try
7109 {
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00007110 if (count < 0)
7111 {
7112 return gl::error(GL_INVALID_VALUE);
7113 }
7114
7115 if (location == -1)
7116 {
7117 return;
7118 }
7119
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007120 gl::Context *context = gl::getNonLostContext();
7121
7122 if (context)
7123 {
7124 if (context->getClientVersion() < 3)
7125 {
7126 return gl::error(GL_INVALID_OPERATION);
7127 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007128
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00007129 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
7130 if (!programBinary)
7131 {
7132 return gl::error(GL_INVALID_OPERATION);
7133 }
7134
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00007135 if (!programBinary->setUniformMatrix3x4fv(location, count, transpose, value))
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00007136 {
7137 return gl::error(GL_INVALID_OPERATION);
7138 }
7139 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007140 }
7141 catch(std::bad_alloc&)
7142 {
7143 return gl::error(GL_OUT_OF_MEMORY);
7144 }
7145}
7146
7147void __stdcall glUniformMatrix4x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
7148{
7149 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
7150 location, count, transpose, value);
7151
7152 try
7153 {
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00007154 if (count < 0)
7155 {
7156 return gl::error(GL_INVALID_VALUE);
7157 }
7158
7159 if (location == -1)
7160 {
7161 return;
7162 }
7163
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007164 gl::Context *context = gl::getNonLostContext();
7165
7166 if (context)
7167 {
7168 if (context->getClientVersion() < 3)
7169 {
7170 return gl::error(GL_INVALID_OPERATION);
7171 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007172
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00007173 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
7174 if (!programBinary)
7175 {
7176 return gl::error(GL_INVALID_OPERATION);
7177 }
7178
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00007179 if (!programBinary->setUniformMatrix4x3fv(location, count, transpose, value))
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00007180 {
7181 return gl::error(GL_INVALID_OPERATION);
7182 }
7183 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007184 }
7185 catch(std::bad_alloc&)
7186 {
7187 return gl::error(GL_OUT_OF_MEMORY);
7188 }
7189}
7190
7191void __stdcall glBlitFramebuffer(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter)
7192{
7193 EVENT("(GLint srcX0 = %d, GLint srcY0 = %d, GLint srcX1 = %d, GLint srcY1 = %d, GLint dstX0 = %d, "
7194 "GLint dstY0 = %d, GLint dstX1 = %d, GLint dstY1 = %d, GLbitfield mask = 0x%X, GLenum filter = 0x%X)",
7195 srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter);
7196
7197 try
7198 {
7199 gl::Context *context = gl::getNonLostContext();
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007200 if (context)
7201 {
7202 if (context->getClientVersion() < 3)
7203 {
7204 return gl::error(GL_INVALID_OPERATION);
7205 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007206
Geoff Lang34dbb6f2013-08-05 15:05:47 -04007207 if (!ValidateBlitFramebufferParameters(context, srcX0, srcY0, srcX1, srcY1,
Geoff Lang758d5b22013-06-11 11:42:50 -04007208 dstX0, dstY0, dstX1, dstY1, mask, filter,
7209 false))
7210 {
7211 return;
7212 }
7213
7214 context->blitFramebuffer(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1,
7215 mask, filter);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007216 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007217 }
7218 catch(std::bad_alloc&)
7219 {
7220 return gl::error(GL_OUT_OF_MEMORY);
7221 }
7222}
7223
7224void __stdcall glRenderbufferStorageMultisample(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height)
7225{
7226 EVENT("(GLenum target = 0x%X, GLsizei samples = %d, GLenum internalformat = 0x%X, GLsizei width = %d, GLsizei height = %d)",
7227 target, samples, internalformat, width, height);
7228
7229 try
7230 {
7231 gl::Context *context = gl::getNonLostContext();
7232
7233 if (context)
7234 {
7235 if (context->getClientVersion() < 3)
7236 {
7237 return gl::error(GL_INVALID_OPERATION);
7238 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007239
Geoff Lang34dbb6f2013-08-05 15:05:47 -04007240 if (!ValidateRenderbufferStorageParameters(context, target, samples, internalformat,
Geoff Lang2e1dcd52013-05-29 10:34:08 -04007241 width, height, false))
7242 {
7243 return;
7244 }
7245
7246 context->setRenderbufferStorage(width, height, internalformat, samples);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007247 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007248 }
7249 catch(std::bad_alloc&)
7250 {
7251 return gl::error(GL_OUT_OF_MEMORY);
7252 }
7253}
7254
7255void __stdcall glFramebufferTextureLayer(GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer)
7256{
7257 EVENT("(GLenum target = 0x%X, GLenum attachment = 0x%X, GLuint texture = %u, GLint level = %d, GLint layer = %d)",
7258 target, attachment, texture, level, layer);
7259
7260 try
7261 {
7262 gl::Context *context = gl::getNonLostContext();
7263
7264 if (context)
7265 {
7266 if (context->getClientVersion() < 3)
7267 {
7268 return gl::error(GL_INVALID_OPERATION);
7269 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007270
Geoff Lang34dbb6f2013-08-05 15:05:47 -04007271 if (!ValidateES3FramebufferTextureParameters(context, target, attachment, GL_NONE, texture, level, layer, true))
Geoff Lang3ed0c482013-07-25 17:03:18 -04007272 {
7273 return;
7274 }
7275
7276 gl::Framebuffer *framebuffer = NULL;
7277 if (target == GL_READ_FRAMEBUFFER)
7278 {
7279 framebuffer = context->getReadFramebuffer();
7280 }
7281 else
7282 {
7283 framebuffer = context->getDrawFramebuffer();
7284 }
7285
7286 gl::Texture *textureObject = context->getTexture(texture);
7287 GLenum textarget = textureObject ? textureObject->getTarget() : GL_NONE;
7288
7289 if (attachment >= GL_COLOR_ATTACHMENT0_EXT && attachment <= GL_COLOR_ATTACHMENT15_EXT)
7290 {
7291 const unsigned int colorAttachment = (attachment - GL_COLOR_ATTACHMENT0_EXT);
7292 framebuffer->setColorbuffer(colorAttachment, textarget, texture, level, layer);
7293 }
7294 else
7295 {
7296 switch (attachment)
7297 {
7298 case GL_DEPTH_ATTACHMENT: framebuffer->setDepthbuffer(textarget, texture, level, layer); break;
7299 case GL_STENCIL_ATTACHMENT: framebuffer->setStencilbuffer(textarget, texture, level, layer); break;
7300 case GL_DEPTH_STENCIL_ATTACHMENT: framebuffer->setDepthStencilBuffer(textarget, texture, level, layer); break;
7301 }
7302 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007303 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007304 }
7305 catch(std::bad_alloc&)
7306 {
7307 return gl::error(GL_OUT_OF_MEMORY);
7308 }
7309}
7310
7311GLvoid* __stdcall glMapBufferRange(GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access)
7312{
7313 EVENT("(GLenum target = 0x%X, GLintptr offset = %d, GLsizeiptr length = %d, GLbitfield access = 0x%X)",
7314 target, offset, length, access);
7315
7316 try
7317 {
7318 gl::Context *context = gl::getNonLostContext();
7319
7320 if (context)
7321 {
7322 if (context->getClientVersion() < 3)
7323 {
7324 return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLvoid*>(NULL));
7325 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007326
Jamie Madill54133512013-06-21 09:33:07 -04007327 // glMapBufferRange
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007328 UNIMPLEMENTED();
7329 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007330 }
7331 catch(std::bad_alloc&)
7332 {
7333 return gl::error(GL_OUT_OF_MEMORY, reinterpret_cast<GLvoid*>(NULL));
7334 }
7335
7336 return NULL;
7337}
7338
7339void __stdcall glFlushMappedBufferRange(GLenum target, GLintptr offset, GLsizeiptr length)
7340{
7341 EVENT("(GLenum target = 0x%X, GLintptr offset = %d, GLsizeiptr length = %d)", target, offset, length);
7342
7343 try
7344 {
7345 gl::Context *context = gl::getNonLostContext();
7346
7347 if (context)
7348 {
7349 if (context->getClientVersion() < 3)
7350 {
7351 return gl::error(GL_INVALID_OPERATION);
7352 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007353
Jamie Madill54133512013-06-21 09:33:07 -04007354 // glFlushMappedBufferRange
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007355 UNIMPLEMENTED();
7356 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007357 }
7358 catch(std::bad_alloc&)
7359 {
7360 return gl::error(GL_OUT_OF_MEMORY);
7361 }
7362}
7363
7364void __stdcall glBindVertexArray(GLuint array)
7365{
7366 EVENT("(GLuint array = %u)", array);
7367
7368 try
7369 {
7370 gl::Context *context = gl::getNonLostContext();
7371
7372 if (context)
7373 {
7374 if (context->getClientVersion() < 3)
7375 {
7376 return gl::error(GL_INVALID_OPERATION);
7377 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007378
Jamie Madilld1028542013-07-02 11:57:04 -04007379 gl::VertexArray *vao = context->getVertexArray(array);
7380
7381 if (!vao)
7382 {
7383 // The default VAO should always exist
7384 ASSERT(array != 0);
7385 return gl::error(GL_INVALID_OPERATION);
7386 }
7387
7388 context->bindVertexArray(array);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007389 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007390 }
7391 catch(std::bad_alloc&)
7392 {
7393 return gl::error(GL_OUT_OF_MEMORY);
7394 }
7395}
7396
7397void __stdcall glDeleteVertexArrays(GLsizei n, const GLuint* arrays)
7398{
7399 EVENT("(GLsizei n = %d, const GLuint* arrays = 0x%0.8p)", n, arrays);
7400
7401 try
7402 {
7403 gl::Context *context = gl::getNonLostContext();
7404
7405 if (context)
7406 {
7407 if (context->getClientVersion() < 3)
7408 {
7409 return gl::error(GL_INVALID_OPERATION);
7410 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007411
Jamie Madilld1028542013-07-02 11:57:04 -04007412 if (n < 0)
7413 {
7414 return gl::error(GL_INVALID_VALUE);
7415 }
7416
7417 for (int arrayIndex = 0; arrayIndex < n; arrayIndex++)
7418 {
7419 if (arrays[arrayIndex] != 0)
7420 {
7421 context->deleteVertexArray(arrays[arrayIndex]);
7422 }
7423 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007424 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007425 }
7426 catch(std::bad_alloc&)
7427 {
7428 return gl::error(GL_OUT_OF_MEMORY);
7429 }
7430}
7431
7432void __stdcall glGenVertexArrays(GLsizei n, GLuint* arrays)
7433{
7434 EVENT("(GLsizei n = %d, GLuint* arrays = 0x%0.8p)", n, arrays);
7435
7436 try
7437 {
7438 gl::Context *context = gl::getNonLostContext();
7439
7440 if (context)
7441 {
7442 if (context->getClientVersion() < 3)
7443 {
7444 return gl::error(GL_INVALID_OPERATION);
7445 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007446
Jamie Madilld1028542013-07-02 11:57:04 -04007447 if (n < 0)
7448 {
7449 return gl::error(GL_INVALID_VALUE);
7450 }
7451
7452 for (int arrayIndex = 0; arrayIndex < n; arrayIndex++)
7453 {
7454 arrays[arrayIndex] = context->createVertexArray();
7455 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007456 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007457 }
7458 catch(std::bad_alloc&)
7459 {
7460 return gl::error(GL_OUT_OF_MEMORY);
7461 }
7462}
7463
7464GLboolean __stdcall glIsVertexArray(GLuint array)
7465{
7466 EVENT("(GLuint array = %u)", array);
7467
7468 try
7469 {
7470 gl::Context *context = gl::getNonLostContext();
7471
7472 if (context)
7473 {
7474 if (context->getClientVersion() < 3)
7475 {
7476 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
7477 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007478
Jamie Madilld1028542013-07-02 11:57:04 -04007479 if (array == 0)
7480 {
7481 return GL_FALSE;
7482 }
7483
7484 gl::VertexArray *vao = context->getVertexArray(array);
7485
7486 return (vao != NULL ? GL_TRUE : GL_FALSE);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007487 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007488 }
7489 catch(std::bad_alloc&)
7490 {
7491 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
7492 }
7493
7494 return GL_FALSE;
7495}
7496
7497void __stdcall glGetIntegeri_v(GLenum target, GLuint index, GLint* data)
7498{
7499 EVENT("(GLenum target = 0x%X, GLuint index = %u, GLint* data = 0x%0.8p)",
7500 target, index, data);
7501
7502 try
7503 {
7504 gl::Context *context = gl::getNonLostContext();
7505
7506 if (context)
7507 {
7508 if (context->getClientVersion() < 3)
7509 {
7510 return gl::error(GL_INVALID_OPERATION);
7511 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007512
Shannon Woods15934d52013-08-19 14:28:49 -04007513 switch (target)
7514 {
7515 case GL_TRANSFORM_FEEDBACK_BUFFER_START:
7516 case GL_TRANSFORM_FEEDBACK_BUFFER_SIZE:
7517 case GL_TRANSFORM_FEEDBACK_BUFFER_BINDING:
7518 if (index >= context->getMaxTransformFeedbackBufferBindings())
7519 return gl::error(GL_INVALID_VALUE);
7520 break;
7521 case GL_UNIFORM_BUFFER_START:
7522 case GL_UNIFORM_BUFFER_SIZE:
7523 case GL_UNIFORM_BUFFER_BINDING:
7524 if (index >= context->getMaximumCombinedUniformBufferBindings())
7525 return gl::error(GL_INVALID_VALUE);
7526 break;
7527 default:
7528 return gl::error(GL_INVALID_ENUM);
7529 }
7530
7531 if (!(context->getIndexedIntegerv(target, index, data)))
7532 {
7533 GLenum nativeType;
7534 unsigned int numParams = 0;
7535 if (!context->getIndexedQueryParameterInfo(target, &nativeType, &numParams))
7536 return gl::error(GL_INVALID_ENUM);
7537
7538 if (numParams == 0)
7539 return; // it is known that pname is valid, but there are no parameters to return
7540
7541 if (nativeType == GL_INT_64_ANGLEX)
7542 {
7543 GLint64 minIntValue = static_cast<GLint64>(std::numeric_limits<int>::min());
7544 GLint64 maxIntValue = static_cast<GLint64>(std::numeric_limits<int>::max());
7545 GLint64 *int64Params = new GLint64[numParams];
7546
7547 context->getIndexedInteger64v(target, index, int64Params);
7548
7549 for (unsigned int i = 0; i < numParams; ++i)
7550 {
7551 GLint64 clampedValue = std::max(std::min(int64Params[i], maxIntValue), minIntValue);
7552 data[i] = static_cast<GLint>(clampedValue);
7553 }
7554
7555 delete [] int64Params;
7556 }
7557 else
7558 {
7559 UNREACHABLE();
7560 }
7561 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007562 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007563 }
7564 catch(std::bad_alloc&)
7565 {
7566 return gl::error(GL_OUT_OF_MEMORY);
7567 }
7568}
7569
7570void __stdcall glBeginTransformFeedback(GLenum primitiveMode)
7571{
7572 EVENT("(GLenum primitiveMode = 0x%X)", primitiveMode);
7573
7574 try
7575 {
7576 gl::Context *context = gl::getNonLostContext();
7577
7578 if (context)
7579 {
7580 if (context->getClientVersion() < 3)
7581 {
7582 return gl::error(GL_INVALID_OPERATION);
7583 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007584
Jamie Madill54133512013-06-21 09:33:07 -04007585 // glBeginTransformFeedback
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007586 UNIMPLEMENTED();
7587 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007588 }
7589 catch(std::bad_alloc&)
7590 {
7591 return gl::error(GL_OUT_OF_MEMORY);
7592 }
7593}
7594
7595void __stdcall glEndTransformFeedback(void)
7596{
7597 EVENT("(void)");
7598
7599 try
7600 {
7601 gl::Context *context = gl::getNonLostContext();
7602
7603 if (context)
7604 {
7605 if (context->getClientVersion() < 3)
7606 {
7607 return gl::error(GL_INVALID_OPERATION);
7608 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007609
Jamie Madill54133512013-06-21 09:33:07 -04007610 // glEndTransformFeedback
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007611 UNIMPLEMENTED();
7612 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007613 }
7614 catch(std::bad_alloc&)
7615 {
7616 return gl::error(GL_OUT_OF_MEMORY);
7617 }
7618}
7619
7620void __stdcall glBindBufferRange(GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size)
7621{
7622 EVENT("(GLenum target = 0x%X, GLuint index = %u, GLuint buffer = %u, GLintptr offset = %d, GLsizeiptr size = %d)",
7623 target, index, buffer, offset, size);
7624
7625 try
7626 {
7627 gl::Context *context = gl::getNonLostContext();
7628
7629 if (context)
7630 {
7631 if (context->getClientVersion() < 3)
7632 {
7633 return gl::error(GL_INVALID_OPERATION);
7634 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007635
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007636 switch (target)
7637 {
7638 case GL_TRANSFORM_FEEDBACK_BUFFER:
shannonwoods@chromium.orgd11158f2013-05-30 00:06:19 +00007639 if (index >= context->getMaxTransformFeedbackBufferBindings())
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007640 {
7641 return gl::error(GL_INVALID_VALUE);
7642 }
7643 break;
7644
7645 case GL_UNIFORM_BUFFER:
7646 if (index >= context->getMaximumCombinedUniformBufferBindings())
7647 {
7648 return gl::error(GL_INVALID_VALUE);
7649 }
7650 break;
7651
7652 default:
7653 return gl::error(GL_INVALID_ENUM);
7654 }
7655
shannonwoods@chromium.orge6e00792013-05-30 00:06:07 +00007656 if (buffer != 0 && size <= 0)
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007657 {
7658 return gl::error(GL_INVALID_VALUE);
7659 }
7660
7661 switch (target)
7662 {
7663 case GL_TRANSFORM_FEEDBACK_BUFFER:
shannonwoods@chromium.orga26aeaf2013-05-30 00:06:13 +00007664
7665 // size and offset must be a multiple of 4
7666 if (buffer != 0 && ((offset % 4) != 0 || (size % 4) != 0))
7667 {
7668 return gl::error(GL_INVALID_VALUE);
7669 }
7670
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +00007671 context->bindIndexedTransformFeedbackBuffer(buffer, index, offset, size);
7672 context->bindGenericTransformFeedbackBuffer(buffer);
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007673 break;
7674
7675 case GL_UNIFORM_BUFFER:
shannonwoods@chromium.org97c3d502013-05-30 00:04:34 +00007676
7677 // it is an error to bind an offset not a multiple of the alignment
7678 if (buffer != 0 && (offset % context->getUniformBufferOffsetAlignment()) != 0)
7679 {
7680 return gl::error(GL_INVALID_VALUE);
7681 }
7682
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +00007683 context->bindIndexedUniformBuffer(buffer, index, offset, size);
7684 context->bindGenericUniformBuffer(buffer);
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007685 break;
7686
7687 default:
7688 UNREACHABLE();
7689 }
7690 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007691 }
7692 catch(std::bad_alloc&)
7693 {
7694 return gl::error(GL_OUT_OF_MEMORY);
7695 }
7696}
7697
7698void __stdcall glBindBufferBase(GLenum target, GLuint index, GLuint buffer)
7699{
7700 EVENT("(GLenum target = 0x%X, GLuint index = %u, GLuint buffer = %u)",
7701 target, index, buffer);
7702
7703 try
7704 {
7705 gl::Context *context = gl::getNonLostContext();
7706
7707 if (context)
7708 {
7709 if (context->getClientVersion() < 3)
7710 {
7711 return gl::error(GL_INVALID_OPERATION);
7712 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007713
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007714 switch (target)
7715 {
7716 case GL_TRANSFORM_FEEDBACK_BUFFER:
shannonwoods@chromium.orgd11158f2013-05-30 00:06:19 +00007717 if (index >= context->getMaxTransformFeedbackBufferBindings())
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007718 {
7719 return gl::error(GL_INVALID_VALUE);
7720 }
7721 break;
7722
7723 case GL_UNIFORM_BUFFER:
shannonwoods@chromium.orgd11158f2013-05-30 00:06:19 +00007724 if (index >= context->getMaximumCombinedUniformBufferBindings())
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007725 {
7726 return gl::error(GL_INVALID_VALUE);
7727 }
7728 break;
7729
7730 default:
7731 return gl::error(GL_INVALID_ENUM);
7732 }
7733
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007734 switch (target)
7735 {
7736 case GL_TRANSFORM_FEEDBACK_BUFFER:
shannonwoods@chromium.org3eeca1e2013-05-30 00:04:28 +00007737 context->bindIndexedTransformFeedbackBuffer(buffer, index, 0, 0);
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +00007738 context->bindGenericTransformFeedbackBuffer(buffer);
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007739 break;
7740
7741 case GL_UNIFORM_BUFFER:
shannonwoods@chromium.org3eeca1e2013-05-30 00:04:28 +00007742 context->bindIndexedUniformBuffer(buffer, index, 0, 0);
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +00007743 context->bindGenericUniformBuffer(buffer);
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007744 break;
7745
7746 default:
7747 UNREACHABLE();
7748 }
7749 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007750 }
7751 catch(std::bad_alloc&)
7752 {
7753 return gl::error(GL_OUT_OF_MEMORY);
7754 }
7755}
7756
7757void __stdcall glTransformFeedbackVaryings(GLuint program, GLsizei count, const GLchar* const* varyings, GLenum bufferMode)
7758{
7759 EVENT("(GLuint program = %u, GLsizei count = %d, const GLchar* const* varyings = 0x%0.8p, GLenum bufferMode = 0x%X)",
7760 program, count, varyings, bufferMode);
7761
7762 try
7763 {
7764 gl::Context *context = gl::getNonLostContext();
7765
7766 if (context)
7767 {
7768 if (context->getClientVersion() < 3)
7769 {
7770 return gl::error(GL_INVALID_OPERATION);
7771 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007772
Jamie Madill54133512013-06-21 09:33:07 -04007773 // glTransformFeedbackVaryings
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007774 UNIMPLEMENTED();
7775 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007776 }
7777 catch(std::bad_alloc&)
7778 {
7779 return gl::error(GL_OUT_OF_MEMORY);
7780 }
7781}
7782
7783void __stdcall glGetTransformFeedbackVarying(GLuint program, GLuint index, GLsizei bufSize, GLsizei* length, GLsizei* size, GLenum* type, GLchar* name)
7784{
7785 EVENT("(GLuint program = %u, GLuint index = %u, GLsizei bufSize = %d, GLsizei* length = 0x%0.8p, "
7786 "GLsizei* size = 0x%0.8p, GLenum* type = 0x%0.8p, GLchar* name = 0x%0.8p)",
7787 program, index, bufSize, length, size, type, name);
7788
7789 try
7790 {
7791 gl::Context *context = gl::getNonLostContext();
7792
7793 if (context)
7794 {
7795 if (context->getClientVersion() < 3)
7796 {
7797 return gl::error(GL_INVALID_OPERATION);
7798 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007799
Jamie Madill54133512013-06-21 09:33:07 -04007800 // glGetTransformFeedbackVarying
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007801 UNIMPLEMENTED();
7802 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007803 }
7804 catch(std::bad_alloc&)
7805 {
7806 return gl::error(GL_OUT_OF_MEMORY);
7807 }
7808}
7809
7810void __stdcall glVertexAttribIPointer(GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid* pointer)
7811{
7812 EVENT("(GLuint index = %u, GLint size = %d, GLenum type = 0x%X, GLsizei stride = %d, const GLvoid* pointer = 0x%0.8p)",
7813 index, size, type, stride, pointer);
7814
7815 try
7816 {
7817 gl::Context *context = gl::getNonLostContext();
7818
7819 if (context)
7820 {
7821 if (context->getClientVersion() < 3)
7822 {
7823 return gl::error(GL_INVALID_OPERATION);
7824 }
7825 }
7826
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007827 if (index >= gl::MAX_VERTEX_ATTRIBS)
7828 {
7829 return gl::error(GL_INVALID_VALUE);
7830 }
7831
7832 if (size < 1 || size > 4)
7833 {
7834 return gl::error(GL_INVALID_VALUE);
7835 }
7836
7837 switch (type)
7838 {
7839 case GL_BYTE:
7840 case GL_UNSIGNED_BYTE:
7841 case GL_SHORT:
7842 case GL_UNSIGNED_SHORT:
7843 case GL_INT:
7844 case GL_UNSIGNED_INT:
shannon.woods%transgaming.com@gtempaccount.com1ab57be2013-04-13 03:38:39 +00007845 case GL_INT_2_10_10_10_REV:
7846 case GL_UNSIGNED_INT_2_10_10_10_REV:
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007847 break;
7848 default:
7849 return gl::error(GL_INVALID_ENUM);
7850 }
7851
7852 if (stride < 0)
7853 {
7854 return gl::error(GL_INVALID_VALUE);
7855 }
7856
shannon.woods%transgaming.com@gtempaccount.com1ab57be2013-04-13 03:38:39 +00007857 if ((type == GL_INT_2_10_10_10_REV || type == GL_UNSIGNED_INT_2_10_10_10_REV) && size != 4)
7858 {
7859 return gl::error(GL_INVALID_OPERATION);
7860 }
7861
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007862 if (context)
7863 {
Jamie Madilld8db8662013-07-02 11:57:04 -04007864 // [OpenGL ES 3.0.2] Section 2.8 page 24:
7865 // An INVALID_OPERATION error is generated when a non-zero vertex array object
7866 // is bound, zero is bound to the ARRAY_BUFFER buffer object binding point,
7867 // and the pointer argument is not NULL.
7868 if (context->getVertexArrayHandle() != 0 && context->getArrayBufferHandle() == 0 && pointer != NULL)
7869 {
7870 return gl::error(GL_INVALID_OPERATION);
7871 }
7872
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007873 context->setVertexAttribState(index, context->getArrayBuffer(), size, type, false, true,
7874 stride, pointer);
7875 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007876 }
7877 catch(std::bad_alloc&)
7878 {
7879 return gl::error(GL_OUT_OF_MEMORY);
7880 }
7881}
7882
7883void __stdcall glGetVertexAttribIiv(GLuint index, GLenum pname, GLint* params)
7884{
7885 EVENT("(GLuint index = %u, GLenum pname = 0x%X, GLint* params = 0x%0.8p)",
7886 index, pname, params);
7887
7888 try
7889 {
7890 gl::Context *context = gl::getNonLostContext();
7891
7892 if (context)
7893 {
7894 if (context->getClientVersion() < 3)
7895 {
7896 return gl::error(GL_INVALID_OPERATION);
7897 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007898
Jamie Madilla7d05862013-07-02 11:57:06 -04007899 if (index >= gl::MAX_VERTEX_ATTRIBS)
7900 {
7901 return gl::error(GL_INVALID_VALUE);
7902 }
7903
7904 const gl::VertexAttribute &attribState = context->getVertexAttribState(index);
7905
Geoff Lang34dbb6f2013-08-05 15:05:47 -04007906 if (!gl::ValidateGetVertexAttribParameters(pname, context->getClientVersion()))
Jamie Madilla7d05862013-07-02 11:57:06 -04007907 {
7908 return;
7909 }
7910
7911 if (pname == GL_CURRENT_VERTEX_ATTRIB)
7912 {
7913 const gl::VertexAttribCurrentValueData &currentValueData = context->getVertexAttribCurrentValue(index);
7914 for (int i = 0; i < 4; ++i)
7915 {
7916 params[i] = currentValueData.IntValues[i];
7917 }
7918 }
7919 else
7920 {
7921 *params = attribState.querySingleParameter<GLint>(pname);
7922 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007923 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007924 }
7925 catch(std::bad_alloc&)
7926 {
7927 return gl::error(GL_OUT_OF_MEMORY);
7928 }
7929}
7930
7931void __stdcall glGetVertexAttribIuiv(GLuint index, GLenum pname, GLuint* params)
7932{
7933 EVENT("(GLuint index = %u, GLenum pname = 0x%X, GLuint* params = 0x%0.8p)",
7934 index, pname, params);
7935
7936 try
7937 {
7938 gl::Context *context = gl::getNonLostContext();
7939
7940 if (context)
7941 {
7942 if (context->getClientVersion() < 3)
7943 {
7944 return gl::error(GL_INVALID_OPERATION);
7945 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007946
Jamie Madilla7d05862013-07-02 11:57:06 -04007947 if (index >= gl::MAX_VERTEX_ATTRIBS)
7948 {
7949 return gl::error(GL_INVALID_VALUE);
7950 }
7951
7952 const gl::VertexAttribute &attribState = context->getVertexAttribState(index);
7953
Geoff Lang34dbb6f2013-08-05 15:05:47 -04007954 if (!gl::ValidateGetVertexAttribParameters(pname, context->getClientVersion()))
Jamie Madilla7d05862013-07-02 11:57:06 -04007955 {
7956 return;
7957 }
7958
7959 if (pname == GL_CURRENT_VERTEX_ATTRIB)
7960 {
7961 const gl::VertexAttribCurrentValueData &currentValueData = context->getVertexAttribCurrentValue(index);
7962 for (int i = 0; i < 4; ++i)
7963 {
7964 params[i] = currentValueData.UnsignedIntValues[i];
7965 }
7966 }
7967 else
7968 {
7969 *params = attribState.querySingleParameter<GLuint>(pname);
7970 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007971 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007972 }
7973 catch(std::bad_alloc&)
7974 {
7975 return gl::error(GL_OUT_OF_MEMORY);
7976 }
7977}
7978
7979void __stdcall glVertexAttribI4i(GLuint index, GLint x, GLint y, GLint z, GLint w)
7980{
7981 EVENT("(GLuint index = %u, GLint x = %d, GLint y = %d, GLint z = %d, GLint w = %d)",
7982 index, x, y, z, w);
7983
7984 try
7985 {
7986 gl::Context *context = gl::getNonLostContext();
7987
7988 if (context)
7989 {
7990 if (context->getClientVersion() < 3)
7991 {
7992 return gl::error(GL_INVALID_OPERATION);
7993 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007994
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007995 if (index >= gl::MAX_VERTEX_ATTRIBS)
7996 {
7997 return gl::error(GL_INVALID_VALUE);
7998 }
7999
8000 GLint vals[4] = { x, y, z, w };
8001 context->setVertexAttribi(index, vals);
8002 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008003 }
8004 catch(std::bad_alloc&)
8005 {
8006 return gl::error(GL_OUT_OF_MEMORY);
8007 }
8008}
8009
8010void __stdcall glVertexAttribI4ui(GLuint index, GLuint x, GLuint y, GLuint z, GLuint w)
8011{
8012 EVENT("(GLuint index = %u, GLuint x = %u, GLuint y = %u, GLuint z = %u, GLuint w = %u)",
8013 index, x, y, z, w);
8014
8015 try
8016 {
8017 gl::Context *context = gl::getNonLostContext();
8018
8019 if (context)
8020 {
8021 if (context->getClientVersion() < 3)
8022 {
8023 return gl::error(GL_INVALID_OPERATION);
8024 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008025
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00008026 if (index >= gl::MAX_VERTEX_ATTRIBS)
8027 {
8028 return gl::error(GL_INVALID_VALUE);
8029 }
8030
8031 GLuint vals[4] = { x, y, z, w };
8032 context->setVertexAttribu(index, vals);
8033 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008034 }
8035 catch(std::bad_alloc&)
8036 {
8037 return gl::error(GL_OUT_OF_MEMORY);
8038 }
8039}
8040
8041void __stdcall glVertexAttribI4iv(GLuint index, const GLint* v)
8042{
8043 EVENT("(GLuint index = %u, const GLint* v = 0x%0.8p)", index, v);
8044
8045 try
8046 {
8047 gl::Context *context = gl::getNonLostContext();
8048
8049 if (context)
8050 {
8051 if (context->getClientVersion() < 3)
8052 {
8053 return gl::error(GL_INVALID_OPERATION);
8054 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008055
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00008056 if (index >= gl::MAX_VERTEX_ATTRIBS)
8057 {
8058 return gl::error(GL_INVALID_VALUE);
8059 }
8060
8061 context->setVertexAttribi(index, v);
8062 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008063 }
8064 catch(std::bad_alloc&)
8065 {
8066 return gl::error(GL_OUT_OF_MEMORY);
8067 }
8068}
8069
8070void __stdcall glVertexAttribI4uiv(GLuint index, const GLuint* v)
8071{
8072 EVENT("(GLuint index = %u, const GLuint* v = 0x%0.8p)", index, v);
8073
8074 try
8075 {
8076 gl::Context *context = gl::getNonLostContext();
8077
8078 if (context)
8079 {
8080 if (context->getClientVersion() < 3)
8081 {
8082 return gl::error(GL_INVALID_OPERATION);
8083 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008084
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00008085 if (index >= gl::MAX_VERTEX_ATTRIBS)
8086 {
8087 return gl::error(GL_INVALID_VALUE);
8088 }
8089
8090 context->setVertexAttribu(index, v);
8091 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008092 }
8093 catch(std::bad_alloc&)
8094 {
8095 return gl::error(GL_OUT_OF_MEMORY);
8096 }
8097}
8098
8099void __stdcall glGetUniformuiv(GLuint program, GLint location, GLuint* params)
8100{
8101 EVENT("(GLuint program = %u, GLint location = %d, GLuint* params = 0x%0.8p)",
8102 program, location, params);
8103
8104 try
8105 {
8106 gl::Context *context = gl::getNonLostContext();
8107
8108 if (context)
8109 {
8110 if (context->getClientVersion() < 3)
8111 {
8112 return gl::error(GL_INVALID_OPERATION);
8113 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008114
shannon.woods%transgaming.com@gtempaccount.come2290122013-04-13 03:41:07 +00008115 if (program == 0)
8116 {
8117 return gl::error(GL_INVALID_VALUE);
8118 }
8119
8120 gl::Program *programObject = context->getProgram(program);
8121
8122 if (!programObject || !programObject->isLinked())
8123 {
8124 return gl::error(GL_INVALID_OPERATION);
8125 }
8126
8127 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
8128 if (!programBinary)
8129 {
8130 return gl::error(GL_INVALID_OPERATION);
8131 }
8132
8133 if (!programBinary->getUniformuiv(location, NULL, params))
8134 {
8135 return gl::error(GL_INVALID_OPERATION);
8136 }
8137 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008138 }
8139 catch(std::bad_alloc&)
8140 {
8141 return gl::error(GL_OUT_OF_MEMORY);
8142 }
8143}
8144
8145GLint __stdcall glGetFragDataLocation(GLuint program, const GLchar *name)
8146{
8147 EVENT("(GLuint program = %u, const GLchar *name = 0x%0.8p)",
8148 program, name);
8149
8150 try
8151 {
8152 gl::Context *context = gl::getNonLostContext();
8153
8154 if (context)
8155 {
8156 if (context->getClientVersion() < 3)
8157 {
Jamie Madilld1e78c92013-06-20 11:55:50 -04008158 return gl::error(GL_INVALID_OPERATION, -1);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008159 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008160
Jamie Madilld1e78c92013-06-20 11:55:50 -04008161 if (program == 0)
8162 {
8163 return gl::error(GL_INVALID_VALUE, -1);
8164 }
8165
8166 gl::Program *programObject = context->getProgram(program);
8167
8168 if (!programObject || !programObject->isLinked())
8169 {
8170 return gl::error(GL_INVALID_OPERATION, -1);
8171 }
8172
8173 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
8174 if (!programBinary)
8175 {
8176 return gl::error(GL_INVALID_OPERATION, -1);
8177 }
8178
8179 return programBinary->getFragDataLocation(name);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008180 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008181 }
8182 catch(std::bad_alloc&)
8183 {
8184 return gl::error(GL_OUT_OF_MEMORY, 0);
8185 }
8186
8187 return 0;
8188}
8189
8190void __stdcall glUniform1ui(GLint location, GLuint v0)
8191{
shannon.woods%transgaming.com@gtempaccount.com8431b9c2013-04-13 03:40:17 +00008192 glUniform1uiv(location, 1, &v0);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008193}
8194
8195void __stdcall glUniform2ui(GLint location, GLuint v0, GLuint v1)
8196{
shannon.woods%transgaming.com@gtempaccount.com8431b9c2013-04-13 03:40:17 +00008197 const GLuint xy[] = { v0, v1 };
8198 glUniform2uiv(location, 1, xy);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008199}
8200
8201void __stdcall glUniform3ui(GLint location, GLuint v0, GLuint v1, GLuint v2)
8202{
shannon.woods%transgaming.com@gtempaccount.com8431b9c2013-04-13 03:40:17 +00008203 const GLuint xyz[] = { v0, v1, v2 };
8204 glUniform3uiv(location, 1, xyz);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008205}
8206
8207void __stdcall glUniform4ui(GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3)
8208{
shannon.woods%transgaming.com@gtempaccount.com8431b9c2013-04-13 03:40:17 +00008209 const GLuint xyzw[] = { v0, v1, v2, v3 };
8210 glUniform4uiv(location, 1, xyzw);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008211}
8212
8213void __stdcall glUniform1uiv(GLint location, GLsizei count, const GLuint* value)
8214{
8215 EVENT("(GLint location = %d, GLsizei count = %d, const GLuint* value = 0x%0.8p)",
8216 location, count, value);
8217
8218 try
8219 {
8220 gl::Context *context = gl::getNonLostContext();
8221
8222 if (context)
8223 {
8224 if (context->getClientVersion() < 3)
8225 {
8226 return gl::error(GL_INVALID_OPERATION);
8227 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008228
shannon.woods%transgaming.com@gtempaccount.com50ea4ab2013-04-13 03:40:36 +00008229 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
8230 if (!programBinary)
8231 {
8232 return gl::error(GL_INVALID_OPERATION);
8233 }
8234
8235 if (!programBinary->setUniform1uiv(location, count, value))
8236 {
8237 return gl::error(GL_INVALID_OPERATION);
8238 }
8239 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008240 }
8241 catch(std::bad_alloc&)
8242 {
8243 return gl::error(GL_OUT_OF_MEMORY);
8244 }
8245}
8246
8247void __stdcall glUniform2uiv(GLint location, GLsizei count, const GLuint* value)
8248{
8249 EVENT("(GLint location = %d, GLsizei count = %d, const GLuint* value = 0x%0.8p)",
8250 location, count, value);
8251
8252 try
8253 {
8254 gl::Context *context = gl::getNonLostContext();
8255
8256 if (context)
8257 {
8258 if (context->getClientVersion() < 3)
8259 {
8260 return gl::error(GL_INVALID_OPERATION);
8261 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008262
shannon.woods%transgaming.com@gtempaccount.com50ea4ab2013-04-13 03:40:36 +00008263 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
8264 if (!programBinary)
8265 {
8266 return gl::error(GL_INVALID_OPERATION);
8267 }
8268
8269 if (!programBinary->setUniform2uiv(location, count, value))
8270 {
8271 return gl::error(GL_INVALID_OPERATION);
8272 }
8273 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008274 }
8275 catch(std::bad_alloc&)
8276 {
8277 return gl::error(GL_OUT_OF_MEMORY);
8278 }
8279}
8280
8281void __stdcall glUniform3uiv(GLint location, GLsizei count, const GLuint* value)
8282{
8283 EVENT("(GLint location = %d, GLsizei count = %d, const GLuint* value)",
8284 location, count, value);
8285
8286 try
8287 {
8288 gl::Context *context = gl::getNonLostContext();
8289
8290 if (context)
8291 {
8292 if (context->getClientVersion() < 3)
8293 {
8294 return gl::error(GL_INVALID_OPERATION);
8295 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008296
shannon.woods%transgaming.com@gtempaccount.com50ea4ab2013-04-13 03:40:36 +00008297 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
8298 if (!programBinary)
8299 {
8300 return gl::error(GL_INVALID_OPERATION);
8301 }
8302
8303 if (!programBinary->setUniform3uiv(location, count, value))
8304 {
8305 return gl::error(GL_INVALID_OPERATION);
8306 }
8307 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008308 }
8309 catch(std::bad_alloc&)
8310 {
8311 return gl::error(GL_OUT_OF_MEMORY);
8312 }
8313}
8314
8315void __stdcall glUniform4uiv(GLint location, GLsizei count, const GLuint* value)
8316{
8317 EVENT("(GLint location = %d, GLsizei count = %d, const GLuint* value = 0x%0.8p)",
8318 location, count, value);
8319
8320 try
8321 {
8322 gl::Context *context = gl::getNonLostContext();
8323
8324 if (context)
8325 {
8326 if (context->getClientVersion() < 3)
8327 {
8328 return gl::error(GL_INVALID_OPERATION);
8329 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008330
shannon.woods%transgaming.com@gtempaccount.com50ea4ab2013-04-13 03:40:36 +00008331 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
8332 if (!programBinary)
8333 {
8334 return gl::error(GL_INVALID_OPERATION);
8335 }
8336
8337 if (!programBinary->setUniform4uiv(location, count, value))
8338 {
8339 return gl::error(GL_INVALID_OPERATION);
8340 }
8341 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008342 }
8343 catch(std::bad_alloc&)
8344 {
8345 return gl::error(GL_OUT_OF_MEMORY);
8346 }
8347}
8348
8349void __stdcall glClearBufferiv(GLenum buffer, GLint drawbuffer, const GLint* value)
8350{
8351 EVENT("(GLenum buffer = 0x%X, GLint drawbuffer = %d, const GLint* value = 0x%0.8p)",
8352 buffer, drawbuffer, value);
8353
8354 try
8355 {
8356 gl::Context *context = gl::getNonLostContext();
8357
8358 if (context)
8359 {
8360 if (context->getClientVersion() < 3)
8361 {
8362 return gl::error(GL_INVALID_OPERATION);
8363 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008364
Jamie Madill54133512013-06-21 09:33:07 -04008365 // glClearBufferiv
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008366 UNIMPLEMENTED();
8367 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008368 }
8369 catch(std::bad_alloc&)
8370 {
8371 return gl::error(GL_OUT_OF_MEMORY);
8372 }
8373}
8374
8375void __stdcall glClearBufferuiv(GLenum buffer, GLint drawbuffer, const GLuint* value)
8376{
8377 EVENT("(GLenum buffer = 0x%X, GLint drawbuffer = %d, const GLuint* value = 0x%0.8p)",
8378 buffer, drawbuffer, value);
8379
8380 try
8381 {
8382 gl::Context *context = gl::getNonLostContext();
8383
8384 if (context)
8385 {
8386 if (context->getClientVersion() < 3)
8387 {
8388 return gl::error(GL_INVALID_OPERATION);
8389 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008390
Jamie Madill54133512013-06-21 09:33:07 -04008391 // glClearBufferuiv
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008392 UNIMPLEMENTED();
8393 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008394 }
8395 catch(std::bad_alloc&)
8396 {
8397 return gl::error(GL_OUT_OF_MEMORY);
8398 }
8399}
8400
8401void __stdcall glClearBufferfv(GLenum buffer, GLint drawbuffer, const GLfloat* value)
8402{
8403 EVENT("(GLenum buffer = 0x%X, GLint drawbuffer = %d, const GLfloat* value = 0x%0.8p)",
8404 buffer, drawbuffer, value);
8405
8406 try
8407 {
8408 gl::Context *context = gl::getNonLostContext();
8409
8410 if (context)
8411 {
8412 if (context->getClientVersion() < 3)
8413 {
8414 return gl::error(GL_INVALID_OPERATION);
8415 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008416
Jamie Madill54133512013-06-21 09:33:07 -04008417 // glClearBufferfv
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008418 UNIMPLEMENTED();
8419 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008420 }
8421 catch(std::bad_alloc&)
8422 {
8423 return gl::error(GL_OUT_OF_MEMORY);
8424 }
8425}
8426
8427void __stdcall glClearBufferfi(GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil)
8428{
8429 EVENT("(GLenum buffer = 0x%X, GLint drawbuffer = %d, GLfloat depth, GLint stencil = %d)",
8430 buffer, drawbuffer, depth, stencil);
8431
8432 try
8433 {
8434 gl::Context *context = gl::getNonLostContext();
8435
8436 if (context)
8437 {
8438 if (context->getClientVersion() < 3)
8439 {
8440 return gl::error(GL_INVALID_OPERATION);
8441 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008442
Jamie Madill54133512013-06-21 09:33:07 -04008443 // glClearBufferfi
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008444 UNIMPLEMENTED();
8445 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008446 }
8447 catch(std::bad_alloc&)
8448 {
8449 return gl::error(GL_OUT_OF_MEMORY);
8450 }
8451}
8452
8453const GLubyte* __stdcall glGetStringi(GLenum name, GLuint index)
8454{
8455 EVENT("(GLenum name = 0x%X, GLuint index = %u)", name, index);
8456
8457 try
8458 {
8459 gl::Context *context = gl::getNonLostContext();
8460
8461 if (context)
8462 {
8463 if (context->getClientVersion() < 3)
8464 {
8465 return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLubyte*>(NULL));
8466 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008467
shannonwoods@chromium.org302df742013-05-30 00:05:54 +00008468 if (name != GL_EXTENSIONS)
8469 {
8470 return gl::error(GL_INVALID_ENUM, reinterpret_cast<GLubyte*>(NULL));
8471 }
8472
8473 if (index >= context->getNumExtensions())
8474 {
8475 return gl::error(GL_INVALID_VALUE, reinterpret_cast<GLubyte*>(NULL));
8476 }
8477
8478 return reinterpret_cast<const GLubyte*>(context->getExtensionString(index));
8479 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008480 }
8481 catch(std::bad_alloc&)
8482 {
8483 return gl::error(GL_OUT_OF_MEMORY, reinterpret_cast<GLubyte*>(NULL));
8484 }
8485
8486 return NULL;
8487}
8488
8489void __stdcall glCopyBufferSubData(GLenum readTarget, GLenum writeTarget, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size)
8490{
8491 EVENT("(GLenum readTarget = 0x%X, GLenum writeTarget = 0x%X, GLintptr readOffset = %d, GLintptr writeOffset = %d, GLsizeiptr size = %d)",
8492 readTarget, writeTarget, readOffset, writeOffset, size);
8493
8494 try
8495 {
8496 gl::Context *context = gl::getNonLostContext();
8497
8498 if (context)
8499 {
8500 if (context->getClientVersion() < 3)
8501 {
8502 return gl::error(GL_INVALID_OPERATION);
8503 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008504
shannon.woods%transgaming.com@gtempaccount.com296c3f22013-04-13 03:39:39 +00008505 gl::Buffer *readBuffer = NULL;
8506 switch (readTarget)
8507 {
8508 case GL_ARRAY_BUFFER:
8509 readBuffer = context->getArrayBuffer();
8510 break;
8511 case GL_COPY_READ_BUFFER:
8512 readBuffer = context->getCopyReadBuffer();
8513 break;
8514 case GL_COPY_WRITE_BUFFER:
8515 readBuffer = context->getCopyWriteBuffer();
8516 break;
8517 case GL_ELEMENT_ARRAY_BUFFER:
8518 readBuffer = context->getElementArrayBuffer();
8519 break;
8520 case GL_PIXEL_PACK_BUFFER:
8521 readBuffer = context->getPixelPackBuffer();
8522 break;
8523 case GL_PIXEL_UNPACK_BUFFER:
8524 readBuffer = context->getPixelUnpackBuffer();
8525 break;
8526 case GL_TRANSFORM_FEEDBACK_BUFFER:
8527 readBuffer = context->getGenericTransformFeedbackBuffer();
8528 break;
8529 case GL_UNIFORM_BUFFER:
8530 readBuffer = context->getGenericUniformBuffer();
8531 break;
8532 default:
8533 return gl::error(GL_INVALID_ENUM);
8534 }
8535
8536 gl::Buffer *writeBuffer = NULL;
8537 switch (writeTarget)
8538 {
8539 case GL_ARRAY_BUFFER:
8540 writeBuffer = context->getArrayBuffer();
8541 break;
8542 case GL_COPY_READ_BUFFER:
8543 writeBuffer = context->getCopyReadBuffer();
8544 break;
8545 case GL_COPY_WRITE_BUFFER:
8546 writeBuffer = context->getCopyWriteBuffer();
8547 break;
8548 case GL_ELEMENT_ARRAY_BUFFER:
8549 writeBuffer = context->getElementArrayBuffer();
8550 break;
8551 case GL_PIXEL_PACK_BUFFER:
8552 writeBuffer = context->getPixelPackBuffer();
8553 break;
8554 case GL_PIXEL_UNPACK_BUFFER:
8555 writeBuffer = context->getPixelUnpackBuffer();
8556 break;
8557 case GL_TRANSFORM_FEEDBACK_BUFFER:
8558 writeBuffer = context->getGenericTransformFeedbackBuffer();
8559 break;
8560 case GL_UNIFORM_BUFFER:
8561 writeBuffer = context->getGenericUniformBuffer();
8562 break;
8563 default:
8564 return gl::error(GL_INVALID_ENUM);
8565 }
8566
8567 if (!readBuffer || !writeBuffer)
8568 {
8569 return gl::error(GL_INVALID_OPERATION);
8570 }
8571
8572 if (readOffset < 0 || writeOffset < 0 || size < 0 ||
8573 static_cast<unsigned int>(readOffset + size) > readBuffer->size() ||
8574 static_cast<unsigned int>(writeOffset + size) > writeBuffer->size())
8575 {
8576 return gl::error(GL_INVALID_VALUE);
8577 }
8578
8579 if (readBuffer == writeBuffer && abs(readOffset - writeOffset) < size)
8580 {
8581 return gl::error(GL_INVALID_VALUE);
8582 }
8583
8584 // TODO: Verify that readBuffer and writeBuffer are not currently mapped (GL_INVALID_OPERATION)
8585
shannon.woods%transgaming.com@gtempaccount.comc53376a2013-04-13 03:41:23 +00008586 // if size is zero, the copy is a successful no-op
8587 if (size > 0)
8588 {
8589 writeBuffer->copyBufferSubData(readBuffer, readOffset, writeOffset, size);
8590 }
shannon.woods%transgaming.com@gtempaccount.com296c3f22013-04-13 03:39:39 +00008591 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008592 }
8593 catch(std::bad_alloc&)
8594 {
8595 return gl::error(GL_OUT_OF_MEMORY);
8596 }
8597}
8598
8599void __stdcall glGetUniformIndices(GLuint program, GLsizei uniformCount, const GLchar* const* uniformNames, GLuint* uniformIndices)
8600{
8601 EVENT("(GLuint program = %u, GLsizei uniformCount = %d, const GLchar* const* uniformNames = 0x%0.8p, GLuint* uniformIndices = 0x%0.8p)",
8602 program, uniformCount, uniformNames, uniformIndices);
8603
8604 try
8605 {
8606 gl::Context *context = gl::getNonLostContext();
8607
8608 if (context)
8609 {
8610 if (context->getClientVersion() < 3)
8611 {
8612 return gl::error(GL_INVALID_OPERATION);
8613 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008614
shannonwoods@chromium.orgc2ed9912013-05-30 00:05:33 +00008615 if (uniformCount < 0)
8616 {
8617 return gl::error(GL_INVALID_VALUE);
8618 }
8619
8620 gl::Program *programObject = context->getProgram(program);
8621
8622 if (!programObject)
8623 {
8624 if (context->getShader(program))
8625 {
8626 return gl::error(GL_INVALID_OPERATION);
8627 }
8628 else
8629 {
8630 return gl::error(GL_INVALID_VALUE);
8631 }
8632 }
8633
8634 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
8635 if (!programObject->isLinked() || !programBinary)
8636 {
8637 for (int uniformId = 0; uniformId < uniformCount; uniformId++)
8638 {
8639 uniformIndices[uniformId] = GL_INVALID_INDEX;
8640 }
8641 }
8642 else
8643 {
8644 for (int uniformId = 0; uniformId < uniformCount; uniformId++)
8645 {
8646 uniformIndices[uniformId] = programBinary->getUniformIndex(uniformNames[uniformId]);
8647 }
8648 }
8649 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008650 }
8651 catch(std::bad_alloc&)
8652 {
8653 return gl::error(GL_OUT_OF_MEMORY);
8654 }
8655}
8656
8657void __stdcall glGetActiveUniformsiv(GLuint program, GLsizei uniformCount, const GLuint* uniformIndices, GLenum pname, GLint* params)
8658{
8659 EVENT("(GLuint program = %u, GLsizei uniformCount = %d, const GLuint* uniformIndices = 0x%0.8p, GLenum pname = 0x%X, GLint* params = 0x%0.8p)",
8660 program, uniformCount, uniformIndices, pname, params);
8661
8662 try
8663 {
8664 gl::Context *context = gl::getNonLostContext();
8665
8666 if (context)
8667 {
8668 if (context->getClientVersion() < 3)
8669 {
8670 return gl::error(GL_INVALID_OPERATION);
8671 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008672
shannonwoods@chromium.org2a9a9d22013-05-30 00:05:40 +00008673 if (uniformCount < 0)
8674 {
8675 return gl::error(GL_INVALID_VALUE);
8676 }
8677
8678 gl::Program *programObject = context->getProgram(program);
8679
8680 if (!programObject)
8681 {
8682 if (context->getShader(program))
8683 {
8684 return gl::error(GL_INVALID_OPERATION);
8685 }
8686 else
8687 {
8688 return gl::error(GL_INVALID_VALUE);
8689 }
8690 }
8691
8692 switch (pname)
8693 {
8694 case GL_UNIFORM_TYPE:
8695 case GL_UNIFORM_SIZE:
8696 case GL_UNIFORM_NAME_LENGTH:
8697 case GL_UNIFORM_BLOCK_INDEX:
8698 case GL_UNIFORM_OFFSET:
8699 case GL_UNIFORM_ARRAY_STRIDE:
8700 case GL_UNIFORM_MATRIX_STRIDE:
8701 case GL_UNIFORM_IS_ROW_MAJOR:
8702 break;
8703 default:
8704 return gl::error(GL_INVALID_ENUM);
8705 }
8706
8707 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
8708
8709 if (!programBinary && uniformCount > 0)
8710 {
8711 return gl::error(GL_INVALID_VALUE);
8712 }
8713
8714 for (int uniformId = 0; uniformId < uniformCount; uniformId++)
8715 {
8716 const GLuint index = uniformIndices[uniformId];
8717
8718 if (index >= (GLuint)programBinary->getActiveUniformCount())
8719 {
8720 return gl::error(GL_INVALID_VALUE);
8721 }
8722 }
8723
8724 for (int uniformId = 0; uniformId < uniformCount; uniformId++)
8725 {
8726 const GLuint index = uniformIndices[uniformId];
8727 params[uniformId] = programBinary->getActiveUniformi(index, pname);
8728 }
8729 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008730 }
8731 catch(std::bad_alloc&)
8732 {
8733 return gl::error(GL_OUT_OF_MEMORY);
8734 }
8735}
8736
8737GLuint __stdcall glGetUniformBlockIndex(GLuint program, const GLchar* uniformBlockName)
8738{
8739 EVENT("(GLuint program = %u, const GLchar* uniformBlockName = 0x%0.8p)", program, uniformBlockName);
8740
8741 try
8742 {
8743 gl::Context *context = gl::getNonLostContext();
8744
8745 if (context)
8746 {
8747 if (context->getClientVersion() < 3)
8748 {
shannonwoods@chromium.org42766252013-05-30 00:07:12 +00008749 return gl::error(GL_INVALID_OPERATION, GL_INVALID_INDEX);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008750 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008751
shannonwoods@chromium.org42766252013-05-30 00:07:12 +00008752 gl::Program *programObject = context->getProgram(program);
8753
8754 if (!programObject)
8755 {
8756 if (context->getShader(program))
8757 {
8758 return gl::error(GL_INVALID_OPERATION, GL_INVALID_INDEX);
8759 }
8760 else
8761 {
8762 return gl::error(GL_INVALID_VALUE, GL_INVALID_INDEX);
8763 }
8764 }
8765
8766 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
8767 if (!programBinary)
8768 {
8769 return GL_INVALID_INDEX;
8770 }
8771
8772 return programBinary->getUniformBlockIndex(uniformBlockName);
8773 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008774 }
8775 catch(std::bad_alloc&)
8776 {
8777 return gl::error(GL_OUT_OF_MEMORY, 0);
8778 }
8779
8780 return 0;
8781}
8782
8783void __stdcall glGetActiveUniformBlockiv(GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint* params)
8784{
8785 EVENT("(GLuint program = %u, GLuint uniformBlockIndex = %u, GLenum pname = 0x%X, GLint* params = 0x%0.8p)",
8786 program, uniformBlockIndex, pname, params);
8787
8788 try
8789 {
8790 gl::Context *context = gl::getNonLostContext();
8791
8792 if (context)
8793 {
8794 if (context->getClientVersion() < 3)
8795 {
8796 return gl::error(GL_INVALID_OPERATION);
8797 }
shannonwoods@chromium.orge7317ca2013-05-30 00:07:35 +00008798 gl::Program *programObject = context->getProgram(program);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008799
shannonwoods@chromium.orge7317ca2013-05-30 00:07:35 +00008800 if (!programObject)
8801 {
8802 if (context->getShader(program))
8803 {
8804 return gl::error(GL_INVALID_OPERATION);
8805 }
8806 else
8807 {
8808 return gl::error(GL_INVALID_VALUE);
8809 }
8810 }
8811
8812 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
8813
8814 if (!programBinary || uniformBlockIndex >= programBinary->getActiveUniformBlockCount())
8815 {
8816 return gl::error(GL_INVALID_VALUE);
8817 }
8818
8819 switch (pname)
8820 {
8821 case GL_UNIFORM_BLOCK_BINDING:
8822 *params = static_cast<GLint>(programObject->getUniformBlockBinding(uniformBlockIndex));
8823 break;
8824
8825 case GL_UNIFORM_BLOCK_DATA_SIZE:
8826 case GL_UNIFORM_BLOCK_NAME_LENGTH:
8827 case GL_UNIFORM_BLOCK_ACTIVE_UNIFORMS:
8828 case GL_UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES:
8829 case GL_UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER:
8830 case GL_UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER:
8831 programBinary->getActiveUniformBlockiv(uniformBlockIndex, pname, params);
8832 break;
8833
8834 default:
8835 return gl::error(GL_INVALID_ENUM);
8836 }
8837 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008838 }
8839 catch(std::bad_alloc&)
8840 {
8841 return gl::error(GL_OUT_OF_MEMORY);
8842 }
8843}
8844
8845void __stdcall glGetActiveUniformBlockName(GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei* length, GLchar* uniformBlockName)
8846{
8847 EVENT("(GLuint program = %u, GLuint uniformBlockIndex = %u, GLsizei bufSize = %d, GLsizei* length = 0x%0.8p, GLchar* uniformBlockName = 0x%0.8p)",
8848 program, uniformBlockIndex, bufSize, length, uniformBlockName);
8849
8850 try
8851 {
8852 gl::Context *context = gl::getNonLostContext();
8853
8854 if (context)
8855 {
8856 if (context->getClientVersion() < 3)
8857 {
8858 return gl::error(GL_INVALID_OPERATION);
8859 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008860
shannonwoods@chromium.orgbeb02782013-05-30 00:07:28 +00008861 gl::Program *programObject = context->getProgram(program);
8862
8863 if (!programObject)
8864 {
8865 if (context->getShader(program))
8866 {
8867 return gl::error(GL_INVALID_OPERATION);
8868 }
8869 else
8870 {
8871 return gl::error(GL_INVALID_VALUE);
8872 }
8873 }
8874
8875 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
8876
8877 if (!programBinary || uniformBlockIndex >= programBinary->getActiveUniformBlockCount())
8878 {
8879 return gl::error(GL_INVALID_VALUE);
8880 }
8881
8882 programBinary->getActiveUniformBlockName(uniformBlockIndex, bufSize, length, uniformBlockName);
8883 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008884 }
8885 catch(std::bad_alloc&)
8886 {
8887 return gl::error(GL_OUT_OF_MEMORY);
8888 }
8889}
8890
8891void __stdcall glUniformBlockBinding(GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding)
8892{
8893 EVENT("(GLuint program = %u, GLuint uniformBlockIndex = %u, GLuint uniformBlockBinding = %u)",
8894 program, uniformBlockIndex, uniformBlockBinding);
8895
8896 try
8897 {
8898 gl::Context *context = gl::getNonLostContext();
8899
8900 if (context)
8901 {
8902 if (context->getClientVersion() < 3)
8903 {
8904 return gl::error(GL_INVALID_OPERATION);
8905 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008906
shannonwoods@chromium.org70eb1ea2013-05-30 00:07:20 +00008907 if (uniformBlockBinding >= context->getMaximumCombinedUniformBufferBindings())
8908 {
8909 return gl::error(GL_INVALID_VALUE);
8910 }
8911
8912 gl::Program *programObject = context->getProgram(program);
8913
8914 if (!programObject)
8915 {
8916 if (context->getShader(program))
8917 {
8918 return gl::error(GL_INVALID_OPERATION);
8919 }
8920 else
8921 {
8922 return gl::error(GL_INVALID_VALUE);
8923 }
8924 }
8925
8926 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
8927
8928 // if never linked, there won't be any uniform blocks
8929 if (!programBinary || uniformBlockIndex >= programBinary->getActiveUniformBlockCount())
8930 {
8931 return gl::error(GL_INVALID_VALUE);
8932 }
8933
8934 programObject->bindUniformBlock(uniformBlockIndex, uniformBlockBinding);
8935 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008936 }
8937 catch(std::bad_alloc&)
8938 {
8939 return gl::error(GL_OUT_OF_MEMORY);
8940 }
8941}
8942
8943void __stdcall glDrawArraysInstanced(GLenum mode, GLint first, GLsizei count, GLsizei instanceCount)
8944{
8945 EVENT("(GLenum mode = 0x%X, GLint first = %d, GLsizei count = %d, GLsizei instanceCount = %d)",
8946 mode, first, count, instanceCount);
8947
8948 try
8949 {
8950 gl::Context *context = gl::getNonLostContext();
8951
8952 if (context)
8953 {
8954 if (context->getClientVersion() < 3)
8955 {
8956 return gl::error(GL_INVALID_OPERATION);
8957 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008958
Jamie Madill54133512013-06-21 09:33:07 -04008959 // glDrawArraysInstanced
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008960 UNIMPLEMENTED();
8961 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008962 }
8963 catch(std::bad_alloc&)
8964 {
8965 return gl::error(GL_OUT_OF_MEMORY);
8966 }
8967}
8968
8969void __stdcall glDrawElementsInstanced(GLenum mode, GLsizei count, GLenum type, const GLvoid* indices, GLsizei instanceCount)
8970{
8971 EVENT("(GLenum mode = 0x%X, GLsizei count = %d, GLenum type = 0x%X, const GLvoid* indices = 0x%0.8p, GLsizei instanceCount = %d)",
8972 mode, count, type, indices, instanceCount);
8973
8974 try
8975 {
8976 gl::Context *context = gl::getNonLostContext();
8977
8978 if (context)
8979 {
8980 if (context->getClientVersion() < 3)
8981 {
8982 return gl::error(GL_INVALID_OPERATION);
8983 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008984
Jamie Madill54133512013-06-21 09:33:07 -04008985 // glDrawElementsInstanced
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008986 UNIMPLEMENTED();
8987 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008988 }
8989 catch(std::bad_alloc&)
8990 {
8991 return gl::error(GL_OUT_OF_MEMORY);
8992 }
8993}
8994
8995GLsync __stdcall glFenceSync(GLenum condition, GLbitfield flags)
8996{
8997 EVENT("(GLenum condition = 0x%X, GLbitfield flags = 0x%X)", condition, flags);
8998
8999 try
9000 {
9001 gl::Context *context = gl::getNonLostContext();
9002
9003 if (context)
9004 {
9005 if (context->getClientVersion() < 3)
9006 {
Jamie Madill5215e1a2013-07-26 11:55:19 -04009007 return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLsync>(0));
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009008 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009009
Jamie Madill5215e1a2013-07-26 11:55:19 -04009010 if (condition != GL_SYNC_GPU_COMMANDS_COMPLETE)
9011 {
9012 return gl::error(GL_INVALID_ENUM, reinterpret_cast<GLsync>(0));
9013 }
9014
9015 if (flags != 0)
9016 {
9017 return gl::error(GL_INVALID_VALUE, reinterpret_cast<GLsync>(0));
9018 }
9019
9020 return context->createFenceSync(condition);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009021 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009022 }
9023 catch(std::bad_alloc&)
9024 {
9025 return gl::error(GL_OUT_OF_MEMORY, reinterpret_cast<GLsync>(NULL));
9026 }
9027
9028 return NULL;
9029}
9030
9031GLboolean __stdcall glIsSync(GLsync sync)
9032{
9033 EVENT("(GLsync sync = 0x%0.8p)", sync);
9034
9035 try
9036 {
9037 gl::Context *context = gl::getNonLostContext();
9038
9039 if (context)
9040 {
9041 if (context->getClientVersion() < 3)
9042 {
9043 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
9044 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009045
Jamie Madill5215e1a2013-07-26 11:55:19 -04009046 return (context->getFenceSync(sync) != NULL);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009047 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009048 }
9049 catch(std::bad_alloc&)
9050 {
9051 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
9052 }
9053
9054 return GL_FALSE;
9055}
9056
9057void __stdcall glDeleteSync(GLsync sync)
9058{
9059 EVENT("(GLsync sync = 0x%0.8p)", sync);
9060
9061 try
9062 {
9063 gl::Context *context = gl::getNonLostContext();
9064
9065 if (context)
9066 {
9067 if (context->getClientVersion() < 3)
9068 {
9069 return gl::error(GL_INVALID_OPERATION);
9070 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009071
Jamie Madill5215e1a2013-07-26 11:55:19 -04009072 if (sync != static_cast<GLsync>(0) && !context->getFenceSync(sync))
9073 {
9074 return gl::error(GL_INVALID_VALUE);
9075 }
9076
9077 context->deleteFenceSync(sync);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009078 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009079 }
9080 catch(std::bad_alloc&)
9081 {
9082 return gl::error(GL_OUT_OF_MEMORY);
9083 }
9084}
9085
9086GLenum __stdcall glClientWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout)
9087{
9088 EVENT("(GLsync sync = 0x%0.8p, GLbitfield flags = 0x%X, GLuint64 timeout = %llu)",
9089 sync, flags, timeout);
9090
9091 try
9092 {
9093 gl::Context *context = gl::getNonLostContext();
9094
9095 if (context)
9096 {
9097 if (context->getClientVersion() < 3)
9098 {
Jamie Madill5215e1a2013-07-26 11:55:19 -04009099 return gl::error(GL_INVALID_OPERATION, GL_WAIT_FAILED);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009100 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009101
Jamie Madill5215e1a2013-07-26 11:55:19 -04009102 if ((flags & ~(GL_SYNC_FLUSH_COMMANDS_BIT)) != 0)
9103 {
9104 return gl::error(GL_INVALID_VALUE, GL_WAIT_FAILED);
9105 }
9106
9107 gl::FenceSync *fenceSync = context->getFenceSync(sync);
9108
9109 if (!fenceSync)
9110 {
9111 return gl::error(GL_INVALID_VALUE, GL_WAIT_FAILED);
9112 }
9113
9114 return fenceSync->clientWait(flags, timeout);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009115 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009116 }
9117 catch(std::bad_alloc&)
9118 {
9119 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
9120 }
9121
9122 return GL_FALSE;
9123}
9124
9125void __stdcall glWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout)
9126{
9127 EVENT("(GLsync sync = 0x%0.8p, GLbitfield flags = 0x%X, GLuint64 timeout = %llu)",
9128 sync, flags, timeout);
9129
9130 try
9131 {
9132 gl::Context *context = gl::getNonLostContext();
9133
9134 if (context)
9135 {
9136 if (context->getClientVersion() < 3)
9137 {
9138 return gl::error(GL_INVALID_OPERATION);
9139 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009140
Jamie Madill5215e1a2013-07-26 11:55:19 -04009141 if (flags != 0)
9142 {
9143 return gl::error(GL_INVALID_VALUE);
9144 }
9145
9146 if (timeout != GL_TIMEOUT_IGNORED)
9147 {
9148 return gl::error(GL_INVALID_VALUE);
9149 }
9150
9151 gl::FenceSync *fenceSync = context->getFenceSync(sync);
9152
9153 if (!fenceSync)
9154 {
9155 return gl::error(GL_INVALID_VALUE);
9156 }
9157
9158 fenceSync->serverWait();
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009159 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009160 }
9161 catch(std::bad_alloc&)
9162 {
9163 return gl::error(GL_OUT_OF_MEMORY);
9164 }
9165}
9166
9167void __stdcall glGetInteger64v(GLenum pname, GLint64* params)
9168{
9169 EVENT("(GLenum pname = 0x%X, GLint64* params = 0x%0.8p)",
9170 pname, params);
9171
9172 try
9173 {
9174 gl::Context *context = gl::getNonLostContext();
9175
9176 if (context)
9177 {
9178 if (context->getClientVersion() < 3)
9179 {
9180 return gl::error(GL_INVALID_OPERATION);
9181 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009182
Jamie Madill71fbd602013-07-19 16:36:55 -04009183 if (!(context->getInteger64v(pname, params)))
9184 {
9185 GLenum nativeType;
9186 unsigned int numParams = 0;
9187 if (!context->getQueryParameterInfo(pname, &nativeType, &numParams))
9188 return gl::error(GL_INVALID_ENUM);
9189
9190 if (numParams == 0)
9191 return; // it is known that the pname is valid, but that there are no parameters to return.
9192
9193 if (nativeType == GL_BOOL)
9194 {
9195 GLboolean *boolParams = NULL;
9196 boolParams = new GLboolean[numParams];
9197
9198 context->getBooleanv(pname, boolParams);
9199
9200 for (unsigned int i = 0; i < numParams; ++i)
9201 {
9202 if (boolParams[i] == GL_FALSE)
9203 params[i] = 0;
9204 else
9205 params[i] = 1;
9206 }
9207
9208 delete [] boolParams;
9209 }
9210 else if (nativeType == GL_INT)
9211 {
9212 GLint *intParams = NULL;
9213 intParams = new GLint[numParams];
9214
9215 context->getIntegerv(pname, intParams);
9216
9217 for (unsigned int i = 0; i < numParams; ++i)
9218 {
9219 params[i] = static_cast<GLint64>(intParams[i]);
9220 }
9221
9222 delete [] intParams;
9223 }
9224 else if (nativeType == GL_FLOAT)
9225 {
9226 GLfloat *floatParams = NULL;
9227 floatParams = new GLfloat[numParams];
9228
9229 context->getFloatv(pname, floatParams);
9230
9231 for (unsigned int i = 0; i < numParams; ++i)
9232 {
9233 // RGBA color values and DepthRangeF values are converted to integer using Equation 2.4 from Table 4.5
9234 if (pname == GL_DEPTH_RANGE || pname == GL_COLOR_CLEAR_VALUE || pname == GL_DEPTH_CLEAR_VALUE || pname == GL_BLEND_COLOR)
9235 {
9236 params[i] = static_cast<GLint64>((static_cast<GLfloat>(0xFFFFFFFF) * floatParams[i] - 1.0f) / 2.0f);
9237 }
9238 else
9239 {
9240 params[i] = gl::iround<GLint64>(floatParams[i]);
9241 }
9242 }
9243
9244 delete [] floatParams;
9245 }
9246 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009247 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009248 }
9249 catch(std::bad_alloc&)
9250 {
9251 return gl::error(GL_OUT_OF_MEMORY);
9252 }
9253}
9254
9255void __stdcall glGetSynciv(GLsync sync, GLenum pname, GLsizei bufSize, GLsizei* length, GLint* values)
9256{
9257 EVENT("(GLsync sync = 0x%0.8p, GLenum pname = 0x%X, GLsizei bufSize = %d, GLsizei* length = 0x%0.8p, GLint* values = 0x%0.8p)",
9258 sync, pname, bufSize, length, values);
9259
9260 try
9261 {
9262 gl::Context *context = gl::getNonLostContext();
9263
9264 if (context)
9265 {
9266 if (context->getClientVersion() < 3)
9267 {
9268 return gl::error(GL_INVALID_OPERATION);
9269 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009270
Jamie Madill5215e1a2013-07-26 11:55:19 -04009271 if (bufSize < 0)
9272 {
9273 return gl::error(GL_INVALID_VALUE);
9274 }
9275
9276 gl::FenceSync *fenceSync = context->getFenceSync(sync);
9277
9278 if (!fenceSync)
9279 {
9280 return gl::error(GL_INVALID_VALUE);
9281 }
9282
9283 switch (pname)
9284 {
9285 case GL_OBJECT_TYPE: values[0] = static_cast<GLint>(GL_SYNC_FENCE); break;
9286 case GL_SYNC_STATUS: values[0] = static_cast<GLint>(fenceSync->getStatus()); break;
9287 case GL_SYNC_CONDITION: values[0] = static_cast<GLint>(fenceSync->getCondition()); break;
9288 case GL_SYNC_FLAGS: values[0] = 0; break;
9289
9290 default:
9291 return gl::error(GL_INVALID_ENUM);
9292 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009293 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009294 }
9295 catch(std::bad_alloc&)
9296 {
9297 return gl::error(GL_OUT_OF_MEMORY);
9298 }
9299}
9300
9301void __stdcall glGetInteger64i_v(GLenum target, GLuint index, GLint64* data)
9302{
9303 EVENT("(GLenum target = 0x%X, GLuint index = %u, GLint64* data = 0x%0.8p)",
9304 target, index, data);
9305
9306 try
9307 {
9308 gl::Context *context = gl::getNonLostContext();
9309
9310 if (context)
9311 {
9312 if (context->getClientVersion() < 3)
9313 {
9314 return gl::error(GL_INVALID_OPERATION);
9315 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009316
Shannon Woods15934d52013-08-19 14:28:49 -04009317 switch (target)
9318 {
9319 case GL_TRANSFORM_FEEDBACK_BUFFER_START:
9320 case GL_TRANSFORM_FEEDBACK_BUFFER_SIZE:
9321 case GL_TRANSFORM_FEEDBACK_BUFFER_BINDING:
9322 if (index >= context->getMaxTransformFeedbackBufferBindings())
9323 return gl::error(GL_INVALID_VALUE);
9324 break;
9325 case GL_UNIFORM_BUFFER_START:
9326 case GL_UNIFORM_BUFFER_SIZE:
9327 case GL_UNIFORM_BUFFER_BINDING:
9328 if (index >= context->getMaximumCombinedUniformBufferBindings())
9329 return gl::error(GL_INVALID_VALUE);
9330 break;
9331 default:
9332 return gl::error(GL_INVALID_ENUM);
9333 }
9334
9335 if (!(context->getIndexedInteger64v(target, index, data)))
9336 {
9337 GLenum nativeType;
9338 unsigned int numParams = 0;
9339 if (!context->getIndexedQueryParameterInfo(target, &nativeType, &numParams))
9340 return gl::error(GL_INVALID_ENUM);
9341
9342 if (numParams == 0)
9343 return; // it is known that pname is valid, but there are no parameters to return
9344
9345 if (nativeType == GL_INT)
9346 {
9347 GLint *intParams = new GLint[numParams];
9348
9349 context->getIndexedIntegerv(target, index, intParams);
9350
9351 for (unsigned int i = 0; i < numParams; ++i)
9352 {
9353 data[i] = static_cast<GLint64>(intParams[i]);
9354 }
9355
9356 delete [] intParams;
9357 }
9358 else
9359 {
9360 UNREACHABLE();
9361 }
9362 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009363 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009364 }
9365 catch(std::bad_alloc&)
9366 {
9367 return gl::error(GL_OUT_OF_MEMORY);
9368 }
9369}
9370
9371void __stdcall glGetBufferParameteri64v(GLenum target, GLenum pname, GLint64* params)
9372{
9373 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLint64* params = 0x%0.8p)",
9374 target, pname, params);
9375
9376 try
9377 {
9378 gl::Context *context = gl::getNonLostContext();
9379
9380 if (context)
9381 {
9382 if (context->getClientVersion() < 3)
9383 {
9384 return gl::error(GL_INVALID_OPERATION);
9385 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009386
Jamie Madill54133512013-06-21 09:33:07 -04009387 // glGetBufferParameteri64v
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009388 UNIMPLEMENTED();
9389 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009390 }
9391 catch(std::bad_alloc&)
9392 {
9393 return gl::error(GL_OUT_OF_MEMORY);
9394 }
9395}
9396
9397void __stdcall glGenSamplers(GLsizei count, GLuint* samplers)
9398{
9399 EVENT("(GLsizei count = %d, GLuint* samplers = 0x%0.8p)", count, samplers);
9400
9401 try
9402 {
9403 gl::Context *context = gl::getNonLostContext();
9404
9405 if (context)
9406 {
9407 if (context->getClientVersion() < 3)
9408 {
9409 return gl::error(GL_INVALID_OPERATION);
9410 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009411
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009412 if (count < 0)
9413 {
9414 return gl::error(GL_INVALID_VALUE);
9415 }
9416
9417 for (int i = 0; i < count; i++)
9418 {
9419 samplers[i] = context->createSampler();
9420 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009421 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009422 }
9423 catch(std::bad_alloc&)
9424 {
9425 return gl::error(GL_OUT_OF_MEMORY);
9426 }
9427}
9428
9429void __stdcall glDeleteSamplers(GLsizei count, const GLuint* samplers)
9430{
9431 EVENT("(GLsizei count = %d, const GLuint* samplers = 0x%0.8p)", count, samplers);
9432
9433 try
9434 {
9435 gl::Context *context = gl::getNonLostContext();
9436
9437 if (context)
9438 {
9439 if (context->getClientVersion() < 3)
9440 {
9441 return gl::error(GL_INVALID_OPERATION);
9442 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009443
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009444 if (count < 0)
9445 {
9446 return gl::error(GL_INVALID_VALUE);
9447 }
9448
9449 for (int i = 0; i < count; i++)
9450 {
9451 context->deleteSampler(samplers[i]);
9452 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009453 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009454 }
9455 catch(std::bad_alloc&)
9456 {
9457 return gl::error(GL_OUT_OF_MEMORY);
9458 }
9459}
9460
9461GLboolean __stdcall glIsSampler(GLuint sampler)
9462{
9463 EVENT("(GLuint sampler = %u)", sampler);
9464
9465 try
9466 {
9467 gl::Context *context = gl::getNonLostContext();
9468
9469 if (context)
9470 {
9471 if (context->getClientVersion() < 3)
9472 {
9473 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
9474 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009475
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009476 return context->isSampler(sampler);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009477 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009478 }
9479 catch(std::bad_alloc&)
9480 {
9481 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
9482 }
9483
9484 return GL_FALSE;
9485}
9486
9487void __stdcall glBindSampler(GLuint unit, GLuint sampler)
9488{
9489 EVENT("(GLuint unit = %u, GLuint sampler = %u)", unit, sampler);
9490
9491 try
9492 {
9493 gl::Context *context = gl::getNonLostContext();
9494
9495 if (context)
9496 {
9497 if (context->getClientVersion() < 3)
9498 {
9499 return gl::error(GL_INVALID_OPERATION);
9500 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009501
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009502 if (sampler != 0 && !context->isSampler(sampler))
9503 {
9504 return gl::error(GL_INVALID_OPERATION);
9505 }
9506
9507 if (unit >= context->getMaximumCombinedTextureImageUnits())
9508 {
9509 return gl::error(GL_INVALID_VALUE);
9510 }
9511
9512 context->bindSampler(unit, sampler);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009513 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009514 }
9515 catch(std::bad_alloc&)
9516 {
9517 return gl::error(GL_OUT_OF_MEMORY);
9518 }
9519}
9520
9521void __stdcall glSamplerParameteri(GLuint sampler, GLenum pname, GLint param)
9522{
9523 EVENT("(GLuint sampler = %u, GLenum pname = 0x%X, GLint param = %d)", sampler, pname, param);
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 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009535
Geoff Lang34dbb6f2013-08-05 15:05:47 -04009536 if (!gl::ValidateSamplerObjectParameter(pname))
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009537 {
9538 return;
9539 }
9540
Geoff Lang34dbb6f2013-08-05 15:05:47 -04009541 if (!gl::ValidateTexParamParameters(context, pname, param))
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009542 {
9543 return;
9544 }
9545
9546 if (!context->isSampler(sampler))
9547 {
9548 return gl::error(GL_INVALID_OPERATION);
9549 }
9550
9551 context->samplerParameteri(sampler, pname, param);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009552 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009553 }
9554 catch(std::bad_alloc&)
9555 {
9556 return gl::error(GL_OUT_OF_MEMORY);
9557 }
9558}
9559
9560void __stdcall glSamplerParameteriv(GLuint sampler, GLenum pname, const GLint* param)
9561{
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009562 glSamplerParameteri(sampler, pname, *param);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009563}
9564
9565void __stdcall glSamplerParameterf(GLuint sampler, GLenum pname, GLfloat param)
9566{
9567 EVENT("(GLuint sampler = %u, GLenum pname = 0x%X, GLfloat param = %g)", sampler, pname, param);
9568
9569 try
9570 {
9571 gl::Context *context = gl::getNonLostContext();
9572
9573 if (context)
9574 {
9575 if (context->getClientVersion() < 3)
9576 {
9577 return gl::error(GL_INVALID_OPERATION);
9578 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009579
Geoff Lang34dbb6f2013-08-05 15:05:47 -04009580 if (!gl::ValidateSamplerObjectParameter(pname))
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009581 {
9582 return;
9583 }
9584
Geoff Lang34dbb6f2013-08-05 15:05:47 -04009585 if (!gl::ValidateTexParamParameters(context, pname, static_cast<GLint>(param)))
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009586 {
9587 return;
9588 }
9589
9590 if (!context->isSampler(sampler))
9591 {
9592 return gl::error(GL_INVALID_OPERATION);
9593 }
9594
9595 context->samplerParameterf(sampler, pname, param);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009596 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009597 }
9598 catch(std::bad_alloc&)
9599 {
9600 return gl::error(GL_OUT_OF_MEMORY);
9601 }
9602}
9603
9604void __stdcall glSamplerParameterfv(GLuint sampler, GLenum pname, const GLfloat* param)
9605{
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009606 glSamplerParameterf(sampler, pname, *param);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009607}
9608
9609void __stdcall glGetSamplerParameteriv(GLuint sampler, GLenum pname, GLint* params)
9610{
9611 EVENT("(GLuint sampler = %u, GLenum pname = 0x%X, GLint* params = 0x%0.8p)", sampler, pname, params);
9612
9613 try
9614 {
9615 gl::Context *context = gl::getNonLostContext();
9616
9617 if (context)
9618 {
9619 if (context->getClientVersion() < 3)
9620 {
9621 return gl::error(GL_INVALID_OPERATION);
9622 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009623
Geoff Lang34dbb6f2013-08-05 15:05:47 -04009624 if (!gl::ValidateSamplerObjectParameter(pname))
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009625 {
9626 return;
9627 }
9628
9629 if (!context->isSampler(sampler))
9630 {
9631 return gl::error(GL_INVALID_OPERATION);
9632 }
9633
9634 *params = context->getSamplerParameteri(sampler, pname);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009635 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009636 }
9637 catch(std::bad_alloc&)
9638 {
9639 return gl::error(GL_OUT_OF_MEMORY);
9640 }
9641}
9642
9643void __stdcall glGetSamplerParameterfv(GLuint sampler, GLenum pname, GLfloat* params)
9644{
9645 EVENT("(GLuint sample = %ur, GLenum pname = 0x%X, GLfloat* params = 0x%0.8p)", sampler, pname, params);
9646
9647 try
9648 {
9649 gl::Context *context = gl::getNonLostContext();
9650
9651 if (context)
9652 {
9653 if (context->getClientVersion() < 3)
9654 {
9655 return gl::error(GL_INVALID_OPERATION);
9656 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009657
Geoff Lang34dbb6f2013-08-05 15:05:47 -04009658 if (!gl::ValidateSamplerObjectParameter(pname))
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009659 {
9660 return;
9661 }
9662
9663 if (!context->isSampler(sampler))
9664 {
9665 return gl::error(GL_INVALID_OPERATION);
9666 }
9667
9668 *params = context->getSamplerParameterf(sampler, pname);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009669 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009670 }
9671 catch(std::bad_alloc&)
9672 {
9673 return gl::error(GL_OUT_OF_MEMORY);
9674 }
9675}
9676
9677void __stdcall glVertexAttribDivisor(GLuint index, GLuint divisor)
9678{
9679 EVENT("(GLuint index = %u, GLuint divisor = %u)", index, divisor);
9680
9681 try
9682 {
shannon.woods%transgaming.com@gtempaccount.com8736bd62013-04-13 03:35:41 +00009683 if (index >= gl::MAX_VERTEX_ATTRIBS)
9684 {
9685 return gl::error(GL_INVALID_VALUE);
9686 }
9687
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009688 gl::Context *context = gl::getNonLostContext();
9689
9690 if (context)
9691 {
9692 if (context->getClientVersion() < 3)
9693 {
9694 return gl::error(GL_INVALID_OPERATION);
9695 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009696
shannon.woods%transgaming.com@gtempaccount.com8736bd62013-04-13 03:35:41 +00009697 context->setVertexAttribDivisor(index, divisor);
9698 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009699 }
9700 catch(std::bad_alloc&)
9701 {
9702 return gl::error(GL_OUT_OF_MEMORY);
9703 }
9704}
9705
9706void __stdcall glBindTransformFeedback(GLenum target, GLuint id)
9707{
9708 EVENT("(GLenum target = 0x%X, GLuint id = %u)", target, id);
9709
9710 try
9711 {
9712 gl::Context *context = gl::getNonLostContext();
9713
9714 if (context)
9715 {
9716 if (context->getClientVersion() < 3)
9717 {
9718 return gl::error(GL_INVALID_OPERATION);
9719 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009720
Jamie Madill54133512013-06-21 09:33:07 -04009721 // glBindTransformFeedback
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009722 UNIMPLEMENTED();
9723 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009724 }
9725 catch(std::bad_alloc&)
9726 {
9727 return gl::error(GL_OUT_OF_MEMORY);
9728 }
9729}
9730
9731void __stdcall glDeleteTransformFeedbacks(GLsizei n, const GLuint* ids)
9732{
9733 EVENT("(GLsizei n = %d, const GLuint* ids = 0x%0.8p)", n, ids);
9734
9735 try
9736 {
9737 gl::Context *context = gl::getNonLostContext();
9738
9739 if (context)
9740 {
9741 if (context->getClientVersion() < 3)
9742 {
9743 return gl::error(GL_INVALID_OPERATION);
9744 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009745
Jamie Madill54133512013-06-21 09:33:07 -04009746 // glDeleteTransformFeedbacks
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009747 UNIMPLEMENTED();
9748 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009749 }
9750 catch(std::bad_alloc&)
9751 {
9752 return gl::error(GL_OUT_OF_MEMORY);
9753 }
9754}
9755
9756void __stdcall glGenTransformFeedbacks(GLsizei n, GLuint* ids)
9757{
9758 EVENT("(GLsizei n = %d, GLuint* ids = 0x%0.8p)", n, ids);
9759
9760 try
9761 {
9762 gl::Context *context = gl::getNonLostContext();
9763
9764 if (context)
9765 {
9766 if (context->getClientVersion() < 3)
9767 {
9768 return gl::error(GL_INVALID_OPERATION);
9769 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009770
Jamie Madill54133512013-06-21 09:33:07 -04009771 // glGenTransformFeedbacks
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009772 UNIMPLEMENTED();
9773 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009774 }
9775 catch(std::bad_alloc&)
9776 {
9777 return gl::error(GL_OUT_OF_MEMORY);
9778 }
9779}
9780
9781GLboolean __stdcall glIsTransformFeedback(GLuint id)
9782{
9783 EVENT("(GLuint id = %u)", id);
9784
9785 try
9786 {
9787 gl::Context *context = gl::getNonLostContext();
9788
9789 if (context)
9790 {
9791 if (context->getClientVersion() < 3)
9792 {
9793 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
9794 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009795
Jamie Madill54133512013-06-21 09:33:07 -04009796 // glIsTransformFeedback
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009797 UNIMPLEMENTED();
9798 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009799 }
9800 catch(std::bad_alloc&)
9801 {
9802 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
9803 }
9804
9805 return GL_FALSE;
9806}
9807
9808void __stdcall glPauseTransformFeedback(void)
9809{
9810 EVENT("(void)");
9811
9812 try
9813 {
9814 gl::Context *context = gl::getNonLostContext();
9815
9816 if (context)
9817 {
9818 if (context->getClientVersion() < 3)
9819 {
9820 return gl::error(GL_INVALID_OPERATION);
9821 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009822
Jamie Madill54133512013-06-21 09:33:07 -04009823 // glPauseTransformFeedback
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009824 UNIMPLEMENTED();
9825 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009826 }
9827 catch(std::bad_alloc&)
9828 {
9829 return gl::error(GL_OUT_OF_MEMORY);
9830 }
9831}
9832
9833void __stdcall glResumeTransformFeedback(void)
9834{
9835 EVENT("(void)");
9836
9837 try
9838 {
9839 gl::Context *context = gl::getNonLostContext();
9840
9841 if (context)
9842 {
9843 if (context->getClientVersion() < 3)
9844 {
9845 return gl::error(GL_INVALID_OPERATION);
9846 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009847
Jamie Madill54133512013-06-21 09:33:07 -04009848 // glResumeTransformFeedback
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009849 UNIMPLEMENTED();
9850 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009851 }
9852 catch(std::bad_alloc&)
9853 {
9854 return gl::error(GL_OUT_OF_MEMORY);
9855 }
9856}
9857
9858void __stdcall glGetProgramBinary(GLuint program, GLsizei bufSize, GLsizei* length, GLenum* binaryFormat, GLvoid* binary)
9859{
9860 EVENT("(GLuint program = %u, GLsizei bufSize = %d, GLsizei* length = 0x%0.8p, GLenum* binaryFormat = 0x%0.8p, GLvoid* binary = 0x%0.8p)",
9861 program, bufSize, length, binaryFormat, binary);
9862
9863 try
9864 {
9865 gl::Context *context = gl::getNonLostContext();
9866
9867 if (context)
9868 {
9869 if (context->getClientVersion() < 3)
9870 {
9871 return gl::error(GL_INVALID_OPERATION);
9872 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009873
Jamie Madill54133512013-06-21 09:33:07 -04009874 // glGetProgramBinary
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009875 UNIMPLEMENTED();
9876 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009877 }
9878 catch(std::bad_alloc&)
9879 {
9880 return gl::error(GL_OUT_OF_MEMORY);
9881 }
9882}
9883
9884void __stdcall glProgramBinary(GLuint program, GLenum binaryFormat, const GLvoid* binary, GLsizei length)
9885{
9886 EVENT("(GLuint program = %u, GLenum binaryFormat = 0x%X, const GLvoid* binary = 0x%0.8p, GLsizei length = %d)",
9887 program, binaryFormat, binary, length);
9888
9889 try
9890 {
9891 gl::Context *context = gl::getNonLostContext();
9892
9893 if (context)
9894 {
9895 if (context->getClientVersion() < 3)
9896 {
9897 return gl::error(GL_INVALID_OPERATION);
9898 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009899
Jamie Madill54133512013-06-21 09:33:07 -04009900 // glProgramBinary
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009901 UNIMPLEMENTED();
9902 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009903 }
9904 catch(std::bad_alloc&)
9905 {
9906 return gl::error(GL_OUT_OF_MEMORY);
9907 }
9908}
9909
9910void __stdcall glProgramParameteri(GLuint program, GLenum pname, GLint value)
9911{
9912 EVENT("(GLuint program = %u, GLenum pname = 0x%X, GLint value = %d)",
9913 program, pname, value);
9914
9915 try
9916 {
9917 gl::Context *context = gl::getNonLostContext();
9918
9919 if (context)
9920 {
9921 if (context->getClientVersion() < 3)
9922 {
9923 return gl::error(GL_INVALID_OPERATION);
9924 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009925
Jamie Madill54133512013-06-21 09:33:07 -04009926 // glProgramParameteri
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009927 UNIMPLEMENTED();
9928 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009929 }
9930 catch(std::bad_alloc&)
9931 {
9932 return gl::error(GL_OUT_OF_MEMORY);
9933 }
9934}
9935
9936void __stdcall glInvalidateFramebuffer(GLenum target, GLsizei numAttachments, const GLenum* attachments)
9937{
9938 EVENT("(GLenum target = 0x%X, GLsizei numAttachments = %d, const GLenum* attachments = 0x%0.8p)",
9939 target, numAttachments, attachments);
9940
9941 try
9942 {
9943 gl::Context *context = gl::getNonLostContext();
9944
9945 if (context)
9946 {
9947 if (context->getClientVersion() < 3)
9948 {
9949 return gl::error(GL_INVALID_OPERATION);
9950 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009951
Geoff Lang34dbb6f2013-08-05 15:05:47 -04009952 if (!ValidateInvalidateFramebufferParameters(context, target, numAttachments, attachments))
shannonwoods@chromium.orgd63ef892013-05-30 00:10:56 +00009953 {
9954 return;
9955 }
9956
9957 int maxDimension = context->getMaximumRenderbufferDimension();
9958 context->invalidateFrameBuffer(target, numAttachments, attachments, 0, 0, maxDimension, maxDimension);
9959 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009960 }
9961 catch(std::bad_alloc&)
9962 {
9963 return gl::error(GL_OUT_OF_MEMORY);
9964 }
9965}
9966
9967void __stdcall glInvalidateSubFramebuffer(GLenum target, GLsizei numAttachments, const GLenum* attachments, GLint x, GLint y, GLsizei width, GLsizei height)
9968{
9969 EVENT("(GLenum target = 0x%X, GLsizei numAttachments = %d, const GLenum* attachments = 0x%0.8p, GLint x = %d, "
9970 "GLint y = %d, GLsizei width = %d, GLsizei height = %d)",
9971 target, numAttachments, attachments, x, y, width, height);
9972
9973 try
9974 {
9975 gl::Context *context = gl::getNonLostContext();
9976
9977 if (context)
9978 {
9979 if (context->getClientVersion() < 3)
9980 {
9981 return gl::error(GL_INVALID_OPERATION);
9982 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009983
Geoff Lang34dbb6f2013-08-05 15:05:47 -04009984 if (!ValidateInvalidateFramebufferParameters(context, target, numAttachments, attachments))
shannonwoods@chromium.orgd63ef892013-05-30 00:10:56 +00009985 {
9986 return;
9987 }
9988
9989 context->invalidateFrameBuffer(target, numAttachments, attachments, x, y, width, height);
9990 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009991 }
9992 catch(std::bad_alloc&)
9993 {
9994 return gl::error(GL_OUT_OF_MEMORY);
9995 }
9996}
9997
9998void __stdcall glTexStorage2D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height)
9999{
10000 EVENT("(GLenum target = 0x%X, GLsizei levels = %d, GLenum internalformat = 0x%X, GLsizei width = %d, GLsizei height = %d)",
10001 target, levels, internalformat, width, height);
10002
10003 try
10004 {
10005 gl::Context *context = gl::getNonLostContext();
10006
10007 if (context)
10008 {
10009 if (context->getClientVersion() < 3)
10010 {
10011 return gl::error(GL_INVALID_OPERATION);
10012 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +000010013
Geoff Lang34dbb6f2013-08-05 15:05:47 -040010014 if (!ValidateES3TexStorageParameters(context, target, levels, internalformat, width, height, 1))
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +000010015 {
10016 return;
10017 }
10018
10019 switch (target)
10020 {
10021 case GL_TEXTURE_2D:
10022 {
10023 gl::Texture2D *texture2d = context->getTexture2D();
10024 texture2d->storage(levels, internalformat, width, height);
10025 }
10026 break;
10027
10028 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
10029 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
10030 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
10031 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
10032 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
10033 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
10034 {
10035 gl::TextureCubeMap *textureCube = context->getTextureCubeMap();
10036 textureCube->storage(levels, internalformat, width);
10037 }
10038 break;
10039
10040 default:
10041 return gl::error(GL_INVALID_ENUM);
10042 }
10043 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +000010044 }
10045 catch(std::bad_alloc&)
10046 {
10047 return gl::error(GL_OUT_OF_MEMORY);
10048 }
10049}
10050
10051void __stdcall glTexStorage3D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth)
10052{
10053 EVENT("(GLenum target = 0x%X, GLsizei levels = %d, GLenum internalformat = 0x%X, GLsizei width = %d, "
10054 "GLsizei height = %d, GLsizei depth = %d)",
10055 target, levels, internalformat, width, height, depth);
10056
10057 try
10058 {
10059 gl::Context *context = gl::getNonLostContext();
10060
10061 if (context)
10062 {
10063 if (context->getClientVersion() < 3)
10064 {
10065 return gl::error(GL_INVALID_OPERATION);
10066 }
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +000010067
Geoff Lang34dbb6f2013-08-05 15:05:47 -040010068 if (!ValidateES3TexStorageParameters(context, target, levels, internalformat, width, height, depth))
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +000010069 {
10070 return;
10071 }
10072
10073 switch (target)
10074 {
10075 case GL_TEXTURE_3D:
10076 {
10077 gl::Texture3D *texture3d = context->getTexture3D();
10078 texture3d->storage(levels, internalformat, width, height, depth);
10079 }
10080 break;
10081
10082 case GL_TEXTURE_2D_ARRAY:
10083 {
10084 gl::Texture2DArray *texture2darray = context->getTexture2DArray();
10085 texture2darray->storage(levels, internalformat, width, height, depth);
10086 }
10087 break;
10088
10089 default:
10090 return gl::error(GL_INVALID_ENUM);
10091 }
shannon.woods%transgaming.com@gtempaccount.com14eb55e2013-04-13 03:35:06 +000010092 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +000010093 }
10094 catch(std::bad_alloc&)
10095 {
10096 return gl::error(GL_OUT_OF_MEMORY);
10097 }
10098}
10099
10100void __stdcall glGetInternalformativ(GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize, GLint* params)
10101{
10102 EVENT("(GLenum target = 0x%X, GLenum internalformat = 0x%X, GLenum pname = 0x%X, GLsizei bufSize = %d, "
10103 "GLint* params = 0x%0.8p)",
10104 target, internalformat, pname, bufSize, params);
10105
10106 try
10107 {
10108 gl::Context *context = gl::getNonLostContext();
10109
10110 if (context)
10111 {
10112 if (context->getClientVersion() < 3)
10113 {
10114 return gl::error(GL_INVALID_OPERATION);
10115 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +000010116
Shannon Woods809d2502013-07-08 10:32:18 -040010117 if (!gl::IsColorRenderingSupported(internalformat, context) &&
10118 !gl::IsDepthRenderingSupported(internalformat, context) &&
10119 !gl::IsStencilRenderingSupported(internalformat, context))
10120 {
10121 return gl::error(GL_INVALID_ENUM);
10122 }
10123
10124 if (target != GL_RENDERBUFFER)
10125 {
10126 return gl::error(GL_INVALID_ENUM);
10127 }
10128
10129 if (bufSize < 0)
10130 {
10131 return gl::error(GL_INVALID_VALUE);
10132 }
10133
10134 switch (pname)
10135 {
10136 case GL_NUM_SAMPLE_COUNTS:
10137 if (bufSize != 0)
10138 *params = context->getNumSampleCounts(internalformat);
10139 break;
10140 case GL_SAMPLES:
10141 context->getSampleCounts(internalformat, bufSize, params);
10142 break;
10143 default:
10144 return gl::error(GL_INVALID_ENUM);
10145 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +000010146 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +000010147 }
10148 catch(std::bad_alloc&)
10149 {
10150 return gl::error(GL_OUT_OF_MEMORY);
10151 }
10152}
10153
10154// Extension functions
10155
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +000010156void __stdcall glBlitFramebufferANGLE(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1,
10157 GLbitfield mask, GLenum filter)
10158{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +000010159 EVENT("(GLint srcX0 = %d, GLint srcY0 = %d, GLint srcX1 = %d, GLint srcY1 = %d, "
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +000010160 "GLint dstX0 = %d, GLint dstY0 = %d, GLint dstX1 = %d, GLint dstY1 = %d, "
10161 "GLbitfield mask = 0x%X, GLenum filter = 0x%X)",
10162 srcX0, srcY0, srcX1, srcX1, dstX0, dstY0, dstX1, dstY1, mask, filter);
10163
10164 try
10165 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +000010166 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +000010167
10168 if (context)
10169 {
Geoff Lang34dbb6f2013-08-05 15:05:47 -040010170 if (!ValidateBlitFramebufferParameters(context, srcX0, srcY0, srcX1, srcY1,
Geoff Lang758d5b22013-06-11 11:42:50 -040010171 dstX0, dstY0, dstX1, dstY1, mask, filter,
10172 true))
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +000010173 {
Geoff Lang758d5b22013-06-11 11:42:50 -040010174 return;
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +000010175 }
10176
Geoff Lang758d5b22013-06-11 11:42:50 -040010177 context->blitFramebuffer(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1,
10178 mask, filter);
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +000010179 }
10180 }
10181 catch(std::bad_alloc&)
10182 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010183 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +000010184 }
10185}
10186
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +000010187void __stdcall glTexImage3DOES(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth,
10188 GLint border, GLenum format, GLenum type, const GLvoid* pixels)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000010189{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +000010190 EVENT("(GLenum target = 0x%X, GLint level = %d, GLenum internalformat = 0x%X, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +000010191 "GLsizei width = %d, GLsizei height = %d, GLsizei depth = %d, GLint border = %d, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +000010192 "GLenum format = 0x%X, GLenum type = 0x%x, const GLvoid* pixels = 0x%0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000010193 target, level, internalformat, width, height, depth, border, format, type, pixels);
10194
10195 try
10196 {
10197 UNIMPLEMENTED(); // FIXME
10198 }
10199 catch(std::bad_alloc&)
10200 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010201 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000010202 }
10203}
daniel@transgaming.comce3d0f22010-05-04 03:35:14 +000010204
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010205void __stdcall glGetProgramBinaryOES(GLuint program, GLsizei bufSize, GLsizei *length,
10206 GLenum *binaryFormat, void *binary)
10207{
apatrick@chromium.org90080e32012-07-09 22:15:33 +000010208 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 +000010209 program, bufSize, length, binaryFormat, binary);
10210
10211 try
10212 {
10213 gl::Context *context = gl::getNonLostContext();
10214
10215 if (context)
10216 {
10217 gl::Program *programObject = context->getProgram(program);
10218
daniel@transgaming.com716056c2012-07-24 18:38:59 +000010219 if (!programObject || !programObject->isLinked())
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010220 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010221 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010222 }
10223
10224 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
10225
10226 if (!programBinary)
10227 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010228 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010229 }
10230
apatrick@chromium.org90080e32012-07-09 22:15:33 +000010231 if (!programBinary->save(binary, bufSize, length))
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010232 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010233 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010234 }
apatrick@chromium.org90080e32012-07-09 22:15:33 +000010235
10236 *binaryFormat = GL_PROGRAM_BINARY_ANGLE;
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010237 }
10238 }
10239 catch(std::bad_alloc&)
10240 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010241 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010242 }
10243}
10244
10245void __stdcall glProgramBinaryOES(GLuint program, GLenum binaryFormat,
10246 const void *binary, GLint length)
10247{
10248 EVENT("(GLenum program = 0x%X, binaryFormat = 0x%x, binary = 0x%0.8p, length = %d)",
10249 program, binaryFormat, binary, length);
10250
10251 try
10252 {
10253 gl::Context *context = gl::getNonLostContext();
10254
10255 if (context)
10256 {
10257 if (binaryFormat != GL_PROGRAM_BINARY_ANGLE)
10258 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010259 return gl::error(GL_INVALID_ENUM);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010260 }
10261
10262 gl::Program *programObject = context->getProgram(program);
10263
10264 if (!programObject)
10265 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010266 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010267 }
10268
daniel@transgaming.com95d29422012-07-24 18:36:10 +000010269 context->setProgramBinary(program, binary, length);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010270 }
10271 }
10272 catch(std::bad_alloc&)
10273 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010274 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010275 }
10276}
10277
shannon.woods%transgaming.com@gtempaccount.com4059a382013-04-13 03:31:16 +000010278void __stdcall glDrawBuffersEXT(GLsizei n, const GLenum *bufs)
10279{
10280 EVENT("(GLenum n = %d, bufs = 0x%0.8p)", n, bufs);
10281
10282 try
10283 {
10284 gl::Context *context = gl::getNonLostContext();
10285
10286 if (context)
10287 {
10288 if (n < 0 || (unsigned int)n > context->getMaximumRenderTargets())
10289 {
10290 return gl::error(GL_INVALID_VALUE);
10291 }
10292
10293 if (context->getDrawFramebufferHandle() == 0)
10294 {
shannon.woods%transgaming.com@gtempaccount.com2fa73c52013-04-13 03:37:20 +000010295 if (n != 1)
shannon.woods%transgaming.com@gtempaccount.com4059a382013-04-13 03:31:16 +000010296 {
10297 return gl::error(GL_INVALID_OPERATION);
10298 }
10299
shannon.woods%transgaming.com@gtempaccount.com2fa73c52013-04-13 03:37:20 +000010300 if (bufs[0] != GL_NONE && bufs[0] != GL_BACK)
shannon.woods%transgaming.com@gtempaccount.com4059a382013-04-13 03:31:16 +000010301 {
shannon.woods%transgaming.com@gtempaccount.com2fa73c52013-04-13 03:37:20 +000010302 return gl::error(GL_INVALID_OPERATION);
shannon.woods%transgaming.com@gtempaccount.com4059a382013-04-13 03:31:16 +000010303 }
10304 }
10305 else
10306 {
10307 for (int colorAttachment = 0; colorAttachment < n; colorAttachment++)
10308 {
10309 const GLenum attachment = GL_COLOR_ATTACHMENT0_EXT + colorAttachment;
10310 if (bufs[colorAttachment] != GL_NONE && bufs[colorAttachment] != attachment)
10311 {
10312 return gl::error(GL_INVALID_OPERATION);
10313 }
10314 }
10315 }
10316
10317 gl::Framebuffer *framebuffer = context->getDrawFramebuffer();
10318
10319 for (int colorAttachment = 0; colorAttachment < n; colorAttachment++)
10320 {
10321 framebuffer->setDrawBufferState(colorAttachment, bufs[colorAttachment]);
10322 }
shannon.woods%transgaming.com@gtempaccount.com2fa73c52013-04-13 03:37:20 +000010323
10324 for (int colorAttachment = n; colorAttachment < (int)context->getMaximumRenderTargets(); colorAttachment++)
10325 {
10326 framebuffer->setDrawBufferState(colorAttachment, GL_NONE);
10327 }
shannon.woods%transgaming.com@gtempaccount.com4059a382013-04-13 03:31:16 +000010328 }
10329 }
10330 catch (std::bad_alloc&)
10331 {
10332 return gl::error(GL_OUT_OF_MEMORY);
10333 }
10334}
10335
daniel@transgaming.comce3d0f22010-05-04 03:35:14 +000010336__eglMustCastToProperFunctionPointerType __stdcall glGetProcAddress(const char *procname)
10337{
10338 struct Extension
10339 {
10340 const char *name;
10341 __eglMustCastToProperFunctionPointerType address;
10342 };
10343
10344 static const Extension glExtensions[] =
10345 {
10346 {"glTexImage3DOES", (__eglMustCastToProperFunctionPointerType)glTexImage3DOES},
daniel@transgaming.com01868132010-08-24 19:21:17 +000010347 {"glBlitFramebufferANGLE", (__eglMustCastToProperFunctionPointerType)glBlitFramebufferANGLE},
daniel@transgaming.com1fe96c92011-01-14 15:08:44 +000010348 {"glRenderbufferStorageMultisampleANGLE", (__eglMustCastToProperFunctionPointerType)glRenderbufferStorageMultisampleANGLE},
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +000010349 {"glDeleteFencesNV", (__eglMustCastToProperFunctionPointerType)glDeleteFencesNV},
10350 {"glGenFencesNV", (__eglMustCastToProperFunctionPointerType)glGenFencesNV},
10351 {"glIsFenceNV", (__eglMustCastToProperFunctionPointerType)glIsFenceNV},
10352 {"glTestFenceNV", (__eglMustCastToProperFunctionPointerType)glTestFenceNV},
10353 {"glGetFenceivNV", (__eglMustCastToProperFunctionPointerType)glGetFenceivNV},
10354 {"glFinishFenceNV", (__eglMustCastToProperFunctionPointerType)glFinishFenceNV},
10355 {"glSetFenceNV", (__eglMustCastToProperFunctionPointerType)glSetFenceNV},
zmo@google.coma574f782011-10-03 21:45:23 +000010356 {"glGetTranslatedShaderSourceANGLE", (__eglMustCastToProperFunctionPointerType)glGetTranslatedShaderSourceANGLE},
daniel@transgaming.com0bd1f2f2011-11-11 04:19:03 +000010357 {"glTexStorage2DEXT", (__eglMustCastToProperFunctionPointerType)glTexStorage2DEXT},
daniel@transgaming.com709ed112011-11-12 03:18:10 +000010358 {"glGetGraphicsResetStatusEXT", (__eglMustCastToProperFunctionPointerType)glGetGraphicsResetStatusEXT},
10359 {"glReadnPixelsEXT", (__eglMustCastToProperFunctionPointerType)glReadnPixelsEXT},
10360 {"glGetnUniformfvEXT", (__eglMustCastToProperFunctionPointerType)glGetnUniformfvEXT},
10361 {"glGetnUniformivEXT", (__eglMustCastToProperFunctionPointerType)glGetnUniformivEXT},
daniel@transgaming.com86bdb822012-01-20 18:24:39 +000010362 {"glGenQueriesEXT", (__eglMustCastToProperFunctionPointerType)glGenQueriesEXT},
10363 {"glDeleteQueriesEXT", (__eglMustCastToProperFunctionPointerType)glDeleteQueriesEXT},
10364 {"glIsQueryEXT", (__eglMustCastToProperFunctionPointerType)glIsQueryEXT},
10365 {"glBeginQueryEXT", (__eglMustCastToProperFunctionPointerType)glBeginQueryEXT},
10366 {"glEndQueryEXT", (__eglMustCastToProperFunctionPointerType)glEndQueryEXT},
10367 {"glGetQueryivEXT", (__eglMustCastToProperFunctionPointerType)glGetQueryivEXT},
10368 {"glGetQueryObjectuivEXT", (__eglMustCastToProperFunctionPointerType)glGetQueryObjectuivEXT},
shannon.woods%transgaming.com@gtempaccount.com77d94722013-04-13 03:34:22 +000010369 {"glDrawBuffersEXT", (__eglMustCastToProperFunctionPointerType)glDrawBuffersEXT},
daniel@transgaming.comdce02fd2012-01-27 15:39:51 +000010370 {"glVertexAttribDivisorANGLE", (__eglMustCastToProperFunctionPointerType)glVertexAttribDivisorANGLE},
10371 {"glDrawArraysInstancedANGLE", (__eglMustCastToProperFunctionPointerType)glDrawArraysInstancedANGLE},
10372 {"glDrawElementsInstancedANGLE", (__eglMustCastToProperFunctionPointerType)glDrawElementsInstancedANGLE},
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010373 {"glGetProgramBinaryOES", (__eglMustCastToProperFunctionPointerType)glGetProgramBinaryOES},
10374 {"glProgramBinaryOES", (__eglMustCastToProperFunctionPointerType)glProgramBinaryOES}, };
daniel@transgaming.comce3d0f22010-05-04 03:35:14 +000010375
shannon.woods@transgaming.comd438fd42013-02-28 23:17:45 +000010376 for (unsigned int ext = 0; ext < ArraySize(glExtensions); ext++)
daniel@transgaming.comce3d0f22010-05-04 03:35:14 +000010377 {
10378 if (strcmp(procname, glExtensions[ext].name) == 0)
10379 {
10380 return (__eglMustCastToProperFunctionPointerType)glExtensions[ext].address;
10381 }
10382 }
10383
10384 return NULL;
10385}
10386
daniel@transgaming.com17f548c2011-11-09 17:47:02 +000010387// Non-public functions used by EGL
10388
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +000010389bool __stdcall glBindTexImage(egl::Surface *surface)
jbauman@chromium.orgae345802011-03-30 22:04:25 +000010390{
10391 EVENT("(egl::Surface* surface = 0x%0.8p)",
10392 surface);
10393
10394 try
10395 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +000010396 gl::Context *context = gl::getNonLostContext();
jbauman@chromium.orgae345802011-03-30 22:04:25 +000010397
10398 if (context)
10399 {
10400 gl::Texture2D *textureObject = context->getTexture2D();
10401
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +000010402 if (textureObject->isImmutable())
10403 {
10404 return false;
10405 }
10406
jbauman@chromium.orgae345802011-03-30 22:04:25 +000010407 if (textureObject)
10408 {
10409 textureObject->bindTexImage(surface);
10410 }
10411 }
10412 }
10413 catch(std::bad_alloc&)
10414 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010415 return gl::error(GL_OUT_OF_MEMORY, false);
jbauman@chromium.orgae345802011-03-30 22:04:25 +000010416 }
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +000010417
10418 return true;
jbauman@chromium.orgae345802011-03-30 22:04:25 +000010419}
10420
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000010421}