blob: 9e3e42b5f35da3e286222a7a45ca93d61acf884a [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
Jamie Madill35d15012013-10-07 10:46:37 -040030gl::Texture *GetTargetTexture(gl::Context *context, GLenum target)
Jamie Madillfb8a8302013-07-03 14:24:12 -040031{
Jamie Madill35d15012013-10-07 10:46:37 -040032 if (!ValidTextureTarget(context, target))
Jamie Madillfb8a8302013-07-03 14:24:12 -040033 {
Jamie Madill35d15012013-10-07 10:46:37 -040034 return NULL;
Jamie Madillfb8a8302013-07-03 14:24:12 -040035 }
36
37 switch (target)
38 {
39 case GL_TEXTURE_2D: return context->getTexture2D();
40 case GL_TEXTURE_CUBE_MAP: return context->getTextureCubeMap();
41 case GL_TEXTURE_3D: return context->getTexture3D();
42 case GL_TEXTURE_2D_ARRAY: return context->getTexture2DArray();
43 default: return NULL;
44 }
45}
Jamie Madill478fdb22013-07-19 16:36:59 -040046
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000047extern "C"
48{
49
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +000050// OpenGL ES 2.0 functions
51
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000052void __stdcall glActiveTexture(GLenum texture)
53{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +000054 EVENT("(GLenum texture = 0x%X)", texture);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000055
56 try
57 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +000058 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000059
60 if (context)
61 {
daniel@transgaming.com3f74c7a2011-05-11 15:36:51 +000062 if (texture < GL_TEXTURE0 || texture > GL_TEXTURE0 + context->getMaximumCombinedTextureImageUnits() - 1)
63 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000064 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com3f74c7a2011-05-11 15:36:51 +000065 }
66
daniel@transgaming.com428d1582010-05-04 03:35:25 +000067 context->setActiveSampler(texture - GL_TEXTURE0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000068 }
69 }
70 catch(std::bad_alloc&)
71 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000072 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000073 }
74}
75
76void __stdcall glAttachShader(GLuint program, GLuint shader)
77{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +000078 EVENT("(GLuint program = %d, GLuint shader = %d)", program, shader);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000079
80 try
81 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +000082 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000083
84 if (context)
85 {
86 gl::Program *programObject = context->getProgram(program);
87 gl::Shader *shaderObject = context->getShader(shader);
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +000088
daniel@transgaming.come9d6ed02010-04-13 03:26:23 +000089 if (!programObject)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000090 {
daniel@transgaming.come9d6ed02010-04-13 03:26:23 +000091 if (context->getShader(program))
92 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000093 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.come9d6ed02010-04-13 03:26:23 +000094 }
95 else
96 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000097 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.come9d6ed02010-04-13 03:26:23 +000098 }
99 }
100
101 if (!shaderObject)
102 {
103 if (context->getProgram(shader))
104 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000105 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.come9d6ed02010-04-13 03:26:23 +0000106 }
107 else
108 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000109 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.come9d6ed02010-04-13 03:26:23 +0000110 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000111 }
112
113 if (!programObject->attachShader(shaderObject))
114 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000115 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000116 }
117 }
118 }
119 catch(std::bad_alloc&)
120 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000121 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000122 }
123}
124
daniel@transgaming.com86bdb822012-01-20 18:24:39 +0000125void __stdcall glBeginQueryEXT(GLenum target, GLuint id)
126{
127 EVENT("(GLenum target = 0x%X, GLuint %d)", target, id);
128
129 try
130 {
131 switch (target)
132 {
133 case GL_ANY_SAMPLES_PASSED_EXT:
134 case GL_ANY_SAMPLES_PASSED_CONSERVATIVE_EXT:
135 break;
136 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000137 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +0000138 }
139
140 if (id == 0)
141 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000142 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +0000143 }
144
145 gl::Context *context = gl::getNonLostContext();
146
147 if (context)
148 {
149 context->beginQuery(target, id);
150 }
151 }
152 catch(std::bad_alloc&)
153 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000154 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +0000155 }
156}
157
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +0000158void __stdcall glBindAttribLocation(GLuint program, GLuint index, const GLchar* name)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000159{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000160 EVENT("(GLuint program = %d, GLuint index = %d, const GLchar* name = 0x%0.8p)", program, index, name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000161
162 try
163 {
164 if (index >= gl::MAX_VERTEX_ATTRIBS)
165 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000166 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000167 }
168
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000169 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000170
171 if (context)
172 {
173 gl::Program *programObject = context->getProgram(program);
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +0000174
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000175 if (!programObject)
176 {
daniel@transgaming.com98079832010-04-13 03:26:29 +0000177 if (context->getShader(program))
178 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000179 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com98079832010-04-13 03:26:29 +0000180 }
181 else
182 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000183 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com98079832010-04-13 03:26:29 +0000184 }
185 }
186
187 if (strncmp(name, "gl_", 3) == 0)
188 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000189 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000190 }
191
192 programObject->bindAttributeLocation(index, name);
193 }
194 }
195 catch(std::bad_alloc&)
196 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000197 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000198 }
199}
200
201void __stdcall glBindBuffer(GLenum target, GLuint buffer)
202{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000203 EVENT("(GLenum target = 0x%X, GLuint buffer = %d)", target, buffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000204
205 try
206 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000207 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000208
209 if (context)
210 {
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +0000211 // Check ES3 specific targets
212 switch (target)
213 {
shannon.woods%transgaming.com@gtempaccount.com51171882013-04-13 03:39:10 +0000214 case GL_COPY_READ_BUFFER:
215 case GL_COPY_WRITE_BUFFER:
shannon.woods%transgaming.com@gtempaccount.comc926e5f2013-04-13 03:39:18 +0000216 case GL_PIXEL_PACK_BUFFER:
217 case GL_PIXEL_UNPACK_BUFFER:
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +0000218 case GL_UNIFORM_BUFFER:
219 case GL_TRANSFORM_FEEDBACK_BUFFER:
220 if (context->getClientVersion() < 3)
221 {
222 return gl::error(GL_INVALID_ENUM);
223 }
224 }
225
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000226 switch (target)
227 {
228 case GL_ARRAY_BUFFER:
229 context->bindArrayBuffer(buffer);
230 return;
231 case GL_ELEMENT_ARRAY_BUFFER:
232 context->bindElementArrayBuffer(buffer);
233 return;
shannon.woods%transgaming.com@gtempaccount.com51171882013-04-13 03:39:10 +0000234 case GL_COPY_READ_BUFFER:
235 context->bindCopyReadBuffer(buffer);
236 return;
237 case GL_COPY_WRITE_BUFFER:
238 context->bindCopyWriteBuffer(buffer);
239 return;
shannon.woods%transgaming.com@gtempaccount.comc926e5f2013-04-13 03:39:18 +0000240 case GL_PIXEL_PACK_BUFFER:
241 context->bindPixelPackBuffer(buffer);
242 return;
243 case GL_PIXEL_UNPACK_BUFFER:
244 context->bindPixelUnpackBuffer(buffer);
245 return;
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +0000246 case GL_UNIFORM_BUFFER:
247 context->bindGenericUniformBuffer(buffer);
248 return;
249 case GL_TRANSFORM_FEEDBACK_BUFFER:
shannonwoods@chromium.org7a1ebad2013-05-30 00:05:20 +0000250 context->bindGenericTransformFeedbackBuffer(buffer);
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +0000251 return;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000252 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000253 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000254 }
255 }
256 }
257 catch(std::bad_alloc&)
258 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000259 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000260 }
261}
262
263void __stdcall glBindFramebuffer(GLenum target, GLuint framebuffer)
264{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000265 EVENT("(GLenum target = 0x%X, GLuint framebuffer = %d)", target, framebuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000266
267 try
268 {
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +0000269 if (target != GL_FRAMEBUFFER && target != GL_DRAW_FRAMEBUFFER_ANGLE && target != GL_READ_FRAMEBUFFER_ANGLE)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000270 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000271 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000272 }
273
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000274 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000275
276 if (context)
277 {
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +0000278 if (target == GL_READ_FRAMEBUFFER_ANGLE || target == GL_FRAMEBUFFER)
279 {
280 context->bindReadFramebuffer(framebuffer);
281 }
282
283 if (target == GL_DRAW_FRAMEBUFFER_ANGLE || target == GL_FRAMEBUFFER)
284 {
285 context->bindDrawFramebuffer(framebuffer);
286 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000287 }
288 }
289 catch(std::bad_alloc&)
290 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000291 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000292 }
293}
294
295void __stdcall glBindRenderbuffer(GLenum target, GLuint renderbuffer)
296{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000297 EVENT("(GLenum target = 0x%X, GLuint renderbuffer = %d)", target, renderbuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000298
299 try
300 {
301 if (target != GL_RENDERBUFFER)
302 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000303 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000304 }
305
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000306 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000307
308 if (context)
309 {
310 context->bindRenderbuffer(renderbuffer);
311 }
312 }
313 catch(std::bad_alloc&)
314 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000315 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000316 }
317}
318
319void __stdcall glBindTexture(GLenum target, GLuint texture)
320{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000321 EVENT("(GLenum target = 0x%X, GLuint texture = %d)", target, texture);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000322
323 try
324 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000325 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000326
327 if (context)
328 {
329 gl::Texture *textureObject = context->getTexture(texture);
330
331 if (textureObject && textureObject->getTarget() != target && texture != 0)
332 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000333 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000334 }
335
336 switch (target)
337 {
338 case GL_TEXTURE_2D:
339 context->bindTexture2D(texture);
340 return;
341 case GL_TEXTURE_CUBE_MAP:
342 context->bindTextureCubeMap(texture);
343 return;
shannon.woods%transgaming.com@gtempaccount.comc416e1c2013-04-13 03:45:05 +0000344 case GL_TEXTURE_3D:
345 if (context->getClientVersion() < 3)
346 {
347 return gl::error(GL_INVALID_ENUM);
348 }
349 context->bindTexture3D(texture);
350 return;
shannon.woods%transgaming.com@gtempaccount.com90dbc442013-04-13 03:46:14 +0000351 case GL_TEXTURE_2D_ARRAY:
352 if (context->getClientVersion() < 3)
353 {
354 return gl::error(GL_INVALID_ENUM);
355 }
356 context->bindTexture2DArray(texture);
357 return;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000358 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000359 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000360 }
361 }
362 }
363 catch(std::bad_alloc&)
364 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000365 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000366 }
367}
368
369void __stdcall glBlendColor(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha)
370{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000371 EVENT("(GLclampf red = %f, GLclampf green = %f, GLclampf blue = %f, GLclampf alpha = %f)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +0000372 red, green, blue, alpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000373
374 try
375 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000376 gl::Context* context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000377
378 if (context)
379 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +0000380 context->setBlendColor(gl::clamp01(red), gl::clamp01(green), gl::clamp01(blue), gl::clamp01(alpha));
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000381 }
382 }
383 catch(std::bad_alloc&)
384 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000385 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000386 }
387}
388
389void __stdcall glBlendEquation(GLenum mode)
390{
391 glBlendEquationSeparate(mode, mode);
392}
393
394void __stdcall glBlendEquationSeparate(GLenum modeRGB, GLenum modeAlpha)
395{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000396 EVENT("(GLenum modeRGB = 0x%X, GLenum modeAlpha = 0x%X)", modeRGB, modeAlpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000397
398 try
399 {
shannon.woods%transgaming.com@gtempaccount.com00b6a0e2013-04-13 03:38:00 +0000400 gl::Context *context = gl::getNonLostContext();
401
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000402 switch (modeRGB)
403 {
404 case GL_FUNC_ADD:
405 case GL_FUNC_SUBTRACT:
406 case GL_FUNC_REVERSE_SUBTRACT:
407 break;
shannon.woods%transgaming.com@gtempaccount.com00b6a0e2013-04-13 03:38:00 +0000408
409 case GL_MIN:
410 case GL_MAX:
411 if (context && context->getClientVersion() < 3)
412 {
413 return gl::error(GL_INVALID_ENUM);
414 }
415 break;
416
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000417 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000418 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000419 }
420
421 switch (modeAlpha)
422 {
423 case GL_FUNC_ADD:
424 case GL_FUNC_SUBTRACT:
425 case GL_FUNC_REVERSE_SUBTRACT:
426 break;
shannon.woods%transgaming.com@gtempaccount.com00b6a0e2013-04-13 03:38:00 +0000427
428 case GL_MIN:
429 case GL_MAX:
430 if (context && context->getClientVersion() < 3)
431 {
432 return gl::error(GL_INVALID_ENUM);
433 }
434 break;
435
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000436 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000437 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000438 }
439
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000440 if (context)
441 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +0000442 context->setBlendEquation(modeRGB, modeAlpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000443 }
444 }
445 catch(std::bad_alloc&)
446 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000447 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000448 }
449}
450
451void __stdcall glBlendFunc(GLenum sfactor, GLenum dfactor)
452{
453 glBlendFuncSeparate(sfactor, dfactor, sfactor, dfactor);
454}
455
456void __stdcall glBlendFuncSeparate(GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha)
457{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000458 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 +0000459 srcRGB, dstRGB, srcAlpha, dstAlpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000460
461 try
462 {
shannonwoods@chromium.org48ae0252013-05-30 00:13:22 +0000463 gl::Context *context = gl::getNonLostContext();
464
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000465 switch (srcRGB)
466 {
467 case GL_ZERO:
468 case GL_ONE:
469 case GL_SRC_COLOR:
470 case GL_ONE_MINUS_SRC_COLOR:
471 case GL_DST_COLOR:
472 case GL_ONE_MINUS_DST_COLOR:
473 case GL_SRC_ALPHA:
474 case GL_ONE_MINUS_SRC_ALPHA:
475 case GL_DST_ALPHA:
476 case GL_ONE_MINUS_DST_ALPHA:
477 case GL_CONSTANT_COLOR:
478 case GL_ONE_MINUS_CONSTANT_COLOR:
479 case GL_CONSTANT_ALPHA:
480 case GL_ONE_MINUS_CONSTANT_ALPHA:
481 case GL_SRC_ALPHA_SATURATE:
482 break;
483 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000484 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000485 }
486
487 switch (dstRGB)
488 {
489 case GL_ZERO:
490 case GL_ONE:
491 case GL_SRC_COLOR:
492 case GL_ONE_MINUS_SRC_COLOR:
493 case GL_DST_COLOR:
494 case GL_ONE_MINUS_DST_COLOR:
495 case GL_SRC_ALPHA:
496 case GL_ONE_MINUS_SRC_ALPHA:
497 case GL_DST_ALPHA:
498 case GL_ONE_MINUS_DST_ALPHA:
499 case GL_CONSTANT_COLOR:
500 case GL_ONE_MINUS_CONSTANT_COLOR:
501 case GL_CONSTANT_ALPHA:
502 case GL_ONE_MINUS_CONSTANT_ALPHA:
503 break;
shannonwoods@chromium.org48ae0252013-05-30 00:13:22 +0000504
505 case GL_SRC_ALPHA_SATURATE:
506 if (!context || context->getClientVersion() < 3)
507 {
508 return gl::error(GL_INVALID_ENUM);
509 }
510 break;
511
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000512 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000513 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000514 }
515
516 switch (srcAlpha)
517 {
518 case GL_ZERO:
519 case GL_ONE:
520 case GL_SRC_COLOR:
521 case GL_ONE_MINUS_SRC_COLOR:
522 case GL_DST_COLOR:
523 case GL_ONE_MINUS_DST_COLOR:
524 case GL_SRC_ALPHA:
525 case GL_ONE_MINUS_SRC_ALPHA:
526 case GL_DST_ALPHA:
527 case GL_ONE_MINUS_DST_ALPHA:
528 case GL_CONSTANT_COLOR:
529 case GL_ONE_MINUS_CONSTANT_COLOR:
530 case GL_CONSTANT_ALPHA:
531 case GL_ONE_MINUS_CONSTANT_ALPHA:
532 case GL_SRC_ALPHA_SATURATE:
533 break;
534 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000535 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000536 }
537
538 switch (dstAlpha)
539 {
540 case GL_ZERO:
541 case GL_ONE:
542 case GL_SRC_COLOR:
543 case GL_ONE_MINUS_SRC_COLOR:
544 case GL_DST_COLOR:
545 case GL_ONE_MINUS_DST_COLOR:
546 case GL_SRC_ALPHA:
547 case GL_ONE_MINUS_SRC_ALPHA:
548 case GL_DST_ALPHA:
549 case GL_ONE_MINUS_DST_ALPHA:
550 case GL_CONSTANT_COLOR:
551 case GL_ONE_MINUS_CONSTANT_COLOR:
552 case GL_CONSTANT_ALPHA:
553 case GL_ONE_MINUS_CONSTANT_ALPHA:
554 break;
shannonwoods@chromium.org48ae0252013-05-30 00:13:22 +0000555
556 case GL_SRC_ALPHA_SATURATE:
557 if (!context || context->getClientVersion() < 3)
558 {
559 return gl::error(GL_INVALID_ENUM);
560 }
561 break;
562
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000563 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000564 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000565 }
566
daniel@transgaming.comfe453652010-03-16 06:23:28 +0000567 bool constantColorUsed = (srcRGB == GL_CONSTANT_COLOR || srcRGB == GL_ONE_MINUS_CONSTANT_COLOR ||
568 dstRGB == GL_CONSTANT_COLOR || dstRGB == GL_ONE_MINUS_CONSTANT_COLOR);
569
570 bool constantAlphaUsed = (srcRGB == GL_CONSTANT_ALPHA || srcRGB == GL_ONE_MINUS_CONSTANT_ALPHA ||
571 dstRGB == GL_CONSTANT_ALPHA || dstRGB == GL_ONE_MINUS_CONSTANT_ALPHA);
572
573 if (constantColorUsed && constantAlphaUsed)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000574 {
daniel@transgaming.comfe453652010-03-16 06:23:28 +0000575 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 +0000576 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000577 }
578
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000579 if (context)
580 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +0000581 context->setBlendFactors(srcRGB, dstRGB, srcAlpha, dstAlpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000582 }
583 }
584 catch(std::bad_alloc&)
585 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000586 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000587 }
588}
589
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +0000590void __stdcall glBufferData(GLenum target, GLsizeiptr size, const GLvoid* data, GLenum usage)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000591{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000592 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 +0000593 target, size, data, usage);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000594
595 try
596 {
597 if (size < 0)
598 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000599 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000600 }
601
shannon.woods%transgaming.com@gtempaccount.comf2db40b2013-04-13 03:37:09 +0000602 gl::Context *context = gl::getNonLostContext();
603
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000604 switch (usage)
605 {
606 case GL_STREAM_DRAW:
607 case GL_STATIC_DRAW:
608 case GL_DYNAMIC_DRAW:
609 break;
shannon.woods%transgaming.com@gtempaccount.comf2db40b2013-04-13 03:37:09 +0000610
611 case GL_STREAM_READ:
612 case GL_STREAM_COPY:
613 case GL_STATIC_READ:
614 case GL_STATIC_COPY:
615 case GL_DYNAMIC_READ:
616 case GL_DYNAMIC_COPY:
617 if (context && context->getClientVersion() < 3)
618 {
619 return gl::error(GL_INVALID_ENUM);
620 }
621 break;
622
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000623 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000624 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000625 }
626
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000627 if (context)
628 {
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +0000629 // Check ES3 specific targets
630 switch (target)
631 {
shannon.woods%transgaming.com@gtempaccount.com51171882013-04-13 03:39:10 +0000632 case GL_COPY_READ_BUFFER:
633 case GL_COPY_WRITE_BUFFER:
shannon.woods%transgaming.com@gtempaccount.comc926e5f2013-04-13 03:39:18 +0000634 case GL_PIXEL_PACK_BUFFER:
635 case GL_PIXEL_UNPACK_BUFFER:
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +0000636 case GL_UNIFORM_BUFFER:
637 case GL_TRANSFORM_FEEDBACK_BUFFER:
638 if (context->getClientVersion() < 3)
639 {
640 return gl::error(GL_INVALID_ENUM);
641 }
642 }
643
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000644 gl::Buffer *buffer;
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +0000645
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000646 switch (target)
647 {
648 case GL_ARRAY_BUFFER:
649 buffer = context->getArrayBuffer();
650 break;
651 case GL_ELEMENT_ARRAY_BUFFER:
652 buffer = context->getElementArrayBuffer();
653 break;
shannon.woods%transgaming.com@gtempaccount.com51171882013-04-13 03:39:10 +0000654 case GL_COPY_READ_BUFFER:
655 buffer = context->getCopyReadBuffer();
656 break;
657 case GL_COPY_WRITE_BUFFER:
658 buffer = context->getCopyWriteBuffer();
659 break;
shannon.woods%transgaming.com@gtempaccount.comc926e5f2013-04-13 03:39:18 +0000660 case GL_PIXEL_PACK_BUFFER:
661 buffer = context->getPixelPackBuffer();
662 break;
663 case GL_PIXEL_UNPACK_BUFFER:
664 buffer = context->getPixelUnpackBuffer();
665 break;
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +0000666 case GL_TRANSFORM_FEEDBACK_BUFFER:
667 buffer = context->getGenericTransformFeedbackBuffer();
668 break;
669 case GL_UNIFORM_BUFFER:
670 buffer = context->getGenericUniformBuffer();
671 break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000672 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000673 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000674 }
675
676 if (!buffer)
677 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000678 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000679 }
680
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +0000681 buffer->bufferData(data, size, usage);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000682 }
683 }
684 catch(std::bad_alloc&)
685 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000686 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000687 }
688}
689
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +0000690void __stdcall glBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid* data)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000691{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000692 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 +0000693 target, offset, size, data);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000694
695 try
696 {
daniel@transgaming.comdefa1c32010-05-18 18:51:45 +0000697 if (size < 0 || offset < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000698 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000699 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000700 }
701
daniel@transgaming.comd4620a32010-03-21 04:31:28 +0000702 if (data == NULL)
703 {
704 return;
705 }
706
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000707 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +0000708
709 if (context)
710 {
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +0000711 // Check ES3 specific targets
712 switch (target)
713 {
shannon.woods%transgaming.com@gtempaccount.com51171882013-04-13 03:39:10 +0000714 case GL_COPY_READ_BUFFER:
715 case GL_COPY_WRITE_BUFFER:
shannon.woods%transgaming.com@gtempaccount.comc926e5f2013-04-13 03:39:18 +0000716 case GL_PIXEL_PACK_BUFFER:
717 case GL_PIXEL_UNPACK_BUFFER:
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +0000718 case GL_UNIFORM_BUFFER:
719 case GL_TRANSFORM_FEEDBACK_BUFFER:
720 if (context->getClientVersion() < 3)
721 {
722 return gl::error(GL_INVALID_ENUM);
723 }
724 }
725
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +0000726 gl::Buffer *buffer;
727
728 switch (target)
729 {
730 case GL_ARRAY_BUFFER:
731 buffer = context->getArrayBuffer();
732 break;
733 case GL_ELEMENT_ARRAY_BUFFER:
734 buffer = context->getElementArrayBuffer();
735 break;
shannon.woods%transgaming.com@gtempaccount.com51171882013-04-13 03:39:10 +0000736 case GL_COPY_READ_BUFFER:
737 buffer = context->getCopyReadBuffer();
738 break;
739 case GL_COPY_WRITE_BUFFER:
740 buffer = context->getCopyWriteBuffer();
741 break;
shannon.woods%transgaming.com@gtempaccount.comc926e5f2013-04-13 03:39:18 +0000742 case GL_PIXEL_PACK_BUFFER:
743 buffer = context->getPixelPackBuffer();
744 break;
745 case GL_PIXEL_UNPACK_BUFFER:
746 buffer = context->getPixelUnpackBuffer();
747 break;
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +0000748 case GL_TRANSFORM_FEEDBACK_BUFFER:
749 buffer = context->getGenericTransformFeedbackBuffer();
750 break;
751 case GL_UNIFORM_BUFFER:
752 buffer = context->getGenericUniformBuffer();
753 break;
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +0000754 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000755 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +0000756 }
757
758 if (!buffer)
759 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000760 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +0000761 }
762
daniel@transgaming.comdefa1c32010-05-18 18:51:45 +0000763 if ((size_t)size + offset > buffer->size())
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +0000764 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000765 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +0000766 }
daniel@transgaming.comdefa1c32010-05-18 18:51:45 +0000767
768 buffer->bufferSubData(data, size, offset);
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +0000769 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000770 }
771 catch(std::bad_alloc&)
772 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000773 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000774 }
775}
776
777GLenum __stdcall glCheckFramebufferStatus(GLenum target)
778{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000779 EVENT("(GLenum target = 0x%X)", target);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000780
781 try
782 {
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +0000783 if (target != GL_FRAMEBUFFER && target != GL_DRAW_FRAMEBUFFER_ANGLE && target != GL_READ_FRAMEBUFFER_ANGLE)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000784 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000785 return gl::error(GL_INVALID_ENUM, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000786 }
787
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000788 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000789
790 if (context)
791 {
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +0000792 gl::Framebuffer *framebuffer = NULL;
793 if (target == GL_READ_FRAMEBUFFER_ANGLE)
794 {
795 framebuffer = context->getReadFramebuffer();
796 }
797 else
798 {
799 framebuffer = context->getDrawFramebuffer();
800 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000801
802 return framebuffer->completeness();
803 }
804 }
805 catch(std::bad_alloc&)
806 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000807 return gl::error(GL_OUT_OF_MEMORY, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000808 }
809
810 return 0;
811}
812
813void __stdcall glClear(GLbitfield mask)
814{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +0000815 EVENT("(GLbitfield mask = 0x%X)", mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000816
817 try
818 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000819 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000820
821 if (context)
822 {
Geoff Lang0b833232013-08-21 10:13:29 -0400823 gl::Framebuffer *framebufferObject = context->getDrawFramebuffer();
824
825 if (!framebufferObject || framebufferObject->completeness() != GL_FRAMEBUFFER_COMPLETE)
826 {
827 return gl::error(GL_INVALID_FRAMEBUFFER_OPERATION);
828 }
829
830 if ((mask & ~(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT)) != 0)
831 {
832 return gl::error(GL_INVALID_VALUE);
833 }
834
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000835 context->clear(mask);
836 }
837 }
838 catch(std::bad_alloc&)
839 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000840 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000841 }
842}
843
844void __stdcall glClearColor(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha)
845{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000846 EVENT("(GLclampf red = %f, GLclampf green = %f, GLclampf blue = %f, GLclampf alpha = %f)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +0000847 red, green, blue, alpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000848
849 try
850 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000851 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000852
853 if (context)
854 {
855 context->setClearColor(red, green, blue, alpha);
856 }
857 }
858 catch(std::bad_alloc&)
859 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000860 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000861 }
862}
863
864void __stdcall glClearDepthf(GLclampf depth)
865{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000866 EVENT("(GLclampf depth = %f)", depth);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000867
868 try
869 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000870 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000871
872 if (context)
873 {
874 context->setClearDepth(depth);
875 }
876 }
877 catch(std::bad_alloc&)
878 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000879 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000880 }
881}
882
883void __stdcall glClearStencil(GLint s)
884{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000885 EVENT("(GLint s = %d)", s);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000886
887 try
888 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000889 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000890
891 if (context)
892 {
893 context->setClearStencil(s);
894 }
895 }
896 catch(std::bad_alloc&)
897 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000898 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000899 }
900}
901
902void __stdcall glColorMask(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha)
903{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +0000904 EVENT("(GLboolean red = %d, GLboolean green = %u, GLboolean blue = %u, GLboolean alpha = %u)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +0000905 red, green, blue, alpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000906
907 try
908 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000909 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000910
911 if (context)
912 {
daniel@transgaming.coma36f98e2010-05-18 18:51:09 +0000913 context->setColorMask(red == GL_TRUE, green == GL_TRUE, blue == GL_TRUE, alpha == GL_TRUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000914 }
915 }
916 catch(std::bad_alloc&)
917 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000918 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000919 }
920}
921
922void __stdcall glCompileShader(GLuint shader)
923{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000924 EVENT("(GLuint shader = %d)", shader);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000925
926 try
927 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000928 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000929
930 if (context)
931 {
932 gl::Shader *shaderObject = context->getShader(shader);
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +0000933
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000934 if (!shaderObject)
935 {
daniel@transgaming.com0cefaf42010-04-13 03:26:36 +0000936 if (context->getProgram(shader))
937 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000938 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com0cefaf42010-04-13 03:26:36 +0000939 }
940 else
941 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000942 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com0cefaf42010-04-13 03:26:36 +0000943 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000944 }
945
946 shaderObject->compile();
947 }
948 }
949 catch(std::bad_alloc&)
950 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000951 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000952 }
953}
954
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +0000955void __stdcall glCompressedTexImage2D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height,
956 GLint border, GLsizei imageSize, const GLvoid* data)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000957{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000958 EVENT("(GLenum target = 0x%X, GLint level = %d, GLenum internalformat = 0x%X, GLsizei width = %d, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +0000959 "GLsizei height = %d, GLint border = %d, GLsizei imageSize = %d, const GLvoid* data = 0x%0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000960 target, level, internalformat, width, height, border, imageSize, data);
961
962 try
963 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000964 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com01868132010-08-24 19:21:17 +0000965
966 if (context)
967 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000968 if (context->getClientVersion() < 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -0400969 !ValidateES2TexImageParameters(context, target, level, internalformat, true, false,
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000970 0, 0, width, height, 0, GL_NONE, GL_NONE, data))
971 {
972 return;
973 }
974
975 if (context->getClientVersion() >= 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -0400976 !ValidateES3TexImageParameters(context, target, level, internalformat, true, false,
Jamie Madillefb2a6f2013-09-24 10:22:42 -0400977 0, 0, 0, width, height, 1, 0, GL_NONE, GL_NONE, data))
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000978 {
979 return;
980 }
981
982 if (imageSize < 0 || imageSize != (GLsizei)gl::GetBlockSize(internalformat, GL_UNSIGNED_BYTE, context->getClientVersion(), width, height))
daniel@transgaming.com5d752f22010-10-07 13:37:20 +0000983 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000984 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +0000985 }
986
987 switch (target)
988 {
989 case GL_TEXTURE_2D:
daniel@transgaming.com5d752f22010-10-07 13:37:20 +0000990 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000991 gl::Texture2D *texture = context->getTexture2D();
992 texture->setCompressedImage(level, internalformat, width, height, imageSize, data);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +0000993 }
994 break;
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000995
daniel@transgaming.com5d752f22010-10-07 13:37:20 +0000996 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
997 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
998 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
999 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
1000 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
1001 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001002 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001003 gl::TextureCubeMap *texture = context->getTextureCubeMap();
1004 texture->setCompressedImage(target, level, internalformat, width, height, imageSize, data);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001005 }
1006 break;
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001007
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001008 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001009 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001010 }
daniel@transgaming.com01868132010-08-24 19:21:17 +00001011 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001012 }
1013 catch(std::bad_alloc&)
1014 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001015 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001016 }
1017}
1018
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00001019void __stdcall glCompressedTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height,
1020 GLenum format, GLsizei imageSize, const GLvoid* data)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001021{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001022 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001023 "GLsizei width = %d, GLsizei height = %d, GLenum format = 0x%X, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00001024 "GLsizei imageSize = %d, const GLvoid* data = 0x%0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001025 target, level, xoffset, yoffset, width, height, format, imageSize, data);
1026
1027 try
1028 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001029 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com01868132010-08-24 19:21:17 +00001030
1031 if (context)
1032 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001033 if (context->getClientVersion() < 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -04001034 !ValidateES2TexImageParameters(context, target, level, GL_NONE, true, true,
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001035 xoffset, yoffset, width, height, 0, GL_NONE, GL_NONE, data))
1036 {
1037 return;
1038 }
1039
1040 if (context->getClientVersion() >= 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -04001041 !ValidateES3TexImageParameters(context, target, level, GL_NONE, true, true,
Jamie Madillefb2a6f2013-09-24 10:22:42 -04001042 xoffset, yoffset, 0, width, height, 1, 0, GL_NONE, GL_NONE, data))
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001043 {
1044 return;
1045 }
1046
1047 if (imageSize < 0 || imageSize != (GLsizei)gl::GetBlockSize(format, GL_UNSIGNED_BYTE, context->getClientVersion(), width, height))
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001048 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001049 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001050 }
1051
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001052 switch (target)
daniel@transgaming.com01868132010-08-24 19:21:17 +00001053 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001054 case GL_TEXTURE_2D:
daniel@transgaming.com01868132010-08-24 19:21:17 +00001055 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001056 gl::Texture2D *texture = context->getTexture2D();
daniel@transgaming.com343373a2011-11-29 19:42:32 +00001057 texture->subImageCompressed(level, xoffset, yoffset, width, height, format, imageSize, data);
daniel@transgaming.com01868132010-08-24 19:21:17 +00001058 }
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001059 break;
1060
1061 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
1062 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
1063 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
1064 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
1065 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
1066 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
daniel@transgaming.com01868132010-08-24 19:21:17 +00001067 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001068 gl::TextureCubeMap *texture = context->getTextureCubeMap();
daniel@transgaming.com343373a2011-11-29 19:42:32 +00001069 texture->subImageCompressed(target, level, xoffset, yoffset, width, height, format, imageSize, data);
daniel@transgaming.com01868132010-08-24 19:21:17 +00001070 }
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001071 break;
1072
1073 default:
1074 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com01868132010-08-24 19:21:17 +00001075 }
1076 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001077 }
1078 catch(std::bad_alloc&)
1079 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001080 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001081 }
1082}
1083
1084void __stdcall glCopyTexImage2D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border)
1085{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001086 EVENT("(GLenum target = 0x%X, GLint level = %d, GLenum internalformat = 0x%X, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001087 "GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d, GLint border = %d)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001088 target, level, internalformat, x, y, width, height, border);
1089
1090 try
1091 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001092 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001093
1094 if (context)
1095 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001096 if (context->getClientVersion() < 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -04001097 !ValidateES2CopyTexImageParameters(context, target, level, internalformat, false,
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001098 0, 0, x, y, width, height, border))
daniel@transgaming.com32b11442011-11-19 02:42:48 +00001099 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001100 return;
daniel@transgaming.com32b11442011-11-19 02:42:48 +00001101 }
1102
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001103 if (context->getClientVersion() >= 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -04001104 !ValidateES3CopyTexImageParameters(context, target, level, internalformat, false,
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001105 0, 0, 0, x, y, width, height, border))
1106 {
1107 return;
1108 }
1109
1110 gl::Framebuffer *framebuffer = context->getReadFramebuffer();
1111
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001112 switch (target)
1113 {
1114 case GL_TEXTURE_2D:
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001115 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001116 gl::Texture2D *texture = context->getTexture2D();
1117 texture->copyImage(level, internalformat, x, y, width, height, framebuffer);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001118 }
1119 break;
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001120
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001121 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
1122 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
1123 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
1124 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
1125 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
1126 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001127 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001128 gl::TextureCubeMap *texture = context->getTextureCubeMap();
1129 texture->copyImage(target, level, internalformat, x, y, width, height, framebuffer);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001130 }
1131 break;
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001132
1133 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001134 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001135 }
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001136 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001137 }
1138 catch(std::bad_alloc&)
1139 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001140 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001141 }
1142}
1143
1144void __stdcall glCopyTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height)
1145{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001146 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001147 "GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001148 target, level, xoffset, yoffset, x, y, width, height);
1149
1150 try
1151 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001152 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001153
1154 if (context)
1155 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001156 if (context->getClientVersion() < 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -04001157 !ValidateES2CopyTexImageParameters(context, target, level, GL_NONE, true,
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001158 xoffset, yoffset, x, y, width, height, 0))
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001159 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001160 return;
1161 }
1162
1163 if (context->getClientVersion() >= 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -04001164 !ValidateES3CopyTexImageParameters(context, target, level, GL_NONE, true,
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001165 xoffset, yoffset, 0, x, y, width, height, 0))
1166 {
1167 return;
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001168 }
1169
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00001170 gl::Framebuffer *framebuffer = context->getReadFramebuffer();
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001171
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001172 switch (target)
daniel@transgaming.combbc57792010-07-28 19:21:05 +00001173 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001174 case GL_TEXTURE_2D:
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +00001175 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001176 gl::Texture2D *texture = context->getTexture2D();
1177 texture->copySubImage(target, level, xoffset, yoffset, 0, x, y, width, height, framebuffer);
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001178 }
1179 break;
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001180
1181 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
1182 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
1183 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
1184 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
1185 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
1186 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00001187 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001188 gl::TextureCubeMap *texture = context->getTextureCubeMap();
1189 texture->copySubImage(target, level, xoffset, yoffset, 0, x, y, width, height, framebuffer);
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00001190 }
1191 break;
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001192
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001193 default:
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001194 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001195 }
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001196 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001197 }
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001198
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001199 catch(std::bad_alloc&)
1200 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001201 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001202 }
1203}
1204
1205GLuint __stdcall glCreateProgram(void)
1206{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001207 EVENT("()");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001208
1209 try
1210 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001211 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001212
1213 if (context)
1214 {
1215 return context->createProgram();
1216 }
1217 }
1218 catch(std::bad_alloc&)
1219 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001220 return gl::error(GL_OUT_OF_MEMORY, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001221 }
1222
1223 return 0;
1224}
1225
1226GLuint __stdcall glCreateShader(GLenum type)
1227{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001228 EVENT("(GLenum type = 0x%X)", type);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001229
1230 try
1231 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001232 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001233
1234 if (context)
1235 {
1236 switch (type)
1237 {
1238 case GL_FRAGMENT_SHADER:
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00001239 case GL_VERTEX_SHADER:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001240 return context->createShader(type);
1241 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001242 return gl::error(GL_INVALID_ENUM, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001243 }
1244 }
1245 }
1246 catch(std::bad_alloc&)
1247 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001248 return gl::error(GL_OUT_OF_MEMORY, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001249 }
1250
1251 return 0;
1252}
1253
1254void __stdcall glCullFace(GLenum mode)
1255{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001256 EVENT("(GLenum mode = 0x%X)", mode);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001257
1258 try
1259 {
1260 switch (mode)
1261 {
1262 case GL_FRONT:
1263 case GL_BACK:
1264 case GL_FRONT_AND_BACK:
1265 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001266 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001267
1268 if (context)
1269 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00001270 context->setCullMode(mode);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001271 }
1272 }
1273 break;
1274 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001275 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001276 }
1277 }
1278 catch(std::bad_alloc&)
1279 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001280 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001281 }
1282}
1283
1284void __stdcall glDeleteBuffers(GLsizei n, const GLuint* buffers)
1285{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001286 EVENT("(GLsizei n = %d, const GLuint* buffers = 0x%0.8p)", n, buffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001287
1288 try
1289 {
1290 if (n < 0)
1291 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001292 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001293 }
1294
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001295 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001296
1297 if (context)
1298 {
1299 for (int i = 0; i < n; i++)
1300 {
1301 context->deleteBuffer(buffers[i]);
1302 }
1303 }
1304 }
1305 catch(std::bad_alloc&)
1306 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001307 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001308 }
1309}
1310
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001311void __stdcall glDeleteFencesNV(GLsizei n, const GLuint* fences)
1312{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001313 EVENT("(GLsizei n = %d, const GLuint* fences = 0x%0.8p)", n, fences);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001314
1315 try
1316 {
1317 if (n < 0)
1318 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001319 return gl::error(GL_INVALID_VALUE);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001320 }
1321
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001322 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001323
1324 if (context)
1325 {
1326 for (int i = 0; i < n; i++)
1327 {
Jamie Madill33dc8432013-07-26 11:55:05 -04001328 context->deleteFenceNV(fences[i]);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001329 }
1330 }
1331 }
1332 catch(std::bad_alloc&)
1333 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001334 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001335 }
1336}
1337
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001338void __stdcall glDeleteFramebuffers(GLsizei n, const GLuint* framebuffers)
1339{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001340 EVENT("(GLsizei n = %d, const GLuint* framebuffers = 0x%0.8p)", n, framebuffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001341
1342 try
1343 {
1344 if (n < 0)
1345 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001346 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001347 }
1348
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001349 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001350
1351 if (context)
1352 {
1353 for (int i = 0; i < n; i++)
1354 {
1355 if (framebuffers[i] != 0)
1356 {
1357 context->deleteFramebuffer(framebuffers[i]);
1358 }
1359 }
1360 }
1361 }
1362 catch(std::bad_alloc&)
1363 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001364 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001365 }
1366}
1367
1368void __stdcall glDeleteProgram(GLuint program)
1369{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001370 EVENT("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001371
1372 try
1373 {
daniel@transgaming.com75401e62010-04-13 03:26:39 +00001374 if (program == 0)
1375 {
1376 return;
1377 }
1378
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001379 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001380
1381 if (context)
1382 {
daniel@transgaming.com75401e62010-04-13 03:26:39 +00001383 if (!context->getProgram(program))
1384 {
1385 if(context->getShader(program))
1386 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001387 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com75401e62010-04-13 03:26:39 +00001388 }
1389 else
1390 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001391 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com75401e62010-04-13 03:26:39 +00001392 }
1393 }
1394
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001395 context->deleteProgram(program);
1396 }
1397 }
1398 catch(std::bad_alloc&)
1399 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001400 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001401 }
1402}
1403
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00001404void __stdcall glDeleteQueriesEXT(GLsizei n, const GLuint *ids)
1405{
1406 EVENT("(GLsizei n = %d, const GLuint *ids = 0x%0.8p)", n, ids);
1407
1408 try
1409 {
1410 if (n < 0)
1411 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001412 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00001413 }
1414
1415 gl::Context *context = gl::getNonLostContext();
1416
1417 if (context)
1418 {
1419 for (int i = 0; i < n; i++)
1420 {
1421 context->deleteQuery(ids[i]);
1422 }
1423 }
1424 }
1425 catch(std::bad_alloc&)
1426 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001427 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00001428 }
1429}
1430
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001431void __stdcall glDeleteRenderbuffers(GLsizei n, const GLuint* renderbuffers)
1432{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001433 EVENT("(GLsizei n = %d, const GLuint* renderbuffers = 0x%0.8p)", n, renderbuffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001434
1435 try
1436 {
1437 if (n < 0)
1438 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001439 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001440 }
1441
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001442 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001443
1444 if (context)
1445 {
daniel@transgaming.come2b22122010-03-11 19:22:14 +00001446 for (int i = 0; i < n; i++)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001447 {
1448 context->deleteRenderbuffer(renderbuffers[i]);
1449 }
1450 }
1451 }
1452 catch(std::bad_alloc&)
1453 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001454 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001455 }
1456}
1457
1458void __stdcall glDeleteShader(GLuint shader)
1459{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001460 EVENT("(GLuint shader = %d)", shader);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001461
1462 try
1463 {
daniel@transgaming.com75401e62010-04-13 03:26:39 +00001464 if (shader == 0)
1465 {
1466 return;
1467 }
1468
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001469 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001470
1471 if (context)
1472 {
daniel@transgaming.com75401e62010-04-13 03:26:39 +00001473 if (!context->getShader(shader))
1474 {
1475 if(context->getProgram(shader))
1476 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001477 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com75401e62010-04-13 03:26:39 +00001478 }
1479 else
1480 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001481 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com75401e62010-04-13 03:26:39 +00001482 }
1483 }
1484
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001485 context->deleteShader(shader);
1486 }
1487 }
1488 catch(std::bad_alloc&)
1489 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001490 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001491 }
1492}
1493
1494void __stdcall glDeleteTextures(GLsizei n, const GLuint* textures)
1495{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001496 EVENT("(GLsizei n = %d, const GLuint* textures = 0x%0.8p)", n, textures);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001497
1498 try
1499 {
1500 if (n < 0)
1501 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001502 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001503 }
1504
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001505 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001506
1507 if (context)
1508 {
1509 for (int i = 0; i < n; i++)
1510 {
1511 if (textures[i] != 0)
1512 {
1513 context->deleteTexture(textures[i]);
1514 }
1515 }
1516 }
1517 }
1518 catch(std::bad_alloc&)
1519 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001520 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001521 }
1522}
1523
1524void __stdcall glDepthFunc(GLenum func)
1525{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001526 EVENT("(GLenum func = 0x%X)", func);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001527
1528 try
1529 {
1530 switch (func)
1531 {
1532 case GL_NEVER:
1533 case GL_ALWAYS:
1534 case GL_LESS:
1535 case GL_LEQUAL:
1536 case GL_EQUAL:
1537 case GL_GREATER:
1538 case GL_GEQUAL:
1539 case GL_NOTEQUAL:
1540 break;
1541 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001542 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001543 }
1544
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001545 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001546
1547 if (context)
1548 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00001549 context->setDepthFunc(func);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001550 }
1551 }
1552 catch(std::bad_alloc&)
1553 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001554 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001555 }
1556}
1557
1558void __stdcall glDepthMask(GLboolean flag)
1559{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00001560 EVENT("(GLboolean flag = %u)", flag);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001561
1562 try
1563 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001564 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001565
1566 if (context)
1567 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00001568 context->setDepthMask(flag != GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001569 }
1570 }
1571 catch(std::bad_alloc&)
1572 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001573 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001574 }
1575}
1576
1577void __stdcall glDepthRangef(GLclampf zNear, GLclampf zFar)
1578{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001579 EVENT("(GLclampf zNear = %f, GLclampf zFar = %f)", zNear, zFar);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001580
1581 try
1582 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001583 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001584
1585 if (context)
1586 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00001587 context->setDepthRange(zNear, zFar);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001588 }
1589 }
1590 catch(std::bad_alloc&)
1591 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001592 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001593 }
1594}
1595
1596void __stdcall glDetachShader(GLuint program, GLuint shader)
1597{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001598 EVENT("(GLuint program = %d, GLuint shader = %d)", program, shader);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001599
1600 try
1601 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001602 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001603
1604 if (context)
1605 {
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00001606
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001607 gl::Program *programObject = context->getProgram(program);
1608 gl::Shader *shaderObject = context->getShader(shader);
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00001609
1610 if (!programObject)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001611 {
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00001612 gl::Shader *shaderByProgramHandle;
1613 shaderByProgramHandle = context->getShader(program);
1614 if (!shaderByProgramHandle)
1615 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001616 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00001617 }
1618 else
1619 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001620 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00001621 }
1622 }
1623
1624 if (!shaderObject)
1625 {
1626 gl::Program *programByShaderHandle = context->getProgram(shader);
1627 if (!programByShaderHandle)
1628 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001629 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00001630 }
1631 else
1632 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001633 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00001634 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001635 }
1636
1637 if (!programObject->detachShader(shaderObject))
1638 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001639 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001640 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001641 }
1642 }
1643 catch(std::bad_alloc&)
1644 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001645 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001646 }
1647}
1648
1649void __stdcall glDisable(GLenum cap)
1650{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001651 EVENT("(GLenum cap = 0x%X)", cap);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001652
1653 try
1654 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001655 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001656
1657 if (context)
1658 {
1659 switch (cap)
1660 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00001661 case GL_CULL_FACE: context->setCullFace(false); break;
1662 case GL_POLYGON_OFFSET_FILL: context->setPolygonOffsetFill(false); break;
1663 case GL_SAMPLE_ALPHA_TO_COVERAGE: context->setSampleAlphaToCoverage(false); break;
1664 case GL_SAMPLE_COVERAGE: context->setSampleCoverage(false); break;
1665 case GL_SCISSOR_TEST: context->setScissorTest(false); break;
1666 case GL_STENCIL_TEST: context->setStencilTest(false); break;
1667 case GL_DEPTH_TEST: context->setDepthTest(false); break;
1668 case GL_BLEND: context->setBlend(false); break;
1669 case GL_DITHER: context->setDither(false); break;
shannonwoods@chromium.orgabf14cc2013-05-30 00:20:58 +00001670
1671 case GL_PRIMITIVE_RESTART_FIXED_INDEX:
1672 case GL_RASTERIZER_DISCARD:
1673 if (context->getClientVersion() < 3)
1674 {
1675 return gl::error(GL_INVALID_ENUM);
1676 }
1677 UNIMPLEMENTED();
1678 break;
1679
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001680 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001681 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001682 }
1683 }
1684 }
1685 catch(std::bad_alloc&)
1686 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001687 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001688 }
1689}
1690
1691void __stdcall glDisableVertexAttribArray(GLuint index)
1692{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001693 EVENT("(GLuint index = %d)", index);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001694
1695 try
1696 {
1697 if (index >= gl::MAX_VERTEX_ATTRIBS)
1698 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001699 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001700 }
1701
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001702 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001703
1704 if (context)
1705 {
daniel@transgaming.com83921382011-01-08 05:46:00 +00001706 context->setEnableVertexAttribArray(index, false);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001707 }
1708 }
1709 catch(std::bad_alloc&)
1710 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001711 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001712 }
1713}
1714
1715void __stdcall glDrawArrays(GLenum mode, GLint first, GLsizei count)
1716{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001717 EVENT("(GLenum mode = 0x%X, GLint first = %d, GLsizei count = %d)", mode, first, count);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001718
1719 try
1720 {
1721 if (count < 0 || first < 0)
1722 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001723 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001724 }
1725
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001726 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001727
1728 if (context)
1729 {
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00001730 context->drawArrays(mode, first, count, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001731 }
1732 }
1733 catch(std::bad_alloc&)
1734 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001735 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001736 }
1737}
1738
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001739void __stdcall glDrawArraysInstancedANGLE(GLenum mode, GLint first, GLsizei count, GLsizei primcount)
1740{
1741 EVENT("(GLenum mode = 0x%X, GLint first = %d, GLsizei count = %d, GLsizei primcount = %d)", mode, first, count, primcount);
1742
1743 try
1744 {
1745 if (count < 0 || first < 0 || primcount < 0)
1746 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001747 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001748 }
1749
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00001750 if (primcount > 0)
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001751 {
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00001752 gl::Context *context = gl::getNonLostContext();
1753
1754 if (context)
1755 {
1756 context->drawArrays(mode, first, count, primcount);
1757 }
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001758 }
1759 }
1760 catch(std::bad_alloc&)
1761 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001762 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001763 }
1764}
1765
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00001766void __stdcall glDrawElements(GLenum mode, GLsizei count, GLenum type, const GLvoid* indices)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001767{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001768 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 +00001769 mode, count, type, indices);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001770
1771 try
1772 {
1773 if (count < 0)
1774 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001775 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001776 }
1777
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001778 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001779
1780 if (context)
1781 {
daniel@transgaming.com83921382011-01-08 05:46:00 +00001782 switch (type)
1783 {
1784 case GL_UNSIGNED_BYTE:
1785 case GL_UNSIGNED_SHORT:
1786 break;
1787 case GL_UNSIGNED_INT:
1788 if (!context->supports32bitIndices())
1789 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001790 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com83921382011-01-08 05:46:00 +00001791 }
1792 break;
1793 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001794 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com83921382011-01-08 05:46:00 +00001795 }
1796
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00001797 context->drawElements(mode, count, type, indices, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001798 }
1799 }
1800 catch(std::bad_alloc&)
1801 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001802 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001803 }
1804}
1805
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001806void __stdcall glDrawElementsInstancedANGLE(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLsizei primcount)
1807{
1808 EVENT("(GLenum mode = 0x%X, GLsizei count = %d, GLenum type = 0x%X, const GLvoid* indices = 0x%0.8p, GLsizei primcount = %d)",
1809 mode, count, type, indices, primcount);
1810
1811 try
1812 {
1813 if (count < 0 || primcount < 0)
1814 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001815 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001816 }
1817
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00001818 if (primcount > 0)
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001819 {
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00001820 gl::Context *context = gl::getNonLostContext();
1821
1822 if (context)
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001823 {
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00001824 switch (type)
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001825 {
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00001826 case GL_UNSIGNED_BYTE:
1827 case GL_UNSIGNED_SHORT:
1828 break;
1829 case GL_UNSIGNED_INT:
1830 if (!context->supports32bitIndices())
1831 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001832 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00001833 }
1834 break;
1835 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001836 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001837 }
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00001838
1839 context->drawElements(mode, count, type, indices, primcount);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001840 }
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001841 }
1842 }
1843 catch(std::bad_alloc&)
1844 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001845 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001846 }
1847}
1848
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001849void __stdcall glEnable(GLenum cap)
1850{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001851 EVENT("(GLenum cap = 0x%X)", cap);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001852
1853 try
1854 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001855 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001856
1857 if (context)
1858 {
1859 switch (cap)
1860 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00001861 case GL_CULL_FACE: context->setCullFace(true); break;
1862 case GL_POLYGON_OFFSET_FILL: context->setPolygonOffsetFill(true); break;
1863 case GL_SAMPLE_ALPHA_TO_COVERAGE: context->setSampleAlphaToCoverage(true); break;
1864 case GL_SAMPLE_COVERAGE: context->setSampleCoverage(true); break;
1865 case GL_SCISSOR_TEST: context->setScissorTest(true); break;
1866 case GL_STENCIL_TEST: context->setStencilTest(true); break;
1867 case GL_DEPTH_TEST: context->setDepthTest(true); break;
1868 case GL_BLEND: context->setBlend(true); break;
1869 case GL_DITHER: context->setDither(true); break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001870 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001871 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001872 }
1873 }
1874 }
1875 catch(std::bad_alloc&)
1876 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001877 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001878 }
1879}
1880
1881void __stdcall glEnableVertexAttribArray(GLuint index)
1882{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001883 EVENT("(GLuint index = %d)", index);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001884
1885 try
1886 {
1887 if (index >= gl::MAX_VERTEX_ATTRIBS)
1888 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001889 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001890 }
1891
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001892 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001893
1894 if (context)
1895 {
daniel@transgaming.com83921382011-01-08 05:46:00 +00001896 context->setEnableVertexAttribArray(index, true);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001897 }
1898 }
1899 catch(std::bad_alloc&)
1900 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001901 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001902 }
1903}
1904
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00001905void __stdcall glEndQueryEXT(GLenum target)
1906{
1907 EVENT("GLenum target = 0x%X)", target);
1908
1909 try
1910 {
1911 switch (target)
1912 {
1913 case GL_ANY_SAMPLES_PASSED_EXT:
1914 case GL_ANY_SAMPLES_PASSED_CONSERVATIVE_EXT:
1915 break;
1916 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001917 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00001918 }
1919
1920 gl::Context *context = gl::getNonLostContext();
1921
1922 if (context)
1923 {
1924 context->endQuery(target);
1925 }
1926 }
1927 catch(std::bad_alloc&)
1928 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001929 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00001930 }
1931}
1932
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001933void __stdcall glFinishFenceNV(GLuint fence)
1934{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001935 EVENT("(GLuint fence = %d)", fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001936
1937 try
1938 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001939 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001940
1941 if (context)
1942 {
Jamie Madill33dc8432013-07-26 11:55:05 -04001943 gl::FenceNV *fenceObject = context->getFenceNV(fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001944
1945 if (fenceObject == NULL)
1946 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001947 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001948 }
1949
Jamie Madillfb9a7402013-07-26 11:55:01 -04001950 if (fenceObject->isFence() != GL_TRUE)
1951 {
1952 return gl::error(GL_INVALID_OPERATION);
1953 }
1954
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001955 fenceObject->finishFence();
1956 }
1957 }
1958 catch(std::bad_alloc&)
1959 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001960 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001961 }
1962}
1963
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001964void __stdcall glFinish(void)
1965{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001966 EVENT("()");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001967
1968 try
1969 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001970 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001971
1972 if (context)
1973 {
daniel@transgaming.com0d86aa72011-10-26 02:35:10 +00001974 context->sync(true);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001975 }
1976 }
1977 catch(std::bad_alloc&)
1978 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001979 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001980 }
1981}
1982
1983void __stdcall glFlush(void)
1984{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001985 EVENT("()");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001986
1987 try
1988 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001989 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001990
1991 if (context)
1992 {
daniel@transgaming.com0d86aa72011-10-26 02:35:10 +00001993 context->sync(false);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001994 }
1995 }
1996 catch(std::bad_alloc&)
1997 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001998 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001999 }
2000}
2001
2002void __stdcall glFramebufferRenderbuffer(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer)
2003{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002004 EVENT("(GLenum target = 0x%X, GLenum attachment = 0x%X, GLenum renderbuffertarget = 0x%X, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00002005 "GLuint renderbuffer = %d)", target, attachment, renderbuffertarget, renderbuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002006
2007 try
2008 {
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002009 if ((target != GL_FRAMEBUFFER && target != GL_DRAW_FRAMEBUFFER_ANGLE && target != GL_READ_FRAMEBUFFER_ANGLE)
daniel@transgaming.com2fa45512011-10-04 18:43:18 +00002010 || (renderbuffertarget != GL_RENDERBUFFER && renderbuffer != 0))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002011 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002012 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002013 }
2014
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002015 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002016
2017 if (context)
2018 {
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002019 gl::Framebuffer *framebuffer = NULL;
2020 GLuint framebufferHandle = 0;
2021 if (target == GL_READ_FRAMEBUFFER_ANGLE)
2022 {
2023 framebuffer = context->getReadFramebuffer();
2024 framebufferHandle = context->getReadFramebufferHandle();
2025 }
daniel@transgaming.com2fa45512011-10-04 18:43:18 +00002026 else
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002027 {
2028 framebuffer = context->getDrawFramebuffer();
2029 framebufferHandle = context->getDrawFramebufferHandle();
2030 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002031
daniel@transgaming.com2fa45512011-10-04 18:43:18 +00002032 if (!framebuffer || (framebufferHandle == 0 && renderbuffer != 0))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002033 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002034 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002035 }
2036
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002037 if (attachment >= GL_COLOR_ATTACHMENT0_EXT && attachment <= GL_COLOR_ATTACHMENT15_EXT)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002038 {
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002039 const unsigned int colorAttachment = (attachment - GL_COLOR_ATTACHMENT0_EXT);
2040
2041 if (colorAttachment >= context->getMaximumRenderTargets())
2042 {
2043 return gl::error(GL_INVALID_VALUE);
2044 }
2045
Geoff Lang309c92a2013-07-25 16:23:19 -04002046 framebuffer->setColorbuffer(colorAttachment, GL_RENDERBUFFER, renderbuffer, 0, 0);
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002047 }
2048 else
2049 {
2050 switch (attachment)
2051 {
2052 case GL_DEPTH_ATTACHMENT:
Geoff Lang309c92a2013-07-25 16:23:19 -04002053 framebuffer->setDepthbuffer(GL_RENDERBUFFER, renderbuffer, 0, 0);
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002054 break;
2055 case GL_STENCIL_ATTACHMENT:
Geoff Lang309c92a2013-07-25 16:23:19 -04002056 framebuffer->setStencilbuffer(GL_RENDERBUFFER, renderbuffer, 0, 0);
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002057 break;
Geoff Lang7e9ee232013-08-05 10:18:42 -04002058 case GL_DEPTH_STENCIL_ATTACHMENT:
2059 if (context->getClientVersion() < 3)
2060 {
2061 return gl::error(GL_INVALID_ENUM);
2062 }
2063 framebuffer->setDepthStencilBuffer(GL_RENDERBUFFER, renderbuffer, 0, 0);
2064 break;
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002065 default:
2066 return gl::error(GL_INVALID_ENUM);
2067 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002068 }
2069 }
2070 }
2071 catch(std::bad_alloc&)
2072 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002073 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002074 }
2075}
2076
2077void __stdcall glFramebufferTexture2D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level)
2078{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002079 EVENT("(GLenum target = 0x%X, GLenum attachment = 0x%X, GLenum textarget = 0x%X, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00002080 "GLuint texture = %d, GLint level = %d)", target, attachment, textarget, texture, level);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002081
2082 try
2083 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002084 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002085 if (context)
2086 {
Geoff Lang3ed0c482013-07-25 17:03:18 -04002087 if (context->getClientVersion() < 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -04002088 !ValidateES2FramebufferTextureParameters(context, target, attachment, textarget, texture, level))
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002089 {
Geoff Lang3ed0c482013-07-25 17:03:18 -04002090 return;
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002091 }
Geoff Lang3ed0c482013-07-25 17:03:18 -04002092
2093 if (context->getClientVersion() >= 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -04002094 !ValidateES3FramebufferTextureParameters(context, target, attachment, textarget, texture, level, 0, false))
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002095 {
Geoff Lang3ed0c482013-07-25 17:03:18 -04002096 return;
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002097 }
2098
daniel@transgaming.com93a81472010-04-20 18:52:58 +00002099 if (texture == 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002100 {
daniel@transgaming.com93a81472010-04-20 18:52:58 +00002101 textarget = GL_NONE;
2102 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002103
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002104 gl::Framebuffer *framebuffer = NULL;
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002105 if (target == GL_READ_FRAMEBUFFER_ANGLE)
2106 {
2107 framebuffer = context->getReadFramebuffer();
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002108 }
2109 else
2110 {
2111 framebuffer = context->getDrawFramebuffer();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002112 }
2113
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002114 if (attachment >= GL_COLOR_ATTACHMENT0_EXT && attachment <= GL_COLOR_ATTACHMENT15_EXT)
daniel@transgaming.comfbc09532010-04-26 15:33:41 +00002115 {
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002116 const unsigned int colorAttachment = (attachment - GL_COLOR_ATTACHMENT0_EXT);
Geoff Lang309c92a2013-07-25 16:23:19 -04002117 framebuffer->setColorbuffer(colorAttachment, textarget, texture, level, 0);
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002118 }
2119 else
2120 {
2121 switch (attachment)
2122 {
Geoff Lang309c92a2013-07-25 16:23:19 -04002123 case GL_DEPTH_ATTACHMENT: framebuffer->setDepthbuffer(textarget, texture, level, 0); break;
2124 case GL_STENCIL_ATTACHMENT: framebuffer->setStencilbuffer(textarget, texture, level, 0); break;
2125 case GL_DEPTH_STENCIL_ATTACHMENT: framebuffer->setDepthStencilBuffer(textarget, texture, level, 0); break;
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002126 }
daniel@transgaming.comfbc09532010-04-26 15:33:41 +00002127 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002128 }
2129 }
2130 catch(std::bad_alloc&)
2131 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002132 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002133 }
2134}
2135
2136void __stdcall glFrontFace(GLenum mode)
2137{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002138 EVENT("(GLenum mode = 0x%X)", mode);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002139
2140 try
2141 {
2142 switch (mode)
2143 {
2144 case GL_CW:
2145 case GL_CCW:
2146 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002147 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002148
2149 if (context)
2150 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00002151 context->setFrontFace(mode);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002152 }
2153 }
2154 break;
2155 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002156 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002157 }
2158 }
2159 catch(std::bad_alloc&)
2160 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002161 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002162 }
2163}
2164
2165void __stdcall glGenBuffers(GLsizei n, GLuint* buffers)
2166{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002167 EVENT("(GLsizei n = %d, GLuint* buffers = 0x%0.8p)", n, buffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002168
2169 try
2170 {
2171 if (n < 0)
2172 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002173 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002174 }
2175
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002176 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002177
2178 if (context)
2179 {
2180 for (int i = 0; i < n; i++)
2181 {
2182 buffers[i] = context->createBuffer();
2183 }
2184 }
2185 }
2186 catch(std::bad_alloc&)
2187 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002188 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002189 }
2190}
2191
2192void __stdcall glGenerateMipmap(GLenum target)
2193{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002194 EVENT("(GLenum target = 0x%X)", target);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002195
2196 try
2197 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002198 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com8fd99e22010-04-20 18:52:00 +00002199
2200 if (context)
2201 {
Jamie Madill35d15012013-10-07 10:46:37 -04002202 if (!ValidTextureTarget(context, target))
daniel@transgaming.com8fd99e22010-04-20 18:52:00 +00002203 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002204 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com8fd99e22010-04-20 18:52:00 +00002205 }
Geoff Langae4852a2013-06-05 15:00:34 -04002206
Jamie Madill35d15012013-10-07 10:46:37 -04002207 gl::Texture *texture = GetTargetTexture(context, target);
2208
2209 if (texture == NULL)
Geoff Langae4852a2013-06-05 15:00:34 -04002210 {
2211 return gl::error(GL_INVALID_OPERATION);
2212 }
2213
Geoff Lang005df412013-10-16 14:12:50 -04002214 GLenum internalFormat = texture->getBaseLevelInternalFormat();
Jamie Madill35d15012013-10-07 10:46:37 -04002215
Geoff Langae4852a2013-06-05 15:00:34 -04002216 // Internally, all texture formats are sized so checking if the format
2217 // is color renderable and filterable will not fail.
Jamie Madill33f9c2e2013-10-07 10:46:36 -04002218 if (gl::IsDepthRenderingSupported(internalFormat, context) ||
2219 gl::IsFormatCompressed(internalFormat, context->getClientVersion()) ||
Geoff Langae4852a2013-06-05 15:00:34 -04002220 !gl::IsColorRenderingSupported(internalFormat, context) ||
2221 !gl::IsTextureFilteringSupported(internalFormat, context))
2222 {
2223 return gl::error(GL_INVALID_OPERATION);
2224 }
2225
Jamie Madillc1f8b162013-10-07 10:46:38 -04002226 // Non-power of 2 ES2 check
2227 if (!context->supportsNonPower2Texture() && (!gl::isPow2(texture->getBaseLevelWidth()) || !gl::isPow2(texture->getBaseLevelHeight())))
2228 {
2229 ASSERT(context->getClientVersion() <= 2 && (target == GL_TEXTURE_2D || target == GL_TEXTURE_CUBE_MAP));
2230 return gl::error(GL_INVALID_OPERATION);
2231 }
2232
2233 // Cube completeness check
2234 if (target == GL_TEXTURE_CUBE_MAP)
2235 {
2236 gl::TextureCubeMap *textureCube = static_cast<gl::TextureCubeMap *>(texture);
2237 if (!textureCube->isCubeComplete())
2238 {
2239 return gl::error(GL_INVALID_OPERATION);
2240 }
2241 }
2242
Geoff Langae4852a2013-06-05 15:00:34 -04002243 texture->generateMipmaps();
daniel@transgaming.com8fd99e22010-04-20 18:52:00 +00002244 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002245 }
2246 catch(std::bad_alloc&)
2247 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002248 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002249 }
2250}
2251
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002252void __stdcall glGenFencesNV(GLsizei n, GLuint* fences)
2253{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002254 EVENT("(GLsizei n = %d, GLuint* fences = 0x%0.8p)", n, fences);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002255
2256 try
2257 {
2258 if (n < 0)
2259 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002260 return gl::error(GL_INVALID_VALUE);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002261 }
2262
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002263 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002264
2265 if (context)
2266 {
2267 for (int i = 0; i < n; i++)
2268 {
Jamie Madill33dc8432013-07-26 11:55:05 -04002269 fences[i] = context->createFenceNV();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002270 }
2271 }
2272 }
2273 catch(std::bad_alloc&)
2274 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002275 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002276 }
2277}
2278
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002279void __stdcall glGenFramebuffers(GLsizei n, GLuint* framebuffers)
2280{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002281 EVENT("(GLsizei n = %d, GLuint* framebuffers = 0x%0.8p)", n, framebuffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002282
2283 try
2284 {
2285 if (n < 0)
2286 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002287 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002288 }
2289
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002290 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002291
2292 if (context)
2293 {
2294 for (int i = 0; i < n; i++)
2295 {
2296 framebuffers[i] = context->createFramebuffer();
2297 }
2298 }
2299 }
2300 catch(std::bad_alloc&)
2301 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002302 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002303 }
2304}
2305
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00002306void __stdcall glGenQueriesEXT(GLsizei n, GLuint* ids)
2307{
2308 EVENT("(GLsizei n = %d, GLuint* ids = 0x%0.8p)", n, ids);
2309
2310 try
2311 {
2312 if (n < 0)
2313 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002314 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00002315 }
2316
2317 gl::Context *context = gl::getNonLostContext();
2318
2319 if (context)
2320 {
2321 for (int i = 0; i < n; i++)
2322 {
2323 ids[i] = context->createQuery();
2324 }
2325 }
2326 }
2327 catch(std::bad_alloc&)
2328 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002329 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00002330 }
2331}
2332
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002333void __stdcall glGenRenderbuffers(GLsizei n, GLuint* renderbuffers)
2334{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002335 EVENT("(GLsizei n = %d, GLuint* renderbuffers = 0x%0.8p)", n, renderbuffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002336
2337 try
2338 {
2339 if (n < 0)
2340 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002341 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002342 }
2343
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002344 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002345
2346 if (context)
2347 {
2348 for (int i = 0; i < n; i++)
2349 {
2350 renderbuffers[i] = context->createRenderbuffer();
2351 }
2352 }
2353 }
2354 catch(std::bad_alloc&)
2355 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002356 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002357 }
2358}
2359
2360void __stdcall glGenTextures(GLsizei n, GLuint* textures)
2361{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002362 EVENT("(GLsizei n = %d, GLuint* textures = 0x%0.8p)", n, textures);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002363
2364 try
2365 {
2366 if (n < 0)
2367 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002368 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002369 }
2370
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002371 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002372
2373 if (context)
2374 {
2375 for (int i = 0; i < n; i++)
2376 {
2377 textures[i] = context->createTexture();
2378 }
2379 }
2380 }
2381 catch(std::bad_alloc&)
2382 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002383 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002384 }
2385}
2386
daniel@transgaming.com85423182010-04-22 13:35:27 +00002387void __stdcall glGetActiveAttrib(GLuint program, GLuint index, GLsizei bufsize, GLsizei *length, GLint *size, GLenum *type, GLchar *name)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002388{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002389 EVENT("(GLuint program = %d, GLuint index = %d, GLsizei bufsize = %d, GLsizei *length = 0x%0.8p, "
daniel@transgaming.com85423182010-04-22 13:35:27 +00002390 "GLint *size = 0x%0.8p, GLenum *type = %0.8p, GLchar *name = %0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002391 program, index, bufsize, length, size, type, name);
2392
2393 try
2394 {
2395 if (bufsize < 0)
2396 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002397 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002398 }
2399
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002400 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com85423182010-04-22 13:35:27 +00002401
2402 if (context)
2403 {
2404 gl::Program *programObject = context->getProgram(program);
2405
2406 if (!programObject)
2407 {
2408 if (context->getShader(program))
2409 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002410 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com85423182010-04-22 13:35:27 +00002411 }
2412 else
2413 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002414 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com85423182010-04-22 13:35:27 +00002415 }
2416 }
2417
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00002418 if (index >= (GLuint)programObject->getActiveAttributeCount())
daniel@transgaming.com85423182010-04-22 13:35:27 +00002419 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002420 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com85423182010-04-22 13:35:27 +00002421 }
2422
2423 programObject->getActiveAttribute(index, bufsize, length, size, type, name);
2424 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002425 }
2426 catch(std::bad_alloc&)
2427 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002428 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002429 }
2430}
2431
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00002432void __stdcall glGetActiveUniform(GLuint program, GLuint index, GLsizei bufsize, GLsizei* length, GLint* size, GLenum* type, GLchar* name)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002433{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002434 EVENT("(GLuint program = %d, GLuint index = %d, GLsizei bufsize = %d, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00002435 "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 +00002436 program, index, bufsize, length, size, type, name);
2437
2438 try
2439 {
2440 if (bufsize < 0)
2441 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002442 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002443 }
2444
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002445 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00002446
2447 if (context)
2448 {
2449 gl::Program *programObject = context->getProgram(program);
2450
2451 if (!programObject)
2452 {
2453 if (context->getShader(program))
2454 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002455 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00002456 }
2457 else
2458 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002459 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00002460 }
2461 }
2462
2463 if (index >= (GLuint)programObject->getActiveUniformCount())
2464 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002465 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00002466 }
2467
2468 programObject->getActiveUniform(index, bufsize, length, size, type, name);
2469 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002470 }
2471 catch(std::bad_alloc&)
2472 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002473 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002474 }
2475}
2476
2477void __stdcall glGetAttachedShaders(GLuint program, GLsizei maxcount, GLsizei* count, GLuint* shaders)
2478{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002479 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 +00002480 program, maxcount, count, shaders);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002481
2482 try
2483 {
2484 if (maxcount < 0)
2485 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002486 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002487 }
2488
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002489 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com6c785212010-03-30 03:36:17 +00002490
2491 if (context)
2492 {
2493 gl::Program *programObject = context->getProgram(program);
2494
2495 if (!programObject)
2496 {
daniel@transgaming.com23953e32010-04-13 19:53:31 +00002497 if (context->getShader(program))
2498 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002499 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com23953e32010-04-13 19:53:31 +00002500 }
2501 else
2502 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002503 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com23953e32010-04-13 19:53:31 +00002504 }
daniel@transgaming.com6c785212010-03-30 03:36:17 +00002505 }
2506
2507 return programObject->getAttachedShaders(maxcount, count, shaders);
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
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00002516int __stdcall glGetAttribLocation(GLuint program, const GLchar* name)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002517{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002518 EVENT("(GLuint program = %d, const GLchar* name = %s)", program, name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002519
2520 try
2521 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002522 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002523
2524 if (context)
2525 {
daniel@transgaming.combb274c32010-04-13 03:26:21 +00002526
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002527 gl::Program *programObject = context->getProgram(program);
2528
2529 if (!programObject)
2530 {
daniel@transgaming.combb274c32010-04-13 03:26:21 +00002531 if (context->getShader(program))
2532 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002533 return gl::error(GL_INVALID_OPERATION, -1);
daniel@transgaming.combb274c32010-04-13 03:26:21 +00002534 }
2535 else
2536 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002537 return gl::error(GL_INVALID_VALUE, -1);
daniel@transgaming.combb274c32010-04-13 03:26:21 +00002538 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002539 }
2540
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00002541 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
daniel@transgaming.com716056c2012-07-24 18:38:59 +00002542 if (!programObject->isLinked() || !programBinary)
daniel@transgaming.comcf4aa872010-04-13 03:26:27 +00002543 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002544 return gl::error(GL_INVALID_OPERATION, -1);
daniel@transgaming.comcf4aa872010-04-13 03:26:27 +00002545 }
2546
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00002547 return programBinary->getAttributeLocation(name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002548 }
2549 }
2550 catch(std::bad_alloc&)
2551 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002552 return gl::error(GL_OUT_OF_MEMORY, -1);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002553 }
2554
2555 return -1;
2556}
2557
2558void __stdcall glGetBooleanv(GLenum pname, GLboolean* params)
2559{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002560 EVENT("(GLenum pname = 0x%X, GLboolean* params = 0x%0.8p)", pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002561
2562 try
2563 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002564 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com777f2672010-04-07 03:25:16 +00002565
2566 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002567 {
Jamie Madill79f2f452013-12-19 11:13:02 -05002568 GLenum nativeType;
2569 unsigned int numParams = 0;
2570 if (!context->getQueryParameterInfo(pname, &nativeType, &numParams))
2571 return gl::error(GL_INVALID_ENUM);
2572
2573 // pname is valid, but there are no parameters to return
2574 if (numParams == 0)
2575 return;
2576
2577 if (nativeType == GL_BOOL)
daniel@transgaming.com777f2672010-04-07 03:25:16 +00002578 {
Jamie Madill79f2f452013-12-19 11:13:02 -05002579 context->getBooleanv(pname, params);
2580 }
2581 else if (nativeType == GL_FLOAT)
2582 {
2583 GLfloat *floatParams = NULL;
2584 floatParams = new GLfloat[numParams];
daniel@transgaming.com777f2672010-04-07 03:25:16 +00002585
Jamie Madill79f2f452013-12-19 11:13:02 -05002586 context->getFloatv(pname, floatParams);
daniel@transgaming.com777f2672010-04-07 03:25:16 +00002587
Jamie Madill79f2f452013-12-19 11:13:02 -05002588 for (unsigned int i = 0; i < numParams; ++i)
daniel@transgaming.com777f2672010-04-07 03:25:16 +00002589 {
Jamie Madill79f2f452013-12-19 11:13:02 -05002590 if (floatParams[i] == 0.0f)
2591 params[i] = GL_FALSE;
2592 else
2593 params[i] = GL_TRUE;
daniel@transgaming.com777f2672010-04-07 03:25:16 +00002594 }
Jamie Madill79f2f452013-12-19 11:13:02 -05002595
2596 delete [] floatParams;
2597 }
2598 else if (nativeType == GL_INT)
2599 {
2600 GLint *intParams = NULL;
2601 intParams = new GLint[numParams];
2602
2603 context->getIntegerv(pname, intParams);
2604
2605 for (unsigned int i = 0; i < numParams; ++i)
daniel@transgaming.com777f2672010-04-07 03:25:16 +00002606 {
Jamie Madill79f2f452013-12-19 11:13:02 -05002607 if (intParams[i] == 0)
2608 params[i] = GL_FALSE;
2609 else
2610 params[i] = GL_TRUE;
daniel@transgaming.com777f2672010-04-07 03:25:16 +00002611 }
Jamie Madill79f2f452013-12-19 11:13:02 -05002612
2613 delete [] intParams;
2614 }
2615 else if (nativeType == GL_INT_64_ANGLEX)
2616 {
2617 GLint64 *int64Params = NULL;
2618 int64Params = new GLint64[numParams];
2619
2620 context->getInteger64v(pname, int64Params);
2621
2622 for (unsigned int i = 0; i < numParams; ++i)
Jamie Madill71fbd602013-07-19 16:36:55 -04002623 {
Jamie Madill79f2f452013-12-19 11:13:02 -05002624 if (int64Params[i] == 0)
2625 params[i] = GL_FALSE;
2626 else
2627 params[i] = GL_TRUE;
Jamie Madill71fbd602013-07-19 16:36:55 -04002628 }
Jamie Madill79f2f452013-12-19 11:13:02 -05002629
2630 delete [] int64Params;
daniel@transgaming.com777f2672010-04-07 03:25:16 +00002631 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002632 }
2633 }
2634 catch(std::bad_alloc&)
2635 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002636 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002637 }
2638}
2639
2640void __stdcall glGetBufferParameteriv(GLenum target, GLenum pname, GLint* params)
2641{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002642 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 +00002643
2644 try
2645 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002646 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comaa0ccbd2010-04-15 20:45:05 +00002647
2648 if (context)
2649 {
2650 gl::Buffer *buffer;
2651
2652 switch (target)
2653 {
2654 case GL_ARRAY_BUFFER:
2655 buffer = context->getArrayBuffer();
2656 break;
2657 case GL_ELEMENT_ARRAY_BUFFER:
2658 buffer = context->getElementArrayBuffer();
2659 break;
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002660 default: return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comaa0ccbd2010-04-15 20:45:05 +00002661 }
2662
2663 if (!buffer)
2664 {
2665 // A null buffer means that "0" is bound to the requested buffer target
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002666 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comaa0ccbd2010-04-15 20:45:05 +00002667 }
2668
2669 switch (pname)
2670 {
2671 case GL_BUFFER_USAGE:
2672 *params = buffer->usage();
2673 break;
2674 case GL_BUFFER_SIZE:
2675 *params = buffer->size();
2676 break;
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002677 default: return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comaa0ccbd2010-04-15 20:45:05 +00002678 }
2679 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002680 }
2681 catch(std::bad_alloc&)
2682 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002683 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002684 }
2685}
2686
2687GLenum __stdcall glGetError(void)
2688{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002689 EVENT("()");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002690
2691 gl::Context *context = gl::getContext();
2692
2693 if (context)
2694 {
daniel@transgaming.com82b28912011-12-12 21:01:35 +00002695 return context->getError();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002696 }
2697
2698 return GL_NO_ERROR;
2699}
2700
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002701void __stdcall glGetFenceivNV(GLuint fence, GLenum pname, GLint *params)
2702{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002703 EVENT("(GLuint fence = %d, GLenum pname = 0x%X, GLint *params = 0x%0.8p)", fence, pname, params);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002704
2705 try
2706 {
2707
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002708 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002709
2710 if (context)
2711 {
Jamie Madill33dc8432013-07-26 11:55:05 -04002712 gl::FenceNV *fenceObject = context->getFenceNV(fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002713
2714 if (fenceObject == NULL)
2715 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002716 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002717 }
2718
Jamie Madillfb9a7402013-07-26 11:55:01 -04002719 if (fenceObject->isFence() != GL_TRUE)
2720 {
2721 return gl::error(GL_INVALID_OPERATION);
2722 }
2723
2724 switch (pname)
2725 {
2726 case GL_FENCE_STATUS_NV:
2727 case GL_FENCE_CONDITION_NV:
2728 break;
2729
2730 default: return gl::error(GL_INVALID_ENUM);
2731 }
2732
2733 params[0] = fenceObject->getFencei(pname);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002734 }
2735 }
2736 catch(std::bad_alloc&)
2737 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002738 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002739 }
2740}
2741
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002742void __stdcall glGetFloatv(GLenum pname, GLfloat* params)
2743{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002744 EVENT("(GLenum pname = 0x%X, GLfloat* params = 0x%0.8p)", pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002745
2746 try
2747 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002748 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com32e58cd2010-03-24 09:44:10 +00002749
2750 if (context)
2751 {
Jamie Madill79f2f452013-12-19 11:13:02 -05002752 GLenum nativeType;
2753 unsigned int numParams = 0;
2754 if (!context->getQueryParameterInfo(pname, &nativeType, &numParams))
2755 return gl::error(GL_INVALID_ENUM);
2756
2757 // pname is valid, but that there are no parameters to return.
2758 if (numParams == 0)
2759 return;
2760
2761 if (nativeType == GL_FLOAT)
daniel@transgaming.com32e58cd2010-03-24 09:44:10 +00002762 {
Jamie Madill79f2f452013-12-19 11:13:02 -05002763 context->getFloatv(pname, params);
2764 }
2765 else if (nativeType == GL_BOOL)
2766 {
2767 GLboolean *boolParams = NULL;
2768 boolParams = new GLboolean[numParams];
daniel@transgaming.com777f2672010-04-07 03:25:16 +00002769
Jamie Madill79f2f452013-12-19 11:13:02 -05002770 context->getBooleanv(pname, boolParams);
daniel@transgaming.com777f2672010-04-07 03:25:16 +00002771
Jamie Madill79f2f452013-12-19 11:13:02 -05002772 for (unsigned int i = 0; i < numParams; ++i)
daniel@transgaming.com777f2672010-04-07 03:25:16 +00002773 {
Jamie Madill79f2f452013-12-19 11:13:02 -05002774 if (boolParams[i] == GL_FALSE)
2775 params[i] = 0.0f;
2776 else
2777 params[i] = 1.0f;
daniel@transgaming.com777f2672010-04-07 03:25:16 +00002778 }
Jamie Madill79f2f452013-12-19 11:13:02 -05002779
2780 delete [] boolParams;
2781 }
2782 else if (nativeType == GL_INT)
2783 {
2784 GLint *intParams = NULL;
2785 intParams = new GLint[numParams];
2786
2787 context->getIntegerv(pname, intParams);
2788
2789 for (unsigned int i = 0; i < numParams; ++i)
daniel@transgaming.com777f2672010-04-07 03:25:16 +00002790 {
Jamie Madill79f2f452013-12-19 11:13:02 -05002791 params[i] = static_cast<GLfloat>(intParams[i]);
daniel@transgaming.com777f2672010-04-07 03:25:16 +00002792 }
Jamie Madill79f2f452013-12-19 11:13:02 -05002793
2794 delete [] intParams;
2795 }
2796 else if (nativeType == GL_INT_64_ANGLEX)
2797 {
2798 GLint64 *int64Params = NULL;
2799 int64Params = new GLint64[numParams];
2800
2801 context->getInteger64v(pname, int64Params);
2802
2803 for (unsigned int i = 0; i < numParams; ++i)
Jamie Madill71fbd602013-07-19 16:36:55 -04002804 {
Jamie Madill79f2f452013-12-19 11:13:02 -05002805 params[i] = static_cast<GLfloat>(int64Params[i]);
Jamie Madill71fbd602013-07-19 16:36:55 -04002806 }
Jamie Madill79f2f452013-12-19 11:13:02 -05002807
2808 delete [] int64Params;
daniel@transgaming.com32e58cd2010-03-24 09:44:10 +00002809 }
2810 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002811 }
2812 catch(std::bad_alloc&)
2813 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002814 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002815 }
2816}
2817
2818void __stdcall glGetFramebufferAttachmentParameteriv(GLenum target, GLenum attachment, GLenum pname, GLint* params)
2819{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002820 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 +00002821 target, attachment, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002822
2823 try
2824 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002825 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002826
2827 if (context)
2828 {
Geoff Lang646559f2013-08-15 11:08:15 -04002829 META_ASSERT(GL_DRAW_FRAMEBUFFER_ANGLE == GL_DRAW_FRAMEBUFFER && GL_READ_FRAMEBUFFER_ANGLE == GL_READ_FRAMEBUFFER);
2830 if (target != GL_FRAMEBUFFER && target != GL_DRAW_FRAMEBUFFER && target != GL_READ_FRAMEBUFFER)
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002831 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002832 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002833 }
2834
Geoff Lang646559f2013-08-15 11:08:15 -04002835 switch (pname)
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002836 {
Geoff Lang646559f2013-08-15 11:08:15 -04002837 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE:
2838 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME:
2839 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL:
2840 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE:
2841 break;
2842 case GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE:
2843 case GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE:
2844 case GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE:
2845 case GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE:
2846 case GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE:
2847 case GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE:
2848 case GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE:
2849 case GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING:
2850 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER:
2851 if (context->getClientVersion() >= 3)
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002852 {
Geoff Lang646559f2013-08-15 11:08:15 -04002853 break;
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002854 }
Geoff Lang646559f2013-08-15 11:08:15 -04002855 default:
2856 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002857 }
Geoff Lang646559f2013-08-15 11:08:15 -04002858
2859 // Determine if the attachment is a valid enum
2860 switch (attachment)
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002861 {
Geoff Lang646559f2013-08-15 11:08:15 -04002862 case GL_BACK:
2863 case GL_FRONT:
2864 case GL_STENCIL:
2865 case GL_DEPTH_STENCIL_ATTACHMENT:
2866 if (context->getClientVersion() < 3)
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002867 {
Geoff Lang646559f2013-08-15 11:08:15 -04002868 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002869 }
Geoff Lang646559f2013-08-15 11:08:15 -04002870 break;
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002871
Geoff Lang646559f2013-08-15 11:08:15 -04002872 case GL_DEPTH_ATTACHMENT:
2873 case GL_STENCIL_ATTACHMENT:
2874 break;
2875
2876 default:
2877 if (attachment < GL_COLOR_ATTACHMENT0_EXT ||
2878 (attachment - GL_COLOR_ATTACHMENT0_EXT) >= context->getMaximumRenderTargets())
2879 {
2880 return gl::error(GL_INVALID_ENUM);
2881 }
2882 break;
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002883 }
2884
Geoff Lang646559f2013-08-15 11:08:15 -04002885 GLuint framebufferHandle = (target == GL_READ_FRAMEBUFFER) ? context->getReadFramebufferHandle()
2886 : context->getDrawFramebufferHandle();
2887
2888 gl::Framebuffer *framebuffer = context->getFramebuffer(framebufferHandle);
2889
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002890 GLenum attachmentType;
2891 GLuint attachmentHandle;
Geoff Lang309c92a2013-07-25 16:23:19 -04002892 GLuint attachmentLevel;
2893 GLuint attachmentLayer;
Geoff Lang646559f2013-08-15 11:08:15 -04002894 gl::Renderbuffer *renderbuffer;
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002895
Geoff Lang646559f2013-08-15 11:08:15 -04002896 if(framebufferHandle == 0)
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002897 {
Geoff Lang646559f2013-08-15 11:08:15 -04002898 if(context->getClientVersion() < 3)
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002899 {
Geoff Lang646559f2013-08-15 11:08:15 -04002900 return gl::error(GL_INVALID_OPERATION);
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002901 }
2902
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002903 switch (attachment)
2904 {
Geoff Lang646559f2013-08-15 11:08:15 -04002905 case GL_BACK:
2906 attachmentType = framebuffer->getColorbufferType(0);
2907 attachmentHandle = framebuffer->getColorbufferHandle(0);
2908 attachmentLevel = framebuffer->getColorbufferMipLevel(0);
2909 attachmentLayer = framebuffer->getColorbufferLayer(0);
2910 renderbuffer = framebuffer->getColorbuffer(0);
2911 break;
2912 case GL_DEPTH:
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002913 attachmentType = framebuffer->getDepthbufferType();
2914 attachmentHandle = framebuffer->getDepthbufferHandle();
Geoff Lang309c92a2013-07-25 16:23:19 -04002915 attachmentLevel = framebuffer->getDepthbufferMipLevel();
2916 attachmentLayer = framebuffer->getDepthbufferLayer();
Geoff Lang646559f2013-08-15 11:08:15 -04002917 renderbuffer = framebuffer->getDepthbuffer();
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002918 break;
Geoff Lang646559f2013-08-15 11:08:15 -04002919 case GL_STENCIL:
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002920 attachmentType = framebuffer->getStencilbufferType();
2921 attachmentHandle = framebuffer->getStencilbufferHandle();
Geoff Lang309c92a2013-07-25 16:23:19 -04002922 attachmentLevel = framebuffer->getStencilbufferMipLevel();
2923 attachmentLayer = framebuffer->getStencilbufferLayer();
Geoff Lang646559f2013-08-15 11:08:15 -04002924 renderbuffer = framebuffer->getStencilbuffer();
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002925 break;
Geoff Lang646559f2013-08-15 11:08:15 -04002926 default:
2927 return gl::error(GL_INVALID_OPERATION);
2928 }
2929 }
2930 else
2931 {
2932 if (attachment >= GL_COLOR_ATTACHMENT0_EXT && attachment <= GL_COLOR_ATTACHMENT15_EXT)
2933 {
2934 const unsigned int colorAttachment = (attachment - GL_COLOR_ATTACHMENT0_EXT);
2935 attachmentType = framebuffer->getColorbufferType(colorAttachment);
2936 attachmentHandle = framebuffer->getColorbufferHandle(colorAttachment);
2937 attachmentLevel = framebuffer->getColorbufferMipLevel(colorAttachment);
2938 attachmentLayer = framebuffer->getColorbufferLayer(colorAttachment);
2939 renderbuffer = framebuffer->getColorbuffer(colorAttachment);
2940 }
2941 else
2942 {
2943 switch (attachment)
Geoff Lang55ba29c2013-07-11 16:57:53 -04002944 {
Geoff Lang646559f2013-08-15 11:08:15 -04002945 case GL_DEPTH_ATTACHMENT:
2946 attachmentType = framebuffer->getDepthbufferType();
2947 attachmentHandle = framebuffer->getDepthbufferHandle();
2948 attachmentLevel = framebuffer->getDepthbufferMipLevel();
2949 attachmentLayer = framebuffer->getDepthbufferLayer();
2950 renderbuffer = framebuffer->getDepthbuffer();
2951 break;
2952 case GL_STENCIL_ATTACHMENT:
2953 attachmentType = framebuffer->getStencilbufferType();
2954 attachmentHandle = framebuffer->getStencilbufferHandle();
2955 attachmentLevel = framebuffer->getStencilbufferMipLevel();
2956 attachmentLayer = framebuffer->getStencilbufferLayer();
2957 renderbuffer = framebuffer->getStencilbuffer();
2958 break;
2959 case GL_DEPTH_STENCIL_ATTACHMENT:
2960 if (framebuffer->getDepthbufferHandle() != framebuffer->getStencilbufferHandle())
2961 {
2962 return gl::error(GL_INVALID_OPERATION);
2963 }
2964 attachmentType = framebuffer->getDepthStencilbufferType();
2965 attachmentHandle = framebuffer->getDepthStencilbufferHandle();
2966 attachmentLevel = framebuffer->getDepthStencilbufferMipLevel();
2967 attachmentLayer = framebuffer->getDepthStencilbufferLayer();
2968 renderbuffer = framebuffer->getDepthStencilBuffer();
2969 break;
2970 default:
Geoff Lang55ba29c2013-07-11 16:57:53 -04002971 return gl::error(GL_INVALID_OPERATION);
2972 }
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002973 }
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002974 }
2975
2976 GLenum attachmentObjectType; // Type category
Geoff Lang646559f2013-08-15 11:08:15 -04002977 if (framebufferHandle == 0)
2978 {
2979 attachmentObjectType = GL_FRAMEBUFFER_DEFAULT;
2980 }
2981 else if (attachmentType == GL_NONE || attachmentType == GL_RENDERBUFFER)
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002982 {
2983 attachmentObjectType = attachmentType;
2984 }
Geoff Lang0fe19492013-07-25 17:04:31 -04002985 else if (gl::IsInternalTextureTarget(attachmentType, context->getClientVersion()))
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002986 {
2987 attachmentObjectType = GL_TEXTURE;
2988 }
apatrick@chromium.orga1d80592012-01-25 21:52:10 +00002989 else
2990 {
2991 UNREACHABLE();
2992 return;
2993 }
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002994
Geoff Lang646559f2013-08-15 11:08:15 -04002995 if (attachmentObjectType == GL_NONE)
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002996 {
Geoff Lang646559f2013-08-15 11:08:15 -04002997 // ES 2.0.25 spec pg 127 states that if the value of FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE
2998 // is NONE, then querying any other pname will generate INVALID_ENUM.
2999
3000 // ES 3.0.2 spec pg 235 states that if the attachment type is none,
3001 // GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME will return zero and be an
3002 // INVALID_OPERATION for all other pnames
3003
3004 switch (pname)
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003005 {
Geoff Lang646559f2013-08-15 11:08:15 -04003006 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE:
3007 *params = attachmentObjectType;
3008 break;
3009
3010 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME:
3011 if (context->getClientVersion() < 3)
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003012 {
Geoff Lang646559f2013-08-15 11:08:15 -04003013 return gl::error(GL_INVALID_ENUM);
3014 }
3015 *params = 0;
3016 break;
3017
3018 default:
3019 if (context->getClientVersion() < 3)
3020 {
3021 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003022 }
3023 else
3024 {
Geoff Lang646559f2013-08-15 11:08:15 -04003025 gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003026 }
3027 }
Geoff Lang646559f2013-08-15 11:08:15 -04003028 }
3029 else
3030 {
3031 ASSERT(attachmentObjectType == GL_RENDERBUFFER || attachmentObjectType == GL_TEXTURE ||
3032 attachmentObjectType == GL_FRAMEBUFFER_DEFAULT);
3033 ASSERT(renderbuffer != NULL);
3034
3035 switch (pname)
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003036 {
Geoff Lang646559f2013-08-15 11:08:15 -04003037 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE:
3038 *params = attachmentObjectType;
3039 break;
3040
3041 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME:
3042 if (attachmentObjectType != GL_RENDERBUFFER && attachmentObjectType != GL_TEXTURE)
3043 {
3044 return gl::error(GL_INVALID_ENUM);
3045 }
3046 *params = attachmentHandle;
3047 break;
3048
3049 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL:
3050 if (attachmentObjectType != GL_TEXTURE)
3051 {
3052 return gl::error(GL_INVALID_ENUM);
3053 }
3054 *params = attachmentLevel;
3055 break;
3056
3057 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE:
3058 if (attachmentObjectType != GL_TEXTURE)
3059 {
3060 return gl::error(GL_INVALID_ENUM);
3061 }
3062 *params = gl::IsCubemapTextureTarget(attachmentType) ? attachmentType : 0;
3063 break;
3064
3065 case GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE:
3066 *params = renderbuffer->getRedSize();
3067 break;
3068
3069 case GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE:
3070 *params = renderbuffer->getGreenSize();
3071 break;
3072
3073 case GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE:
3074 *params = renderbuffer->getBlueSize();
3075 break;
3076
3077 case GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE:
3078 *params = renderbuffer->getAlphaSize();
3079 break;
3080
3081 case GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE:
3082 *params = renderbuffer->getDepthSize();
3083 break;
3084
3085 case GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE:
3086 *params = renderbuffer->getStencilSize();
3087 break;
3088
3089 case GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE:
3090 if (attachment == GL_DEPTH_STENCIL)
3091 {
3092 gl::error(GL_INVALID_OPERATION);
3093 }
3094 *params = renderbuffer->getComponentType();
3095 break;
3096
3097 case GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING:
3098 *params = renderbuffer->getColorEncoding();
3099 break;
3100
3101 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER:
3102 if (attachmentObjectType != GL_TEXTURE)
3103 {
3104 return gl::error(GL_INVALID_ENUM);
3105 }
3106 *params = attachmentLayer;
3107 break;
3108
3109 default:
3110 UNREACHABLE();
3111 break;
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003112 }
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003113 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003114 }
3115 }
3116 catch(std::bad_alloc&)
3117 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003118 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003119 }
3120}
3121
daniel@transgaming.com17f548c2011-11-09 17:47:02 +00003122GLenum __stdcall glGetGraphicsResetStatusEXT(void)
3123{
3124 EVENT("()");
3125
3126 try
3127 {
3128 gl::Context *context = gl::getContext();
3129
3130 if (context)
3131 {
3132 return context->getResetStatus();
3133 }
3134
3135 return GL_NO_ERROR;
3136 }
3137 catch(std::bad_alloc&)
3138 {
3139 return GL_OUT_OF_MEMORY;
3140 }
3141}
3142
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003143void __stdcall glGetIntegerv(GLenum pname, GLint* params)
3144{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003145 EVENT("(GLenum pname = 0x%X, GLint* params = 0x%0.8p)", pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003146
3147 try
3148 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003149 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003150
3151 if (context)
3152 {
Jamie Madill79f2f452013-12-19 11:13:02 -05003153 GLenum nativeType;
3154 unsigned int numParams = 0;
3155 if (!context->getQueryParameterInfo(pname, &nativeType, &numParams))
3156 return gl::error(GL_INVALID_ENUM);
3157
3158 // pname is valid, but there are no parameters to return
3159 if (numParams == 0)
3160 return;
3161
3162 if (nativeType == GL_INT)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003163 {
Jamie Madill79f2f452013-12-19 11:13:02 -05003164 context->getIntegerv(pname, params);
3165 }
3166 else if (nativeType == GL_BOOL)
3167 {
3168 GLboolean *boolParams = NULL;
3169 boolParams = new GLboolean[numParams];
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003170
Jamie Madill79f2f452013-12-19 11:13:02 -05003171 context->getBooleanv(pname, boolParams);
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003172
Jamie Madill79f2f452013-12-19 11:13:02 -05003173 for (unsigned int i = 0; i < numParams; ++i)
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003174 {
Jamie Madill79f2f452013-12-19 11:13:02 -05003175 if (boolParams[i] == GL_FALSE)
3176 params[i] = 0;
3177 else
3178 params[i] = 1;
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003179 }
Jamie Madill79f2f452013-12-19 11:13:02 -05003180
3181 delete [] boolParams;
3182 }
3183 else if (nativeType == GL_FLOAT)
3184 {
3185 GLfloat *floatParams = NULL;
3186 floatParams = new GLfloat[numParams];
3187
3188 context->getFloatv(pname, floatParams);
3189
3190 for (unsigned int i = 0; i < numParams; ++i)
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003191 {
Jamie Madill79f2f452013-12-19 11:13:02 -05003192 // RGBA color values and DepthRangeF values are converted to integer using Equation 2.4 from Table 4.5
3193 if (pname == GL_DEPTH_RANGE || pname == GL_COLOR_CLEAR_VALUE || pname == GL_DEPTH_CLEAR_VALUE || pname == GL_BLEND_COLOR)
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003194 {
Jamie Madill79f2f452013-12-19 11:13:02 -05003195 params[i] = static_cast<GLint>((static_cast<GLfloat>(0xFFFFFFFF) * floatParams[i] - 1.0f) / 2.0f);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003196 }
Jamie Madill79f2f452013-12-19 11:13:02 -05003197 else
3198 {
3199 params[i] = gl::iround<GLint>(floatParams[i]);
3200 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003201 }
Jamie Madill79f2f452013-12-19 11:13:02 -05003202
3203 delete [] floatParams;
3204 }
3205 else if (nativeType == GL_INT_64_ANGLEX)
3206 {
3207 GLint64 minIntValue = static_cast<GLint64>(std::numeric_limits<int>::min());
3208 GLint64 maxIntValue = static_cast<GLint64>(std::numeric_limits<int>::max());
3209 GLint64 *int64Params = NULL;
3210 int64Params = new GLint64[numParams];
3211
3212 context->getInteger64v(pname, int64Params);
3213
3214 for (unsigned int i = 0; i < numParams; ++i)
Jamie Madill71fbd602013-07-19 16:36:55 -04003215 {
Jamie Madill79f2f452013-12-19 11:13:02 -05003216 GLint64 clampedValue = std::max(std::min(int64Params[i], maxIntValue), minIntValue);
3217 params[i] = static_cast<GLint>(clampedValue);
Jamie Madill71fbd602013-07-19 16:36:55 -04003218 }
Jamie Madill79f2f452013-12-19 11:13:02 -05003219
3220 delete [] int64Params;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003221 }
3222 }
3223 }
3224 catch(std::bad_alloc&)
3225 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003226 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003227 }
3228}
3229
3230void __stdcall glGetProgramiv(GLuint program, GLenum pname, GLint* params)
3231{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003232 EVENT("(GLuint program = %d, GLenum pname = %d, GLint* params = 0x%0.8p)", program, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003233
3234 try
3235 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003236 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003237
3238 if (context)
3239 {
3240 gl::Program *programObject = context->getProgram(program);
3241
3242 if (!programObject)
3243 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003244 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003245 }
3246
shannonwoods@chromium.orge684b582013-05-30 00:07:42 +00003247 if (context->getClientVersion() < 3)
3248 {
3249 switch (pname)
3250 {
3251 case GL_ACTIVE_UNIFORM_BLOCKS:
3252 case GL_ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH:
3253 return gl::error(GL_INVALID_ENUM);
3254 }
3255 }
3256
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003257 switch (pname)
3258 {
3259 case GL_DELETE_STATUS:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003260 *params = programObject->isFlaggedForDeletion();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003261 return;
3262 case GL_LINK_STATUS:
daniel@transgaming.com716056c2012-07-24 18:38:59 +00003263 *params = programObject->isLinked();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003264 return;
3265 case GL_VALIDATE_STATUS:
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00003266 *params = programObject->isValidated();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003267 return;
3268 case GL_INFO_LOG_LENGTH:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003269 *params = programObject->getInfoLogLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003270 return;
3271 case GL_ATTACHED_SHADERS:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003272 *params = programObject->getAttachedShadersCount();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003273 return;
3274 case GL_ACTIVE_ATTRIBUTES:
daniel@transgaming.com85423182010-04-22 13:35:27 +00003275 *params = programObject->getActiveAttributeCount();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003276 return;
3277 case GL_ACTIVE_ATTRIBUTE_MAX_LENGTH:
daniel@transgaming.com85423182010-04-22 13:35:27 +00003278 *params = programObject->getActiveAttributeMaxLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003279 return;
3280 case GL_ACTIVE_UNIFORMS:
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00003281 *params = programObject->getActiveUniformCount();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003282 return;
3283 case GL_ACTIVE_UNIFORM_MAX_LENGTH:
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00003284 *params = programObject->getActiveUniformMaxLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003285 return;
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00003286 case GL_PROGRAM_BINARY_LENGTH_OES:
apatrick@chromium.org90080e32012-07-09 22:15:33 +00003287 *params = programObject->getProgramBinaryLength();
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00003288 return;
shannonwoods@chromium.orge684b582013-05-30 00:07:42 +00003289 case GL_ACTIVE_UNIFORM_BLOCKS:
3290 *params = programObject->getActiveUniformBlockCount();
3291 return;
3292 case GL_ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH:
3293 *params = programObject->getActiveUniformBlockMaxLength();
3294 break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003295 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003296 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003297 }
3298 }
3299 }
3300 catch(std::bad_alloc&)
3301 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003302 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003303 }
3304}
3305
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00003306void __stdcall glGetProgramInfoLog(GLuint program, GLsizei bufsize, GLsizei* length, GLchar* infolog)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003307{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003308 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 +00003309 program, bufsize, length, infolog);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003310
3311 try
3312 {
3313 if (bufsize < 0)
3314 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003315 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003316 }
3317
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003318 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003319
3320 if (context)
3321 {
3322 gl::Program *programObject = context->getProgram(program);
3323
3324 if (!programObject)
3325 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003326 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003327 }
3328
3329 programObject->getInfoLog(bufsize, length, infolog);
3330 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003331 }
3332 catch(std::bad_alloc&)
3333 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003334 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003335 }
3336}
3337
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003338void __stdcall glGetQueryivEXT(GLenum target, GLenum pname, GLint *params)
3339{
3340 EVENT("GLenum target = 0x%X, GLenum pname = 0x%X, GLint *params = 0x%0.8p)", target, pname, params);
3341
3342 try
3343 {
3344 switch (pname)
3345 {
3346 case GL_CURRENT_QUERY_EXT:
3347 break;
3348 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003349 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003350 }
3351
3352 gl::Context *context = gl::getNonLostContext();
3353
3354 if (context)
3355 {
3356 params[0] = context->getActiveQuery(target);
3357 }
3358 }
3359 catch(std::bad_alloc&)
3360 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003361 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003362 }
3363}
3364
3365void __stdcall glGetQueryObjectuivEXT(GLuint id, GLenum pname, GLuint *params)
3366{
3367 EVENT("(GLuint id = %d, GLenum pname = 0x%X, GLuint *params = 0x%0.8p)", id, pname, params);
3368
3369 try
3370 {
3371 switch (pname)
3372 {
3373 case GL_QUERY_RESULT_EXT:
3374 case GL_QUERY_RESULT_AVAILABLE_EXT:
3375 break;
3376 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003377 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003378 }
3379 gl::Context *context = gl::getNonLostContext();
3380
3381 if (context)
3382 {
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003383 gl::Query *queryObject = context->getQuery(id, false, GL_NONE);
3384
3385 if (!queryObject)
3386 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003387 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003388 }
3389
3390 if (context->getActiveQuery(queryObject->getType()) == id)
3391 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003392 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003393 }
3394
3395 switch(pname)
3396 {
3397 case GL_QUERY_RESULT_EXT:
3398 params[0] = queryObject->getResult();
3399 break;
3400 case GL_QUERY_RESULT_AVAILABLE_EXT:
3401 params[0] = queryObject->isResultAvailable();
3402 break;
3403 default:
3404 ASSERT(false);
3405 }
3406 }
3407 }
3408 catch(std::bad_alloc&)
3409 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003410 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003411 }
3412}
3413
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003414void __stdcall glGetRenderbufferParameteriv(GLenum target, GLenum pname, GLint* params)
3415{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003416 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 +00003417
3418 try
3419 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003420 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003421
3422 if (context)
3423 {
3424 if (target != GL_RENDERBUFFER)
3425 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003426 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003427 }
3428
daniel@transgaming.com428d1582010-05-04 03:35:25 +00003429 if (context->getRenderbufferHandle() == 0)
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003430 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003431 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003432 }
3433
daniel@transgaming.com428d1582010-05-04 03:35:25 +00003434 gl::Renderbuffer *renderbuffer = context->getRenderbuffer(context->getRenderbufferHandle());
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003435
3436 switch (pname)
3437 {
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +00003438 case GL_RENDERBUFFER_WIDTH: *params = renderbuffer->getWidth(); break;
3439 case GL_RENDERBUFFER_HEIGHT: *params = renderbuffer->getHeight(); break;
3440 case GL_RENDERBUFFER_INTERNAL_FORMAT: *params = renderbuffer->getInternalFormat(); break;
3441 case GL_RENDERBUFFER_RED_SIZE: *params = renderbuffer->getRedSize(); break;
3442 case GL_RENDERBUFFER_GREEN_SIZE: *params = renderbuffer->getGreenSize(); break;
3443 case GL_RENDERBUFFER_BLUE_SIZE: *params = renderbuffer->getBlueSize(); break;
3444 case GL_RENDERBUFFER_ALPHA_SIZE: *params = renderbuffer->getAlphaSize(); break;
3445 case GL_RENDERBUFFER_DEPTH_SIZE: *params = renderbuffer->getDepthSize(); break;
3446 case GL_RENDERBUFFER_STENCIL_SIZE: *params = renderbuffer->getStencilSize(); break;
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00003447 case GL_RENDERBUFFER_SAMPLES_ANGLE:
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +00003448 if (context->getMaxSupportedSamples() != 0)
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00003449 {
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +00003450 *params = renderbuffer->getSamples();
3451 }
3452 else
3453 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003454 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00003455 }
3456 break;
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003457 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003458 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003459 }
3460 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003461 }
3462 catch(std::bad_alloc&)
3463 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003464 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003465 }
3466}
3467
3468void __stdcall glGetShaderiv(GLuint shader, GLenum pname, GLint* params)
3469{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003470 EVENT("(GLuint shader = %d, GLenum pname = %d, GLint* params = 0x%0.8p)", shader, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003471
3472 try
3473 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003474 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003475
3476 if (context)
3477 {
3478 gl::Shader *shaderObject = context->getShader(shader);
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00003479
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003480 if (!shaderObject)
3481 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003482 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003483 }
3484
3485 switch (pname)
3486 {
3487 case GL_SHADER_TYPE:
3488 *params = shaderObject->getType();
3489 return;
3490 case GL_DELETE_STATUS:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003491 *params = shaderObject->isFlaggedForDeletion();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003492 return;
3493 case GL_COMPILE_STATUS:
3494 *params = shaderObject->isCompiled() ? GL_TRUE : GL_FALSE;
3495 return;
3496 case GL_INFO_LOG_LENGTH:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003497 *params = shaderObject->getInfoLogLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003498 return;
3499 case GL_SHADER_SOURCE_LENGTH:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003500 *params = shaderObject->getSourceLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003501 return;
zmo@google.coma574f782011-10-03 21:45:23 +00003502 case GL_TRANSLATED_SHADER_SOURCE_LENGTH_ANGLE:
3503 *params = shaderObject->getTranslatedSourceLength();
3504 return;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003505 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003506 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003507 }
3508 }
3509 }
3510 catch(std::bad_alloc&)
3511 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003512 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003513 }
3514}
3515
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00003516void __stdcall glGetShaderInfoLog(GLuint shader, GLsizei bufsize, GLsizei* length, GLchar* infolog)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003517{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003518 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 +00003519 shader, bufsize, length, infolog);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003520
3521 try
3522 {
3523 if (bufsize < 0)
3524 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003525 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003526 }
3527
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003528 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003529
3530 if (context)
3531 {
3532 gl::Shader *shaderObject = context->getShader(shader);
3533
3534 if (!shaderObject)
3535 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003536 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003537 }
3538
3539 shaderObject->getInfoLog(bufsize, length, infolog);
3540 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003541 }
3542 catch(std::bad_alloc&)
3543 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003544 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003545 }
3546}
3547
3548void __stdcall glGetShaderPrecisionFormat(GLenum shadertype, GLenum precisiontype, GLint* range, GLint* precision)
3549{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003550 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 +00003551 shadertype, precisiontype, range, precision);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003552
3553 try
3554 {
daniel@transgaming.com6c785212010-03-30 03:36:17 +00003555 switch (shadertype)
3556 {
3557 case GL_VERTEX_SHADER:
3558 case GL_FRAGMENT_SHADER:
3559 break;
3560 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003561 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com6c785212010-03-30 03:36:17 +00003562 }
3563
3564 switch (precisiontype)
3565 {
3566 case GL_LOW_FLOAT:
3567 case GL_MEDIUM_FLOAT:
3568 case GL_HIGH_FLOAT:
3569 // Assume IEEE 754 precision
3570 range[0] = 127;
3571 range[1] = 127;
daniel@transgaming.comc5c15382010-04-23 18:34:49 +00003572 *precision = 23;
daniel@transgaming.com6c785212010-03-30 03:36:17 +00003573 break;
3574 case GL_LOW_INT:
3575 case GL_MEDIUM_INT:
3576 case GL_HIGH_INT:
3577 // Some (most) hardware only supports single-precision floating-point numbers,
3578 // which can accurately represent integers up to +/-16777216
3579 range[0] = 24;
3580 range[1] = 24;
daniel@transgaming.comc5c15382010-04-23 18:34:49 +00003581 *precision = 0;
daniel@transgaming.com6c785212010-03-30 03:36:17 +00003582 break;
3583 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003584 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com6c785212010-03-30 03:36:17 +00003585 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003586 }
3587 catch(std::bad_alloc&)
3588 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003589 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003590 }
3591}
3592
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00003593void __stdcall glGetShaderSource(GLuint shader, GLsizei bufsize, GLsizei* length, GLchar* source)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003594{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003595 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 +00003596 shader, bufsize, length, source);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003597
3598 try
3599 {
3600 if (bufsize < 0)
3601 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003602 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003603 }
3604
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003605 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003606
3607 if (context)
3608 {
3609 gl::Shader *shaderObject = context->getShader(shader);
3610
3611 if (!shaderObject)
3612 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003613 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003614 }
3615
3616 shaderObject->getSource(bufsize, length, source);
3617 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003618 }
3619 catch(std::bad_alloc&)
3620 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003621 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003622 }
3623}
3624
zmo@google.coma574f782011-10-03 21:45:23 +00003625void __stdcall glGetTranslatedShaderSourceANGLE(GLuint shader, GLsizei bufsize, GLsizei* length, GLchar* source)
3626{
3627 EVENT("(GLuint shader = %d, GLsizei bufsize = %d, GLsizei* length = 0x%0.8p, GLchar* source = 0x%0.8p)",
3628 shader, bufsize, length, source);
3629
3630 try
3631 {
3632 if (bufsize < 0)
3633 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003634 return gl::error(GL_INVALID_VALUE);
zmo@google.coma574f782011-10-03 21:45:23 +00003635 }
3636
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003637 gl::Context *context = gl::getNonLostContext();
zmo@google.coma574f782011-10-03 21:45:23 +00003638
3639 if (context)
3640 {
3641 gl::Shader *shaderObject = context->getShader(shader);
3642
3643 if (!shaderObject)
3644 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003645 return gl::error(GL_INVALID_OPERATION);
zmo@google.coma574f782011-10-03 21:45:23 +00003646 }
3647
3648 shaderObject->getTranslatedSource(bufsize, length, source);
3649 }
3650 }
3651 catch(std::bad_alloc&)
3652 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003653 return gl::error(GL_OUT_OF_MEMORY);
zmo@google.coma574f782011-10-03 21:45:23 +00003654 }
3655}
3656
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003657const GLubyte* __stdcall glGetString(GLenum name)
3658{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003659 EVENT("(GLenum name = 0x%X)", name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003660
3661 try
3662 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003663 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com3e4c6002010-05-05 18:50:13 +00003664
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003665 switch (name)
3666 {
3667 case GL_VENDOR:
daniel@transgaming.coma0ce7e62011-01-25 14:47:16 +00003668 return (GLubyte*)"Google Inc.";
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003669 case GL_RENDERER:
daniel@transgaming.comc23ff642011-08-16 20:28:45 +00003670 return (GLubyte*)((context != NULL) ? context->getRendererString() : "ANGLE");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003671 case GL_VERSION:
shannonwoods@chromium.orge2865d02013-05-30 00:06:01 +00003672 if (context->getClientVersion() == 2)
3673 {
3674 return (GLubyte*)"OpenGL ES 2.0 (ANGLE " VERSION_STRING ")";
3675 }
3676 else
3677 {
3678 return (GLubyte*)"OpenGL ES 3.0 (ANGLE " VERSION_STRING ")";
3679 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003680 case GL_SHADING_LANGUAGE_VERSION:
shannonwoods@chromium.orge2865d02013-05-30 00:06:01 +00003681 if (context->getClientVersion() == 2)
3682 {
3683 return (GLubyte*)"OpenGL ES GLSL ES 1.00 (ANGLE " VERSION_STRING ")";
3684 }
3685 else
3686 {
3687 return (GLubyte*)"OpenGL ES GLSL ES 3.00 (ANGLE " VERSION_STRING ")";
3688 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003689 case GL_EXTENSIONS:
shannonwoods@chromium.org302df742013-05-30 00:05:54 +00003690 return (GLubyte*)((context != NULL) ? context->getCombinedExtensionsString() : "");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003691 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003692 return gl::error(GL_INVALID_ENUM, (GLubyte*)NULL);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003693 }
3694 }
3695 catch(std::bad_alloc&)
3696 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003697 return gl::error(GL_OUT_OF_MEMORY, (GLubyte*)NULL);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003698 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003699}
3700
3701void __stdcall glGetTexParameterfv(GLenum target, GLenum pname, GLfloat* params)
3702{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003703 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 +00003704
3705 try
3706 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003707 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003708
3709 if (context)
3710 {
Jamie Madill35d15012013-10-07 10:46:37 -04003711 gl::Texture *texture = GetTargetTexture(context, target);
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003712
Jamie Madillfb8a8302013-07-03 14:24:12 -04003713 if (!texture)
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003714 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003715 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003716 }
3717
3718 switch (pname)
3719 {
3720 case GL_TEXTURE_MAG_FILTER:
3721 *params = (GLfloat)texture->getMagFilter();
3722 break;
3723 case GL_TEXTURE_MIN_FILTER:
3724 *params = (GLfloat)texture->getMinFilter();
3725 break;
3726 case GL_TEXTURE_WRAP_S:
3727 *params = (GLfloat)texture->getWrapS();
3728 break;
3729 case GL_TEXTURE_WRAP_T:
3730 *params = (GLfloat)texture->getWrapT();
3731 break;
shannon.woods%transgaming.com@gtempaccount.com0b3a8df2013-04-13 03:44:51 +00003732 case GL_TEXTURE_WRAP_R:
3733 if (context->getClientVersion() < 3)
3734 {
3735 return gl::error(GL_INVALID_ENUM);
3736 }
3737 *params = (GLfloat)texture->getWrapR();
3738 break;
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00003739 case GL_TEXTURE_IMMUTABLE_FORMAT:
3740 // Exposed to ES2.0 through EXT_texture_storage, no client version validation.
daniel@transgaming.comd30bd0a2011-11-11 04:10:34 +00003741 *params = (GLfloat)(texture->isImmutable() ? GL_TRUE : GL_FALSE);
3742 break;
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00003743 case GL_TEXTURE_IMMUTABLE_LEVELS:
3744 if (context->getClientVersion() < 3)
3745 {
3746 return gl::error(GL_INVALID_ENUM);
3747 }
Jamie Madill51a94372013-10-24 17:49:43 -04003748 *params = (GLfloat)texture->immutableLevelCount();
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00003749 break;
daniel@transgaming.com7d18c172011-11-11 04:18:21 +00003750 case GL_TEXTURE_USAGE_ANGLE:
3751 *params = (GLfloat)texture->getUsage();
3752 break;
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00003753 case GL_TEXTURE_MAX_ANISOTROPY_EXT:
3754 if (!context->supportsTextureFilterAnisotropy())
3755 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003756 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00003757 }
3758 *params = (GLfloat)texture->getMaxAnisotropy();
3759 break;
Geoff Langbc90a482013-09-17 16:51:27 -04003760 case GL_TEXTURE_SWIZZLE_R:
3761 if (context->getClientVersion() < 3)
3762 {
3763 return gl::error(GL_INVALID_ENUM);
3764 }
3765 *params = (GLfloat)texture->getSwizzleRed();
3766 break;
3767 case GL_TEXTURE_SWIZZLE_G:
3768 if (context->getClientVersion() < 3)
3769 {
3770 return gl::error(GL_INVALID_ENUM);
3771 }
3772 *params = (GLfloat)texture->getSwizzleGreen();
3773 break;
3774 case GL_TEXTURE_SWIZZLE_B:
3775 if (context->getClientVersion() < 3)
3776 {
3777 return gl::error(GL_INVALID_ENUM);
3778 }
3779 *params = (GLfloat)texture->getSwizzleBlue();
3780 break;
3781 case GL_TEXTURE_SWIZZLE_A:
3782 if (context->getClientVersion() < 3)
3783 {
3784 return gl::error(GL_INVALID_ENUM);
3785 }
3786 *params = (GLfloat)texture->getSwizzleAlpha();
3787 break;
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003788 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003789 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003790 }
3791 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003792 }
3793 catch(std::bad_alloc&)
3794 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003795 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003796 }
3797}
3798
3799void __stdcall glGetTexParameteriv(GLenum target, GLenum pname, GLint* params)
3800{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003801 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 +00003802
3803 try
3804 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003805 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003806
3807 if (context)
3808 {
Jamie Madill35d15012013-10-07 10:46:37 -04003809 gl::Texture *texture = GetTargetTexture(context, target);
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003810
Jamie Madillfb8a8302013-07-03 14:24:12 -04003811 if (!texture)
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003812 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003813 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003814 }
3815
3816 switch (pname)
3817 {
3818 case GL_TEXTURE_MAG_FILTER:
3819 *params = texture->getMagFilter();
3820 break;
3821 case GL_TEXTURE_MIN_FILTER:
3822 *params = texture->getMinFilter();
3823 break;
3824 case GL_TEXTURE_WRAP_S:
3825 *params = texture->getWrapS();
3826 break;
3827 case GL_TEXTURE_WRAP_T:
3828 *params = texture->getWrapT();
3829 break;
shannon.woods%transgaming.com@gtempaccount.com0b3a8df2013-04-13 03:44:51 +00003830 case GL_TEXTURE_WRAP_R:
3831 if (context->getClientVersion() < 3)
3832 {
3833 return gl::error(GL_INVALID_ENUM);
3834 }
3835 *params = texture->getWrapR();
3836 break;
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00003837 case GL_TEXTURE_IMMUTABLE_FORMAT:
3838 // Exposed to ES2.0 through EXT_texture_storage, no client version validation.
daniel@transgaming.comd30bd0a2011-11-11 04:10:34 +00003839 *params = texture->isImmutable() ? GL_TRUE : GL_FALSE;
3840 break;
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00003841 case GL_TEXTURE_IMMUTABLE_LEVELS:
3842 if (context->getClientVersion() < 3)
3843 {
3844 return gl::error(GL_INVALID_ENUM);
3845 }
Jamie Madill51a94372013-10-24 17:49:43 -04003846 *params = texture->immutableLevelCount();
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00003847 break;
daniel@transgaming.com7d18c172011-11-11 04:18:21 +00003848 case GL_TEXTURE_USAGE_ANGLE:
3849 *params = texture->getUsage();
3850 break;
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00003851 case GL_TEXTURE_MAX_ANISOTROPY_EXT:
3852 if (!context->supportsTextureFilterAnisotropy())
3853 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003854 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00003855 }
3856 *params = (GLint)texture->getMaxAnisotropy();
3857 break;
Geoff Langbc90a482013-09-17 16:51:27 -04003858 case GL_TEXTURE_SWIZZLE_R:
3859 if (context->getClientVersion() < 3)
3860 {
3861 return gl::error(GL_INVALID_ENUM);
3862 }
3863 *params = texture->getSwizzleRed();
3864 break;
3865 case GL_TEXTURE_SWIZZLE_G:
3866 if (context->getClientVersion() < 3)
3867 {
3868 return gl::error(GL_INVALID_ENUM);
3869 }
3870 *params = texture->getSwizzleGreen();
3871 break;
3872 case GL_TEXTURE_SWIZZLE_B:
3873 if (context->getClientVersion() < 3)
3874 {
3875 return gl::error(GL_INVALID_ENUM);
3876 }
3877 *params = texture->getSwizzleBlue();
3878 break;
3879 case GL_TEXTURE_SWIZZLE_A:
3880 if (context->getClientVersion() < 3)
3881 {
3882 return gl::error(GL_INVALID_ENUM);
3883 }
3884 *params = texture->getSwizzleAlpha();
3885 break;
shannonwoods@chromium.orgabf14cc2013-05-30 00:20:58 +00003886
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003887 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003888 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003889 }
3890 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003891 }
3892 catch(std::bad_alloc&)
3893 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003894 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003895 }
3896}
3897
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003898void __stdcall glGetnUniformfvEXT(GLuint program, GLint location, GLsizei bufSize, GLfloat* params)
3899{
3900 EVENT("(GLuint program = %d, GLint location = %d, GLsizei bufSize = %d, GLfloat* params = 0x%0.8p)",
3901 program, location, bufSize, params);
3902
3903 try
3904 {
3905 if (bufSize < 0)
3906 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003907 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003908 }
3909
3910 gl::Context *context = gl::getNonLostContext();
3911
3912 if (context)
3913 {
3914 if (program == 0)
3915 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003916 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003917 }
3918
3919 gl::Program *programObject = context->getProgram(program);
3920
daniel@transgaming.com716056c2012-07-24 18:38:59 +00003921 if (!programObject || !programObject->isLinked())
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003922 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003923 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003924 }
3925
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003926 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
3927 if (!programBinary)
3928 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003929 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003930 }
3931
3932 if (!programBinary->getUniformfv(location, &bufSize, params))
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003933 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003934 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003935 }
3936 }
3937 }
3938 catch(std::bad_alloc&)
3939 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003940 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003941 }
3942}
3943
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003944void __stdcall glGetUniformfv(GLuint program, GLint location, GLfloat* params)
3945{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003946 EVENT("(GLuint program = %d, GLint location = %d, GLfloat* params = 0x%0.8p)", program, location, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003947
3948 try
3949 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003950 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003951
3952 if (context)
3953 {
3954 if (program == 0)
3955 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003956 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003957 }
3958
3959 gl::Program *programObject = context->getProgram(program);
3960
daniel@transgaming.com716056c2012-07-24 18:38:59 +00003961 if (!programObject || !programObject->isLinked())
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003962 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003963 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003964 }
3965
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003966 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
3967 if (!programBinary)
3968 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003969 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003970 }
3971
3972 if (!programBinary->getUniformfv(location, NULL, params))
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003973 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003974 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003975 }
3976 }
3977 }
3978 catch(std::bad_alloc&)
3979 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003980 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003981 }
3982}
3983
3984void __stdcall glGetnUniformivEXT(GLuint program, GLint location, GLsizei bufSize, GLint* params)
3985{
3986 EVENT("(GLuint program = %d, GLint location = %d, GLsizei bufSize = %d, GLint* params = 0x%0.8p)",
3987 program, location, bufSize, params);
3988
3989 try
3990 {
3991 if (bufSize < 0)
3992 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003993 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003994 }
3995
3996 gl::Context *context = gl::getNonLostContext();
3997
3998 if (context)
3999 {
4000 if (program == 0)
4001 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004002 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004003 }
4004
4005 gl::Program *programObject = context->getProgram(program);
4006
daniel@transgaming.com716056c2012-07-24 18:38:59 +00004007 if (!programObject || !programObject->isLinked())
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004008 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004009 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004010 }
4011
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00004012 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
4013 if (!programBinary)
4014 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004015 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00004016 }
4017
4018 if (!programBinary->getUniformiv(location, &bufSize, params))
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004019 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004020 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004021 }
4022 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004023 }
4024 catch(std::bad_alloc&)
4025 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004026 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004027 }
4028}
4029
4030void __stdcall glGetUniformiv(GLuint program, GLint location, GLint* params)
4031{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004032 EVENT("(GLuint program = %d, GLint location = %d, GLint* params = 0x%0.8p)", program, location, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004033
4034 try
4035 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004036 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004037
4038 if (context)
4039 {
4040 if (program == 0)
4041 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004042 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004043 }
4044
4045 gl::Program *programObject = context->getProgram(program);
4046
daniel@transgaming.com716056c2012-07-24 18:38:59 +00004047 if (!programObject || !programObject->isLinked())
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004048 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004049 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004050 }
4051
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00004052 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
4053 if (!programBinary)
4054 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004055 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00004056 }
4057
4058 if (!programBinary->getUniformiv(location, NULL, params))
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004059 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004060 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004061 }
4062 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004063 }
4064 catch(std::bad_alloc&)
4065 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004066 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004067 }
4068}
4069
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00004070int __stdcall glGetUniformLocation(GLuint program, const GLchar* name)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004071{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004072 EVENT("(GLuint program = %d, const GLchar* name = 0x%0.8p)", program, name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004073
4074 try
4075 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004076 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004077
4078 if (strstr(name, "gl_") == name)
4079 {
4080 return -1;
4081 }
4082
4083 if (context)
4084 {
4085 gl::Program *programObject = context->getProgram(program);
4086
4087 if (!programObject)
4088 {
daniel@transgaming.comd1abe5b2010-04-13 19:53:33 +00004089 if (context->getShader(program))
4090 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004091 return gl::error(GL_INVALID_OPERATION, -1);
daniel@transgaming.comd1abe5b2010-04-13 19:53:33 +00004092 }
4093 else
4094 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004095 return gl::error(GL_INVALID_VALUE, -1);
daniel@transgaming.comd1abe5b2010-04-13 19:53:33 +00004096 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004097 }
4098
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00004099 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
daniel@transgaming.com716056c2012-07-24 18:38:59 +00004100 if (!programObject->isLinked() || !programBinary)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004101 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004102 return gl::error(GL_INVALID_OPERATION, -1);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004103 }
4104
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00004105 return programBinary->getUniformLocation(name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004106 }
4107 }
4108 catch(std::bad_alloc&)
4109 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004110 return gl::error(GL_OUT_OF_MEMORY, -1);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004111 }
4112
4113 return -1;
4114}
4115
4116void __stdcall glGetVertexAttribfv(GLuint index, GLenum pname, GLfloat* params)
4117{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004118 EVENT("(GLuint index = %d, GLenum pname = 0x%X, GLfloat* params = 0x%0.8p)", index, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004119
4120 try
4121 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004122 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004123
daniel@transgaming.come0078962010-04-15 20:45:08 +00004124 if (context)
4125 {
4126 if (index >= gl::MAX_VERTEX_ATTRIBS)
4127 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004128 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004129 }
4130
daniel@transgaming.com83921382011-01-08 05:46:00 +00004131 const gl::VertexAttribute &attribState = context->getVertexAttribState(index);
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004132
Geoff Lang34dbb6f2013-08-05 15:05:47 -04004133 if (!gl::ValidateGetVertexAttribParameters(pname, context->getClientVersion()))
daniel@transgaming.come0078962010-04-15 20:45:08 +00004134 {
Jamie Madillaff71502013-07-02 11:57:05 -04004135 return;
4136 }
4137
4138 if (pname == GL_CURRENT_VERTEX_ATTRIB)
4139 {
4140 const gl::VertexAttribCurrentValueData &currentValueData = context->getVertexAttribCurrentValue(index);
4141 for (int i = 0; i < 4; ++i)
daniel@transgaming.come0078962010-04-15 20:45:08 +00004142 {
Jamie Madillaff71502013-07-02 11:57:05 -04004143 params[i] = currentValueData.FloatValues[i];
daniel@transgaming.come0078962010-04-15 20:45:08 +00004144 }
Jamie Madillaff71502013-07-02 11:57:05 -04004145 }
4146 else
4147 {
4148 *params = attribState.querySingleParameter<GLfloat>(pname);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004149 }
4150 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004151 }
4152 catch(std::bad_alloc&)
4153 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004154 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004155 }
4156}
4157
4158void __stdcall glGetVertexAttribiv(GLuint index, GLenum pname, GLint* params)
4159{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004160 EVENT("(GLuint index = %d, GLenum pname = 0x%X, GLint* params = 0x%0.8p)", index, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004161
4162 try
4163 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004164 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004165
daniel@transgaming.come0078962010-04-15 20:45:08 +00004166 if (context)
4167 {
4168 if (index >= gl::MAX_VERTEX_ATTRIBS)
4169 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004170 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004171 }
4172
daniel@transgaming.com83921382011-01-08 05:46:00 +00004173 const gl::VertexAttribute &attribState = context->getVertexAttribState(index);
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004174
Geoff Lang34dbb6f2013-08-05 15:05:47 -04004175 if (!gl::ValidateGetVertexAttribParameters(pname, context->getClientVersion()))
daniel@transgaming.come0078962010-04-15 20:45:08 +00004176 {
Jamie Madillaff71502013-07-02 11:57:05 -04004177 return;
4178 }
4179
4180 if (pname == GL_CURRENT_VERTEX_ATTRIB)
4181 {
4182 const gl::VertexAttribCurrentValueData &currentValueData = context->getVertexAttribCurrentValue(index);
4183 for (int i = 0; i < 4; ++i)
daniel@transgaming.come0078962010-04-15 20:45:08 +00004184 {
Jamie Madillaff71502013-07-02 11:57:05 -04004185 float currentValue = currentValueData.FloatValues[i];
Jamie Madillaf496912013-07-19 16:36:54 -04004186 params[i] = gl::iround<GLint>(currentValue);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004187 }
Jamie Madillaff71502013-07-02 11:57:05 -04004188 }
4189 else
4190 {
4191 *params = attribState.querySingleParameter<GLint>(pname);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004192 }
4193 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004194 }
4195 catch(std::bad_alloc&)
4196 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004197 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004198 }
4199}
4200
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00004201void __stdcall glGetVertexAttribPointerv(GLuint index, GLenum pname, GLvoid** pointer)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004202{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004203 EVENT("(GLuint index = %d, GLenum pname = 0x%X, GLvoid** pointer = 0x%0.8p)", index, pname, pointer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004204
4205 try
4206 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004207 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004208
daniel@transgaming.come0078962010-04-15 20:45:08 +00004209 if (context)
4210 {
4211 if (index >= gl::MAX_VERTEX_ATTRIBS)
4212 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004213 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004214 }
4215
4216 if (pname != GL_VERTEX_ATTRIB_ARRAY_POINTER)
4217 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004218 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004219 }
4220
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004221 *pointer = const_cast<GLvoid*>(context->getVertexAttribPointer(index));
daniel@transgaming.come0078962010-04-15 20:45:08 +00004222 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004223 }
4224 catch(std::bad_alloc&)
4225 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004226 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004227 }
4228}
4229
4230void __stdcall glHint(GLenum target, GLenum mode)
4231{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004232 EVENT("(GLenum target = 0x%X, GLenum mode = 0x%X)", target, mode);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004233
4234 try
4235 {
alokp@chromium.orgd303ef92010-09-09 17:30:15 +00004236 switch (mode)
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00004237 {
alokp@chromium.orgd303ef92010-09-09 17:30:15 +00004238 case GL_FASTEST:
4239 case GL_NICEST:
4240 case GL_DONT_CARE:
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00004241 break;
4242 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004243 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00004244 }
4245
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004246 gl::Context *context = gl::getNonLostContext();
alokp@chromium.orgd303ef92010-09-09 17:30:15 +00004247 switch (target)
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00004248 {
alokp@chromium.orgd303ef92010-09-09 17:30:15 +00004249 case GL_GENERATE_MIPMAP_HINT:
4250 if (context) context->setGenerateMipmapHint(mode);
4251 break;
4252 case GL_FRAGMENT_SHADER_DERIVATIVE_HINT_OES:
4253 if (context) context->setFragmentShaderDerivativeHint(mode);
4254 break;
4255 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004256 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00004257 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004258 }
4259 catch(std::bad_alloc&)
4260 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004261 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004262 }
4263}
4264
4265GLboolean __stdcall glIsBuffer(GLuint buffer)
4266{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004267 EVENT("(GLuint buffer = %d)", buffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004268
4269 try
4270 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004271 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004272
4273 if (context && buffer)
4274 {
4275 gl::Buffer *bufferObject = context->getBuffer(buffer);
4276
4277 if (bufferObject)
4278 {
4279 return GL_TRUE;
4280 }
4281 }
4282 }
4283 catch(std::bad_alloc&)
4284 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004285 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004286 }
4287
4288 return GL_FALSE;
4289}
4290
4291GLboolean __stdcall glIsEnabled(GLenum cap)
4292{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004293 EVENT("(GLenum cap = 0x%X)", cap);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004294
4295 try
4296 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004297 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004298
4299 if (context)
4300 {
4301 switch (cap)
4302 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004303 case GL_CULL_FACE: return context->isCullFaceEnabled();
4304 case GL_POLYGON_OFFSET_FILL: return context->isPolygonOffsetFillEnabled();
4305 case GL_SAMPLE_ALPHA_TO_COVERAGE: return context->isSampleAlphaToCoverageEnabled();
4306 case GL_SAMPLE_COVERAGE: return context->isSampleCoverageEnabled();
4307 case GL_SCISSOR_TEST: return context->isScissorTestEnabled();
4308 case GL_STENCIL_TEST: return context->isStencilTestEnabled();
4309 case GL_DEPTH_TEST: return context->isDepthTestEnabled();
4310 case GL_BLEND: return context->isBlendEnabled();
4311 case GL_DITHER: return context->isDitherEnabled();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004312 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004313 return gl::error(GL_INVALID_ENUM, false);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004314 }
4315 }
4316 }
4317 catch(std::bad_alloc&)
4318 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004319 return gl::error(GL_OUT_OF_MEMORY, false);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004320 }
4321
4322 return false;
4323}
4324
daniel@transgaming.comfe208882010-09-01 15:47:57 +00004325GLboolean __stdcall glIsFenceNV(GLuint fence)
4326{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004327 EVENT("(GLuint fence = %d)", fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004328
4329 try
4330 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004331 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004332
4333 if (context)
4334 {
Jamie Madill33dc8432013-07-26 11:55:05 -04004335 gl::FenceNV *fenceObject = context->getFenceNV(fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004336
4337 if (fenceObject == NULL)
4338 {
4339 return GL_FALSE;
4340 }
4341
4342 return fenceObject->isFence();
4343 }
4344 }
4345 catch(std::bad_alloc&)
4346 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004347 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004348 }
4349
4350 return GL_FALSE;
daniel@transgaming.comfe208882010-09-01 15:47:57 +00004351}
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004352
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004353GLboolean __stdcall glIsFramebuffer(GLuint framebuffer)
4354{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004355 EVENT("(GLuint framebuffer = %d)", framebuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004356
4357 try
4358 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004359 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004360
4361 if (context && framebuffer)
4362 {
4363 gl::Framebuffer *framebufferObject = context->getFramebuffer(framebuffer);
4364
4365 if (framebufferObject)
4366 {
4367 return GL_TRUE;
4368 }
4369 }
4370 }
4371 catch(std::bad_alloc&)
4372 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004373 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004374 }
4375
4376 return GL_FALSE;
4377}
4378
4379GLboolean __stdcall glIsProgram(GLuint program)
4380{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004381 EVENT("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004382
4383 try
4384 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004385 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004386
4387 if (context && program)
4388 {
4389 gl::Program *programObject = context->getProgram(program);
4390
4391 if (programObject)
4392 {
4393 return GL_TRUE;
4394 }
4395 }
4396 }
4397 catch(std::bad_alloc&)
4398 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004399 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004400 }
4401
4402 return GL_FALSE;
4403}
4404
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00004405GLboolean __stdcall glIsQueryEXT(GLuint id)
4406{
4407 EVENT("(GLuint id = %d)", id);
4408
4409 try
4410 {
4411 if (id == 0)
4412 {
4413 return GL_FALSE;
4414 }
4415
4416 gl::Context *context = gl::getNonLostContext();
4417
4418 if (context)
4419 {
4420 gl::Query *queryObject = context->getQuery(id, false, GL_NONE);
4421
4422 if (queryObject)
4423 {
4424 return GL_TRUE;
4425 }
4426 }
4427 }
4428 catch(std::bad_alloc&)
4429 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004430 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00004431 }
4432
4433 return GL_FALSE;
4434}
4435
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004436GLboolean __stdcall glIsRenderbuffer(GLuint renderbuffer)
4437{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004438 EVENT("(GLuint renderbuffer = %d)", renderbuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004439
4440 try
4441 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004442 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004443
4444 if (context && renderbuffer)
4445 {
4446 gl::Renderbuffer *renderbufferObject = context->getRenderbuffer(renderbuffer);
4447
4448 if (renderbufferObject)
4449 {
4450 return GL_TRUE;
4451 }
4452 }
4453 }
4454 catch(std::bad_alloc&)
4455 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004456 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004457 }
4458
4459 return GL_FALSE;
4460}
4461
4462GLboolean __stdcall glIsShader(GLuint shader)
4463{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004464 EVENT("(GLuint shader = %d)", shader);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004465
4466 try
4467 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004468 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004469
4470 if (context && shader)
4471 {
4472 gl::Shader *shaderObject = context->getShader(shader);
4473
4474 if (shaderObject)
4475 {
4476 return GL_TRUE;
4477 }
4478 }
4479 }
4480 catch(std::bad_alloc&)
4481 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004482 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004483 }
4484
4485 return GL_FALSE;
4486}
4487
4488GLboolean __stdcall glIsTexture(GLuint texture)
4489{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004490 EVENT("(GLuint texture = %d)", texture);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004491
4492 try
4493 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004494 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004495
4496 if (context && texture)
4497 {
4498 gl::Texture *textureObject = context->getTexture(texture);
4499
4500 if (textureObject)
4501 {
4502 return GL_TRUE;
4503 }
4504 }
4505 }
4506 catch(std::bad_alloc&)
4507 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004508 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004509 }
4510
4511 return GL_FALSE;
4512}
4513
4514void __stdcall glLineWidth(GLfloat width)
4515{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004516 EVENT("(GLfloat width = %f)", width);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004517
4518 try
4519 {
4520 if (width <= 0.0f)
4521 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004522 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004523 }
4524
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004525 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com32e58cd2010-03-24 09:44:10 +00004526
4527 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004528 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004529 context->setLineWidth(width);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004530 }
4531 }
4532 catch(std::bad_alloc&)
4533 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004534 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004535 }
4536}
4537
4538void __stdcall glLinkProgram(GLuint program)
4539{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004540 EVENT("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004541
4542 try
4543 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004544 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004545
4546 if (context)
4547 {
4548 gl::Program *programObject = context->getProgram(program);
4549
4550 if (!programObject)
4551 {
daniel@transgaming.com277b7142010-04-13 03:26:44 +00004552 if (context->getShader(program))
4553 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004554 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com277b7142010-04-13 03:26:44 +00004555 }
4556 else
4557 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004558 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com277b7142010-04-13 03:26:44 +00004559 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004560 }
4561
daniel@transgaming.com95d29422012-07-24 18:36:10 +00004562 context->linkProgram(program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004563 }
4564 }
4565 catch(std::bad_alloc&)
4566 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004567 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004568 }
4569}
4570
4571void __stdcall glPixelStorei(GLenum pname, GLint param)
4572{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004573 EVENT("(GLenum pname = 0x%X, GLint param = %d)", pname, param);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004574
4575 try
4576 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004577 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004578
4579 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004580 {
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004581 switch (pname)
4582 {
4583 case GL_UNPACK_ALIGNMENT:
4584 if (param != 1 && param != 2 && param != 4 && param != 8)
4585 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004586 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004587 }
4588
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004589 context->setUnpackAlignment(param);
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004590 break;
4591
4592 case GL_PACK_ALIGNMENT:
4593 if (param != 1 && param != 2 && param != 4 && param != 8)
4594 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004595 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004596 }
4597
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004598 context->setPackAlignment(param);
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004599 break;
4600
bsalomon@google.com56d46ab2011-11-23 14:53:10 +00004601 case GL_PACK_REVERSE_ROW_ORDER_ANGLE:
4602 context->setPackReverseRowOrder(param != 0);
4603 break;
4604
shannonwoods@chromium.orgabf14cc2013-05-30 00:20:58 +00004605 case GL_UNPACK_IMAGE_HEIGHT:
4606 case GL_UNPACK_SKIP_IMAGES:
4607 case GL_UNPACK_ROW_LENGTH:
4608 case GL_UNPACK_SKIP_ROWS:
4609 case GL_UNPACK_SKIP_PIXELS:
4610 case GL_PACK_ROW_LENGTH:
4611 case GL_PACK_SKIP_ROWS:
4612 case GL_PACK_SKIP_PIXELS:
4613 if (context->getClientVersion() < 3)
4614 {
4615 return gl::error(GL_INVALID_ENUM);
4616 }
4617 UNIMPLEMENTED();
4618 break;
4619
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004620 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004621 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004622 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004623 }
4624 }
4625 catch(std::bad_alloc&)
4626 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004627 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004628 }
4629}
4630
4631void __stdcall glPolygonOffset(GLfloat factor, GLfloat units)
4632{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004633 EVENT("(GLfloat factor = %f, GLfloat units = %f)", factor, units);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004634
4635 try
4636 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004637 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comaede6302010-04-29 03:35:48 +00004638
4639 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004640 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004641 context->setPolygonOffsetParams(factor, units);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004642 }
4643 }
4644 catch(std::bad_alloc&)
4645 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004646 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004647 }
4648}
4649
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00004650void __stdcall glReadnPixelsEXT(GLint x, GLint y, GLsizei width, GLsizei height,
4651 GLenum format, GLenum type, GLsizei bufSize,
4652 GLvoid *data)
4653{
4654 EVENT("(GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d, "
4655 "GLenum format = 0x%X, GLenum type = 0x%X, GLsizei bufSize = 0x%d, GLvoid *data = 0x%0.8p)",
4656 x, y, width, height, format, type, bufSize, data);
4657
4658 try
4659 {
4660 if (width < 0 || height < 0 || bufSize < 0)
4661 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004662 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00004663 }
4664
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00004665 gl::Context *context = gl::getNonLostContext();
4666
4667 if (context)
4668 {
Geoff Lang005df412013-10-16 14:12:50 -04004669 GLenum currentInternalFormat, currentFormat, currentType;
shannonwoods@chromium.org44a4f982013-05-30 00:13:49 +00004670
daniel@transgaming.com42944b02012-09-27 17:45:57 +00004671 // Failure in getCurrentReadFormatType indicates that no color attachment is currently bound,
4672 // and attempting to read back if that's the case is an error. The error will be registered
4673 // by getCurrentReadFormat.
shannonwoods@chromium.org44a4f982013-05-30 00:13:49 +00004674 if (!context->getCurrentReadFormatType(&currentInternalFormat, &currentFormat, &currentType))
daniel@transgaming.com42944b02012-09-27 17:45:57 +00004675 return;
4676
Geoff Lang34dbb6f2013-08-05 15:05:47 -04004677 bool validReadFormat = (context->getClientVersion() < 3) ? gl::ValidES2ReadFormatType(format, type) :
4678 gl::ValidES3ReadFormatType(currentInternalFormat, format, type);
shannonwoods@chromium.org44a4f982013-05-30 00:13:49 +00004679
4680 if (!(currentFormat == format && currentType == type) && !validReadFormat)
daniel@transgaming.com42944b02012-09-27 17:45:57 +00004681 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004682 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com42944b02012-09-27 17:45:57 +00004683 }
4684
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00004685 context->readPixels(x, y, width, height, format, type, &bufSize, data);
4686 }
4687 }
4688 catch(std::bad_alloc&)
4689 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004690 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00004691 }
4692}
4693
4694void __stdcall glReadPixels(GLint x, GLint y, GLsizei width, GLsizei height,
4695 GLenum format, GLenum type, GLvoid* pixels)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004696{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004697 EVENT("(GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00004698 "GLenum format = 0x%X, GLenum type = 0x%X, GLvoid* pixels = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00004699 x, y, width, height, format, type, pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004700
4701 try
4702 {
4703 if (width < 0 || height < 0)
4704 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004705 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004706 }
4707
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004708 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004709
4710 if (context)
4711 {
Geoff Lang005df412013-10-16 14:12:50 -04004712 GLenum currentInternalFormat, currentFormat, currentType;
shannonwoods@chromium.org44a4f982013-05-30 00:13:49 +00004713
daniel@transgaming.com42944b02012-09-27 17:45:57 +00004714 // Failure in getCurrentReadFormatType indicates that no color attachment is currently bound,
4715 // and attempting to read back if that's the case is an error. The error will be registered
4716 // by getCurrentReadFormat.
shannonwoods@chromium.org44a4f982013-05-30 00:13:49 +00004717 if (!context->getCurrentReadFormatType(&currentInternalFormat, &currentFormat, &currentType))
daniel@transgaming.com42944b02012-09-27 17:45:57 +00004718 return;
4719
Geoff Lang34dbb6f2013-08-05 15:05:47 -04004720 bool validReadFormat = (context->getClientVersion() < 3) ? gl::ValidES2ReadFormatType(format, type) :
4721 gl::ValidES3ReadFormatType(currentInternalFormat, format, type);
shannonwoods@chromium.org44a4f982013-05-30 00:13:49 +00004722
4723 if (!(currentFormat == format && currentType == type) && !validReadFormat)
daniel@transgaming.com42944b02012-09-27 17:45:57 +00004724 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004725 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com42944b02012-09-27 17:45:57 +00004726 }
4727
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00004728 context->readPixels(x, y, width, height, format, type, NULL, pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004729 }
4730 }
4731 catch(std::bad_alloc&)
4732 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004733 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004734 }
4735}
4736
4737void __stdcall glReleaseShaderCompiler(void)
4738{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004739 EVENT("()");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004740
4741 try
4742 {
4743 gl::Shader::releaseCompiler();
4744 }
4745 catch(std::bad_alloc&)
4746 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004747 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004748 }
4749}
4750
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00004751void __stdcall glRenderbufferStorageMultisampleANGLE(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004752{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004753 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 +00004754 target, samples, internalformat, width, height);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004755
4756 try
4757 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004758 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004759
4760 if (context)
4761 {
Geoff Lang34dbb6f2013-08-05 15:05:47 -04004762 if (!ValidateRenderbufferStorageParameters(context, target, samples, internalformat,
Geoff Lang2e1dcd52013-05-29 10:34:08 -04004763 width, height, true))
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +00004764 {
Geoff Lang2e1dcd52013-05-29 10:34:08 -04004765 return;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004766 }
shannon.woods%transgaming.com@gtempaccount.com8dce6512013-04-13 03:42:19 +00004767
4768 context->setRenderbufferStorage(width, height, internalformat, samples);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004769 }
4770 }
4771 catch(std::bad_alloc&)
4772 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004773 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004774 }
4775}
4776
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00004777void __stdcall glRenderbufferStorage(GLenum target, GLenum internalformat, GLsizei width, GLsizei height)
4778{
4779 glRenderbufferStorageMultisampleANGLE(target, 0, internalformat, width, height);
4780}
4781
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004782void __stdcall glSampleCoverage(GLclampf value, GLboolean invert)
4783{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00004784 EVENT("(GLclampf value = %f, GLboolean invert = %u)", value, invert);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004785
4786 try
4787 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004788 gl::Context* context = gl::getNonLostContext();
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00004789
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004790 if (context)
4791 {
daniel@transgaming.coma36f98e2010-05-18 18:51:09 +00004792 context->setSampleCoverageParams(gl::clamp01(value), invert == GL_TRUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004793 }
4794 }
4795 catch(std::bad_alloc&)
4796 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004797 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004798 }
4799}
4800
daniel@transgaming.comfe208882010-09-01 15:47:57 +00004801void __stdcall glSetFenceNV(GLuint fence, GLenum condition)
4802{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004803 EVENT("(GLuint fence = %d, GLenum condition = 0x%X)", fence, condition);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004804
4805 try
4806 {
4807 if (condition != GL_ALL_COMPLETED_NV)
4808 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004809 return gl::error(GL_INVALID_ENUM);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004810 }
4811
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004812 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004813
4814 if (context)
4815 {
Jamie Madill33dc8432013-07-26 11:55:05 -04004816 gl::FenceNV *fenceObject = context->getFenceNV(fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004817
4818 if (fenceObject == NULL)
4819 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004820 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004821 }
4822
4823 fenceObject->setFence(condition);
4824 }
4825 }
4826 catch(std::bad_alloc&)
4827 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004828 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004829 }
daniel@transgaming.comfe208882010-09-01 15:47:57 +00004830}
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004831
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004832void __stdcall glScissor(GLint x, GLint y, GLsizei width, GLsizei height)
4833{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004834 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 +00004835
4836 try
4837 {
4838 if (width < 0 || height < 0)
4839 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004840 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004841 }
4842
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004843 gl::Context* context = gl::getNonLostContext();
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00004844
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004845 if (context)
4846 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004847 context->setScissorParams(x, y, width, height);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004848 }
4849 }
4850 catch(std::bad_alloc&)
4851 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004852 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004853 }
4854}
4855
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00004856void __stdcall glShaderBinary(GLsizei n, const GLuint* shaders, GLenum binaryformat, const GLvoid* binary, GLsizei length)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004857{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004858 EVENT("(GLsizei n = %d, const GLuint* shaders = 0x%0.8p, GLenum binaryformat = 0x%X, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00004859 "const GLvoid* binary = 0x%0.8p, GLsizei length = %d)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00004860 n, shaders, binaryformat, binary, length);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004861
4862 try
4863 {
daniel@transgaming.comd1f667f2010-04-29 03:38:52 +00004864 // No binary shader formats are supported.
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004865 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004866 }
4867 catch(std::bad_alloc&)
4868 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004869 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004870 }
4871}
4872
shannon.woods%transgaming.com@gtempaccount.com5f339332013-04-13 03:29:02 +00004873void __stdcall glShaderSource(GLuint shader, GLsizei count, const GLchar* const* string, const GLint* length)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004874{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004875 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 +00004876 shader, count, string, length);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004877
4878 try
4879 {
daniel@transgaming.com8e6a6be2010-04-13 03:26:41 +00004880 if (count < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004881 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004882 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004883 }
4884
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004885 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004886
4887 if (context)
4888 {
4889 gl::Shader *shaderObject = context->getShader(shader);
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00004890
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004891 if (!shaderObject)
4892 {
daniel@transgaming.com8e6a6be2010-04-13 03:26:41 +00004893 if (context->getProgram(shader))
4894 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004895 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com8e6a6be2010-04-13 03:26:41 +00004896 }
4897 else
4898 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004899 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com8e6a6be2010-04-13 03:26:41 +00004900 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004901 }
4902
4903 shaderObject->setSource(count, string, length);
4904 }
4905 }
4906 catch(std::bad_alloc&)
4907 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004908 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004909 }
4910}
4911
4912void __stdcall glStencilFunc(GLenum func, GLint ref, GLuint mask)
4913{
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00004914 glStencilFuncSeparate(GL_FRONT_AND_BACK, func, ref, mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004915}
4916
4917void __stdcall glStencilFuncSeparate(GLenum face, GLenum func, GLint ref, GLuint mask)
4918{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004919 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 +00004920
4921 try
4922 {
4923 switch (face)
4924 {
4925 case GL_FRONT:
4926 case GL_BACK:
4927 case GL_FRONT_AND_BACK:
4928 break;
4929 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004930 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004931 }
4932
4933 switch (func)
4934 {
4935 case GL_NEVER:
4936 case GL_ALWAYS:
4937 case GL_LESS:
4938 case GL_LEQUAL:
4939 case GL_EQUAL:
4940 case GL_GEQUAL:
4941 case GL_GREATER:
4942 case GL_NOTEQUAL:
4943 break;
4944 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004945 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004946 }
4947
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004948 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004949
4950 if (context)
4951 {
4952 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
4953 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004954 context->setStencilParams(func, ref, mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004955 }
4956
4957 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
4958 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004959 context->setStencilBackParams(func, ref, mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004960 }
4961 }
4962 }
4963 catch(std::bad_alloc&)
4964 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004965 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004966 }
4967}
4968
4969void __stdcall glStencilMask(GLuint mask)
4970{
4971 glStencilMaskSeparate(GL_FRONT_AND_BACK, mask);
4972}
4973
4974void __stdcall glStencilMaskSeparate(GLenum face, GLuint mask)
4975{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004976 EVENT("(GLenum face = 0x%X, GLuint mask = %d)", face, mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004977
4978 try
4979 {
4980 switch (face)
4981 {
4982 case GL_FRONT:
4983 case GL_BACK:
4984 case GL_FRONT_AND_BACK:
4985 break;
4986 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004987 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004988 }
4989
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004990 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004991
4992 if (context)
4993 {
4994 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
4995 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004996 context->setStencilWritemask(mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004997 }
4998
4999 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
5000 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00005001 context->setStencilBackWritemask(mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005002 }
5003 }
5004 }
5005 catch(std::bad_alloc&)
5006 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005007 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005008 }
5009}
5010
5011void __stdcall glStencilOp(GLenum fail, GLenum zfail, GLenum zpass)
5012{
5013 glStencilOpSeparate(GL_FRONT_AND_BACK, fail, zfail, zpass);
5014}
5015
5016void __stdcall glStencilOpSeparate(GLenum face, GLenum fail, GLenum zfail, GLenum zpass)
5017{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005018 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 +00005019 face, fail, zfail, zpass);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005020
5021 try
5022 {
5023 switch (face)
5024 {
5025 case GL_FRONT:
5026 case GL_BACK:
5027 case GL_FRONT_AND_BACK:
5028 break;
5029 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005030 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005031 }
5032
5033 switch (fail)
5034 {
5035 case GL_ZERO:
5036 case GL_KEEP:
5037 case GL_REPLACE:
5038 case GL_INCR:
5039 case GL_DECR:
5040 case GL_INVERT:
5041 case GL_INCR_WRAP:
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00005042 case GL_DECR_WRAP:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005043 break;
5044 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005045 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005046 }
5047
5048 switch (zfail)
5049 {
5050 case GL_ZERO:
5051 case GL_KEEP:
5052 case GL_REPLACE:
5053 case GL_INCR:
5054 case GL_DECR:
5055 case GL_INVERT:
5056 case GL_INCR_WRAP:
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00005057 case GL_DECR_WRAP:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005058 break;
5059 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005060 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005061 }
5062
5063 switch (zpass)
5064 {
5065 case GL_ZERO:
5066 case GL_KEEP:
5067 case GL_REPLACE:
5068 case GL_INCR:
5069 case GL_DECR:
5070 case GL_INVERT:
5071 case GL_INCR_WRAP:
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00005072 case GL_DECR_WRAP:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005073 break;
5074 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005075 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005076 }
5077
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005078 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005079
5080 if (context)
5081 {
5082 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
5083 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00005084 context->setStencilOperations(fail, zfail, zpass);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005085 }
5086
5087 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
5088 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00005089 context->setStencilBackOperations(fail, zfail, zpass);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005090 }
5091 }
5092 }
5093 catch(std::bad_alloc&)
5094 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005095 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005096 }
5097}
5098
daniel@transgaming.comfe208882010-09-01 15:47:57 +00005099GLboolean __stdcall glTestFenceNV(GLuint fence)
5100{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005101 EVENT("(GLuint fence = %d)", fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005102
5103 try
5104 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005105 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005106
5107 if (context)
5108 {
Jamie Madill33dc8432013-07-26 11:55:05 -04005109 gl::FenceNV *fenceObject = context->getFenceNV(fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005110
5111 if (fenceObject == NULL)
5112 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005113 return gl::error(GL_INVALID_OPERATION, GL_TRUE);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005114 }
5115
Jamie Madillfb9a7402013-07-26 11:55:01 -04005116 if (fenceObject->isFence() != GL_TRUE)
5117 {
5118 return gl::error(GL_INVALID_OPERATION, GL_TRUE);
5119 }
5120
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005121 return fenceObject->testFence();
5122 }
5123 }
5124 catch(std::bad_alloc&)
5125 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005126 gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005127 }
5128
5129 return GL_TRUE;
daniel@transgaming.comfe208882010-09-01 15:47:57 +00005130}
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005131
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00005132void __stdcall glTexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height,
5133 GLint border, GLenum format, GLenum type, const GLvoid* pixels)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005134{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005135 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 +00005136 "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 +00005137 target, level, internalformat, width, height, border, format, type, pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005138
5139 try
5140 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005141 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005142
5143 if (context)
5144 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005145 if (context->getClientVersion() < 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -04005146 !ValidateES2TexImageParameters(context, target, level, internalformat, false, false,
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005147 0, 0, width, height, border, format, type, pixels))
daniel@transgaming.com32b11442011-11-19 02:42:48 +00005148 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005149 return;
5150 }
5151
5152 if (context->getClientVersion() >= 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -04005153 !ValidateES3TexImageParameters(context, target, level, internalformat, false, false,
Jamie Madillefb2a6f2013-09-24 10:22:42 -04005154 0, 0, 0, width, height, 1, border, format, type, pixels))
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005155 {
5156 return;
daniel@transgaming.com32b11442011-11-19 02:42:48 +00005157 }
5158
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00005159 switch (target)
5160 {
5161 case GL_TEXTURE_2D:
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00005162 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005163 gl::Texture2D *texture = context->getTexture2D();
Jamie Madill88f18f42013-09-18 14:36:19 -04005164 texture->setImage(level, width, height, internalformat, format, type, context->getUnpackState(), pixels);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00005165 }
5166 break;
5167 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00005168 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005169 gl::TextureCubeMap *texture = context->getTextureCubeMap();
Jamie Madill88f18f42013-09-18 14:36:19 -04005170 texture->setImagePosX(level, width, height, internalformat, format, type, context->getUnpackState(), pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005171 }
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005172 break;
5173 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
5174 {
5175 gl::TextureCubeMap *texture = context->getTextureCubeMap();
Jamie Madill88f18f42013-09-18 14:36:19 -04005176 texture->setImageNegX(level, width, height, internalformat, format, type, context->getUnpackState(), pixels);
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005177 }
5178 break;
5179 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
5180 {
5181 gl::TextureCubeMap *texture = context->getTextureCubeMap();
Jamie Madill88f18f42013-09-18 14:36:19 -04005182 texture->setImagePosY(level, width, height, internalformat, format, type, context->getUnpackState(), pixels);
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005183 }
5184 break;
5185 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
5186 {
5187 gl::TextureCubeMap *texture = context->getTextureCubeMap();
Jamie Madill88f18f42013-09-18 14:36:19 -04005188 texture->setImageNegY(level, width, height, internalformat, format, type, context->getUnpackState(), pixels);
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005189 }
5190 break;
5191 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
5192 {
5193 gl::TextureCubeMap *texture = context->getTextureCubeMap();
Jamie Madill88f18f42013-09-18 14:36:19 -04005194 texture->setImagePosZ(level, width, height, internalformat, format, type, context->getUnpackState(), pixels);
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005195 }
5196 break;
5197 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
5198 {
5199 gl::TextureCubeMap *texture = context->getTextureCubeMap();
Jamie Madill88f18f42013-09-18 14:36:19 -04005200 texture->setImageNegZ(level, width, height, internalformat, format, type, context->getUnpackState(), pixels);
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005201 }
5202 break;
5203 default: UNREACHABLE();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005204 }
5205 }
5206 }
5207 catch(std::bad_alloc&)
5208 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005209 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005210 }
5211}
5212
5213void __stdcall glTexParameterf(GLenum target, GLenum pname, GLfloat param)
5214{
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005215 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLint param = %f)", target, pname, param);
5216
5217 try
5218 {
5219 gl::Context *context = gl::getNonLostContext();
5220
5221 if (context)
5222 {
Geoff Lang34dbb6f2013-08-05 15:05:47 -04005223 if (!ValidateTexParamParameters(context, pname, static_cast<GLint>(param)))
Jamie Madill478fdb22013-07-19 16:36:59 -04005224 {
5225 return;
5226 }
5227
Jamie Madill35d15012013-10-07 10:46:37 -04005228 gl::Texture *texture = GetTargetTexture(context, target);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005229
Jamie Madillfb8a8302013-07-03 14:24:12 -04005230 if (!texture)
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005231 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005232 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005233 }
5234
5235 switch (pname)
5236 {
Jamie Madill478fdb22013-07-19 16:36:59 -04005237 case GL_TEXTURE_WRAP_S: texture->setWrapS(gl::uiround<GLenum>(param)); break;
5238 case GL_TEXTURE_WRAP_T: texture->setWrapT(gl::uiround<GLenum>(param)); break;
5239 case GL_TEXTURE_WRAP_R: texture->setWrapR(gl::uiround<GLenum>(param)); break;
5240 case GL_TEXTURE_MIN_FILTER: texture->setMinFilter(gl::uiround<GLenum>(param)); break;
5241 case GL_TEXTURE_MAG_FILTER: texture->setMagFilter(gl::uiround<GLenum>(param)); break;
5242 case GL_TEXTURE_USAGE_ANGLE: texture->setUsage(gl::uiround<GLenum>(param)); break;
5243 case GL_TEXTURE_MAX_ANISOTROPY_EXT: texture->setMaxAnisotropy(static_cast<GLfloat>(param), context->getTextureMaxAnisotropy()); break;
5244 case GL_TEXTURE_COMPARE_MODE: texture->setCompareMode(gl::uiround<GLenum>(param)); break;
5245 case GL_TEXTURE_COMPARE_FUNC: texture->setCompareFunc(gl::uiround<GLenum>(param)); break;
Geoff Langbc90a482013-09-17 16:51:27 -04005246 case GL_TEXTURE_SWIZZLE_R: texture->setSwizzleRed(gl::uiround<GLenum>(param)); break;
5247 case GL_TEXTURE_SWIZZLE_G: texture->setSwizzleGreen(gl::uiround<GLenum>(param)); break;
5248 case GL_TEXTURE_SWIZZLE_B: texture->setSwizzleBlue(gl::uiround<GLenum>(param)); break;
5249 case GL_TEXTURE_SWIZZLE_A: texture->setSwizzleAlpha(gl::uiround<GLenum>(param)); break;
shannonwoods@chromium.orgabf14cc2013-05-30 00:20:58 +00005250
Jamie Madill478fdb22013-07-19 16:36:59 -04005251 case GL_TEXTURE_BASE_LEVEL:
5252 case GL_TEXTURE_MAX_LEVEL:
shannonwoods@chromium.orgabf14cc2013-05-30 00:20:58 +00005253 case GL_TEXTURE_MIN_LOD:
5254 case GL_TEXTURE_MAX_LOD:
shannonwoods@chromium.orgabf14cc2013-05-30 00:20:58 +00005255 UNIMPLEMENTED();
5256 break;
5257
Jamie Madill478fdb22013-07-19 16:36:59 -04005258 default: UNREACHABLE(); break;
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005259 }
5260 }
5261 }
5262 catch(std::bad_alloc&)
5263 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005264 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005265 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005266}
5267
5268void __stdcall glTexParameterfv(GLenum target, GLenum pname, const GLfloat* params)
5269{
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005270 glTexParameterf(target, pname, (GLfloat)*params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005271}
5272
5273void __stdcall glTexParameteri(GLenum target, GLenum pname, GLint param)
5274{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005275 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLint param = %d)", target, pname, param);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005276
5277 try
5278 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005279 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005280
5281 if (context)
5282 {
Geoff Lang34dbb6f2013-08-05 15:05:47 -04005283 if (!ValidateTexParamParameters(context, pname, param))
Jamie Madill478fdb22013-07-19 16:36:59 -04005284 {
5285 return;
5286 }
5287
Jamie Madill35d15012013-10-07 10:46:37 -04005288 gl::Texture *texture = GetTargetTexture(context, target);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005289
Jamie Madillfb8a8302013-07-03 14:24:12 -04005290 if (!texture)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005291 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005292 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005293 }
5294
5295 switch (pname)
5296 {
Jamie Madill478fdb22013-07-19 16:36:59 -04005297 case GL_TEXTURE_WRAP_S: texture->setWrapS((GLenum)param); break;
5298 case GL_TEXTURE_WRAP_T: texture->setWrapT((GLenum)param); break;
5299 case GL_TEXTURE_WRAP_R: texture->setWrapR((GLenum)param); break;
5300 case GL_TEXTURE_MIN_FILTER: texture->setMinFilter((GLenum)param); break;
5301 case GL_TEXTURE_MAG_FILTER: texture->setMagFilter((GLenum)param); break;
5302 case GL_TEXTURE_USAGE_ANGLE: texture->setUsage((GLenum)param); break;
5303 case GL_TEXTURE_MAX_ANISOTROPY_EXT: texture->setMaxAnisotropy((float)param, context->getTextureMaxAnisotropy()); break;
5304 case GL_TEXTURE_COMPARE_MODE: texture->setCompareMode((GLenum)param); break;
5305 case GL_TEXTURE_COMPARE_FUNC: texture->setCompareFunc((GLenum)param); break;
Geoff Langbc90a482013-09-17 16:51:27 -04005306 case GL_TEXTURE_SWIZZLE_R: texture->setSwizzleRed((GLenum)param); break;
5307 case GL_TEXTURE_SWIZZLE_G: texture->setSwizzleGreen((GLenum)param); break;
5308 case GL_TEXTURE_SWIZZLE_B: texture->setSwizzleBlue((GLenum)param); break;
5309 case GL_TEXTURE_SWIZZLE_A: texture->setSwizzleAlpha((GLenum)param); break;
shannonwoods@chromium.orgabf14cc2013-05-30 00:20:58 +00005310
shannonwoods@chromium.orgabf14cc2013-05-30 00:20:58 +00005311 case GL_TEXTURE_BASE_LEVEL:
5312 case GL_TEXTURE_MAX_LEVEL:
Jamie Madill478fdb22013-07-19 16:36:59 -04005313 case GL_TEXTURE_MIN_LOD:
5314 case GL_TEXTURE_MAX_LOD:
shannonwoods@chromium.orgabf14cc2013-05-30 00:20:58 +00005315 UNIMPLEMENTED();
5316 break;
5317
Jamie Madill478fdb22013-07-19 16:36:59 -04005318 default: UNREACHABLE(); break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005319 }
5320 }
5321 }
5322 catch(std::bad_alloc&)
5323 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005324 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005325 }
5326}
5327
5328void __stdcall glTexParameteriv(GLenum target, GLenum pname, const GLint* params)
5329{
5330 glTexParameteri(target, pname, *params);
5331}
5332
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005333void __stdcall glTexStorage2DEXT(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height)
5334{
5335 EVENT("(GLenum target = 0x%X, GLsizei levels = %d, GLenum internalformat = 0x%X, GLsizei width = %d, GLsizei height = %d)",
5336 target, levels, internalformat, width, height);
5337
5338 try
5339 {
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005340 gl::Context *context = gl::getNonLostContext();
5341
5342 if (context)
5343 {
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00005344 if (context->getClientVersion() < 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -04005345 !ValidateES2TexStorageParameters(context, target, levels, internalformat, width, height))
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +00005346 {
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00005347 return;
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +00005348 }
5349
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00005350 if (context->getClientVersion() >= 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -04005351 !ValidateES3TexStorageParameters(context, target, levels, internalformat, width, height, 1))
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +00005352 {
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00005353 return;
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +00005354 }
5355
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00005356 switch (target)
5357 {
5358 case GL_TEXTURE_2D:
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00005359 {
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00005360 gl::Texture2D *texture2d = context->getTexture2D();
5361 texture2d->storage(levels, internalformat, width, height);
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00005362 }
5363 break;
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00005364
Geoff Lang01c21d22013-09-24 11:52:16 -04005365 case GL_TEXTURE_CUBE_MAP:
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00005366 {
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00005367 gl::TextureCubeMap *textureCube = context->getTextureCubeMap();
5368 textureCube->storage(levels, internalformat, width);
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00005369 }
5370 break;
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00005371
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00005372 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005373 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00005374 }
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005375 }
5376 }
5377 catch(std::bad_alloc&)
5378 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005379 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005380 }
5381}
5382
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00005383void __stdcall glTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height,
5384 GLenum format, GLenum type, const GLvoid* pixels)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005385{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005386 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00005387 "GLsizei width = %d, GLsizei height = %d, GLenum format = 0x%X, GLenum type = 0x%X, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00005388 "const GLvoid* pixels = 0x%0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005389 target, level, xoffset, yoffset, width, height, format, type, pixels);
5390
5391 try
5392 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005393 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005394
5395 if (context)
5396 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005397 if (context->getClientVersion() < 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -04005398 !ValidateES2TexImageParameters(context, target, level, GL_NONE, false, true,
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005399 0, 0, width, height, 0, format, type, pixels))
daniel@transgaming.com1d2d3c42012-05-31 01:14:15 +00005400 {
5401 return;
5402 }
5403
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005404 if (context->getClientVersion() >= 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -04005405 !ValidateES3TexImageParameters(context, target, level, GL_NONE, false, true,
Jamie Madillefb2a6f2013-09-24 10:22:42 -04005406 0, 0, 0, width, height, 1, 0, format, type, pixels))
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005407 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005408 return;
5409 }
5410
5411 switch (target)
5412 {
5413 case GL_TEXTURE_2D:
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005414 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005415 gl::Texture2D *texture = context->getTexture2D();
Jamie Madill88f18f42013-09-18 14:36:19 -04005416 texture->subImage(level, xoffset, yoffset, width, height, format, type, context->getUnpackState(), pixels);
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005417 }
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005418 break;
5419
5420 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
5421 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
5422 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
5423 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
5424 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
5425 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005426 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005427 gl::TextureCubeMap *texture = context->getTextureCubeMap();
Jamie Madill88f18f42013-09-18 14:36:19 -04005428 texture->subImage(target, level, xoffset, yoffset, width, height, format, type, context->getUnpackState(), pixels);
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005429 }
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005430 break;
5431
5432 default:
Geoff Lang01c21d22013-09-24 11:52:16 -04005433 UNREACHABLE();
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005434 }
5435 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005436 }
5437 catch(std::bad_alloc&)
5438 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005439 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005440 }
5441}
5442
5443void __stdcall glUniform1f(GLint location, GLfloat x)
5444{
5445 glUniform1fv(location, 1, &x);
5446}
5447
5448void __stdcall glUniform1fv(GLint location, GLsizei count, const GLfloat* v)
5449{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005450 EVENT("(GLint location = %d, GLsizei count = %d, const GLfloat* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005451
5452 try
5453 {
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005454 if (count < 0)
5455 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005456 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005457 }
5458
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005459 if (location == -1)
5460 {
5461 return;
5462 }
5463
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005464 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005465
5466 if (context)
5467 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00005468 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005469 if (!programBinary)
5470 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005471 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005472 }
5473
5474 if (!programBinary->setUniform1fv(location, count, v))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005475 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005476 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005477 }
5478 }
5479 }
5480 catch(std::bad_alloc&)
5481 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005482 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005483 }
5484}
5485
5486void __stdcall glUniform1i(GLint location, GLint x)
5487{
5488 glUniform1iv(location, 1, &x);
5489}
5490
5491void __stdcall glUniform1iv(GLint location, GLsizei count, const GLint* v)
5492{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005493 EVENT("(GLint location = %d, GLsizei count = %d, const GLint* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005494
5495 try
5496 {
5497 if (count < 0)
5498 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005499 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005500 }
5501
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005502 if (location == -1)
5503 {
5504 return;
5505 }
5506
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005507 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005508
5509 if (context)
5510 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00005511 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005512 if (!programBinary)
5513 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005514 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005515 }
5516
5517 if (!programBinary->setUniform1iv(location, count, v))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005518 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005519 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005520 }
5521 }
5522 }
5523 catch(std::bad_alloc&)
5524 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005525 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005526 }
5527}
5528
5529void __stdcall glUniform2f(GLint location, GLfloat x, GLfloat y)
5530{
5531 GLfloat xy[2] = {x, y};
5532
5533 glUniform2fv(location, 1, (GLfloat*)&xy);
5534}
5535
5536void __stdcall glUniform2fv(GLint location, GLsizei count, const GLfloat* v)
5537{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005538 EVENT("(GLint location = %d, GLsizei count = %d, const GLfloat* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005539
5540 try
5541 {
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005542 if (count < 0)
5543 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005544 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005545 }
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005546
5547 if (location == -1)
5548 {
5549 return;
5550 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005551
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005552 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005553
5554 if (context)
5555 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00005556 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005557 if (!programBinary)
5558 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005559 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005560 }
5561
5562 if (!programBinary->setUniform2fv(location, count, v))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005563 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005564 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005565 }
5566 }
5567 }
5568 catch(std::bad_alloc&)
5569 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005570 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005571 }
5572}
5573
5574void __stdcall glUniform2i(GLint location, GLint x, GLint y)
5575{
5576 GLint xy[4] = {x, y};
5577
5578 glUniform2iv(location, 1, (GLint*)&xy);
5579}
5580
5581void __stdcall glUniform2iv(GLint location, GLsizei count, const GLint* v)
5582{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005583 EVENT("(GLint location = %d, GLsizei count = %d, const GLint* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005584
5585 try
5586 {
5587 if (count < 0)
5588 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005589 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005590 }
5591
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005592 if (location == -1)
5593 {
5594 return;
5595 }
5596
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005597 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005598
5599 if (context)
5600 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00005601 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005602 if (!programBinary)
5603 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005604 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005605 }
5606
5607 if (!programBinary->setUniform2iv(location, count, v))
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005608 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005609 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005610 }
5611 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005612 }
5613 catch(std::bad_alloc&)
5614 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005615 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005616 }
5617}
5618
5619void __stdcall glUniform3f(GLint location, GLfloat x, GLfloat y, GLfloat z)
5620{
5621 GLfloat xyz[3] = {x, y, z};
5622
5623 glUniform3fv(location, 1, (GLfloat*)&xyz);
5624}
5625
5626void __stdcall glUniform3fv(GLint location, GLsizei count, const GLfloat* v)
5627{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005628 EVENT("(GLint location = %d, GLsizei count = %d, const GLfloat* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005629
5630 try
5631 {
5632 if (count < 0)
5633 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005634 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005635 }
5636
5637 if (location == -1)
5638 {
5639 return;
5640 }
5641
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005642 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005643
5644 if (context)
5645 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00005646 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005647 if (!programBinary)
5648 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005649 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005650 }
5651
5652 if (!programBinary->setUniform3fv(location, count, v))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005653 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005654 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005655 }
5656 }
5657 }
5658 catch(std::bad_alloc&)
5659 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005660 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005661 }
5662}
5663
5664void __stdcall glUniform3i(GLint location, GLint x, GLint y, GLint z)
5665{
5666 GLint xyz[3] = {x, y, z};
5667
5668 glUniform3iv(location, 1, (GLint*)&xyz);
5669}
5670
5671void __stdcall glUniform3iv(GLint location, GLsizei count, const GLint* v)
5672{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005673 EVENT("(GLint location = %d, GLsizei count = %d, const GLint* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005674
5675 try
5676 {
5677 if (count < 0)
5678 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005679 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005680 }
5681
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005682 if (location == -1)
5683 {
5684 return;
5685 }
5686
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005687 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005688
5689 if (context)
5690 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00005691 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005692 if (!programBinary)
5693 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005694 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005695 }
5696
5697 if (!programBinary->setUniform3iv(location, count, v))
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005698 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005699 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005700 }
5701 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005702 }
5703 catch(std::bad_alloc&)
5704 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005705 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005706 }
5707}
5708
5709void __stdcall glUniform4f(GLint location, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
5710{
5711 GLfloat xyzw[4] = {x, y, z, w};
5712
5713 glUniform4fv(location, 1, (GLfloat*)&xyzw);
5714}
5715
5716void __stdcall glUniform4fv(GLint location, GLsizei count, const GLfloat* v)
5717{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005718 EVENT("(GLint location = %d, GLsizei count = %d, const GLfloat* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005719
5720 try
5721 {
5722 if (count < 0)
5723 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005724 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005725 }
5726
5727 if (location == -1)
5728 {
5729 return;
5730 }
5731
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005732 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005733
5734 if (context)
5735 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00005736 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005737 if (!programBinary)
5738 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005739 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005740 }
5741
5742 if (!programBinary->setUniform4fv(location, count, v))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005743 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005744 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005745 }
5746 }
5747 }
5748 catch(std::bad_alloc&)
5749 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005750 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005751 }
5752}
5753
5754void __stdcall glUniform4i(GLint location, GLint x, GLint y, GLint z, GLint w)
5755{
5756 GLint xyzw[4] = {x, y, z, w};
5757
5758 glUniform4iv(location, 1, (GLint*)&xyzw);
5759}
5760
5761void __stdcall glUniform4iv(GLint location, GLsizei count, const GLint* v)
5762{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005763 EVENT("(GLint location = %d, GLsizei count = %d, const GLint* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005764
5765 try
5766 {
5767 if (count < 0)
5768 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005769 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005770 }
5771
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005772 if (location == -1)
5773 {
5774 return;
5775 }
5776
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005777 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005778
5779 if (context)
5780 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00005781 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005782 if (!programBinary)
5783 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005784 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005785 }
5786
5787 if (!programBinary->setUniform4iv(location, count, v))
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005788 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005789 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005790 }
5791 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005792 }
5793 catch(std::bad_alloc&)
5794 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005795 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005796 }
5797}
5798
5799void __stdcall glUniformMatrix2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
5800{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005801 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00005802 location, count, transpose, value);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005803
5804 try
5805 {
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00005806 if (count < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005807 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005808 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005809 }
5810
5811 if (location == -1)
5812 {
5813 return;
5814 }
5815
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005816 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005817
5818 if (context)
5819 {
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00005820 if (transpose != GL_FALSE && context->getClientVersion() < 3)
5821 {
5822 return gl::error(GL_INVALID_VALUE);
5823 }
5824
daniel@transgaming.com62a28462012-07-24 18:33:59 +00005825 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005826 if (!programBinary)
5827 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005828 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005829 }
5830
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00005831 if (!programBinary->setUniformMatrix2fv(location, count, transpose, value))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005832 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005833 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005834 }
5835 }
5836 }
5837 catch(std::bad_alloc&)
5838 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005839 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005840 }
5841}
5842
5843void __stdcall glUniformMatrix3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
5844{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005845 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00005846 location, count, transpose, value);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005847
5848 try
5849 {
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00005850 if (count < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005851 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005852 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005853 }
5854
5855 if (location == -1)
5856 {
5857 return;
5858 }
5859
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005860 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005861
5862 if (context)
5863 {
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00005864 if (transpose != GL_FALSE && context->getClientVersion() < 3)
5865 {
5866 return gl::error(GL_INVALID_VALUE);
5867 }
5868
daniel@transgaming.com62a28462012-07-24 18:33:59 +00005869 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005870 if (!programBinary)
5871 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005872 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005873 }
5874
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00005875 if (!programBinary->setUniformMatrix3fv(location, count, transpose, value))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005876 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005877 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005878 }
5879 }
5880 }
5881 catch(std::bad_alloc&)
5882 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005883 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005884 }
5885}
5886
5887void __stdcall glUniformMatrix4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
5888{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005889 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00005890 location, count, transpose, value);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005891
5892 try
5893 {
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00005894 if (count < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005895 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005896 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005897 }
5898
5899 if (location == -1)
5900 {
5901 return;
5902 }
5903
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005904 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005905
5906 if (context)
5907 {
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00005908 if (transpose != GL_FALSE && context->getClientVersion() < 3)
5909 {
5910 return gl::error(GL_INVALID_VALUE);
5911 }
5912
daniel@transgaming.com62a28462012-07-24 18:33:59 +00005913 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005914 if (!programBinary)
5915 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005916 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005917 }
5918
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00005919 if (!programBinary->setUniformMatrix4fv(location, count, transpose, value))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005920 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005921 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005922 }
5923 }
5924 }
5925 catch(std::bad_alloc&)
5926 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005927 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005928 }
5929}
5930
5931void __stdcall glUseProgram(GLuint program)
5932{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005933 EVENT("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005934
5935 try
5936 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005937 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005938
5939 if (context)
5940 {
5941 gl::Program *programObject = context->getProgram(program);
5942
daniel@transgaming.comc8478202010-04-13 19:53:35 +00005943 if (!programObject && program != 0)
5944 {
5945 if (context->getShader(program))
5946 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005947 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comc8478202010-04-13 19:53:35 +00005948 }
5949 else
5950 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005951 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comc8478202010-04-13 19:53:35 +00005952 }
5953 }
5954
daniel@transgaming.com716056c2012-07-24 18:38:59 +00005955 if (program != 0 && !programObject->isLinked())
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005956 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005957 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005958 }
5959
5960 context->useProgram(program);
5961 }
5962 }
5963 catch(std::bad_alloc&)
5964 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005965 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005966 }
5967}
5968
5969void __stdcall glValidateProgram(GLuint program)
5970{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005971 EVENT("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005972
5973 try
5974 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005975 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00005976
5977 if (context)
5978 {
5979 gl::Program *programObject = context->getProgram(program);
5980
5981 if (!programObject)
5982 {
5983 if (context->getShader(program))
5984 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005985 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00005986 }
5987 else
5988 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005989 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00005990 }
5991 }
5992
apatrick@chromium.org253b8d22012-06-22 19:27:21 +00005993 programObject->validate();
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00005994 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005995 }
5996 catch(std::bad_alloc&)
5997 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005998 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005999 }
6000}
6001
6002void __stdcall glVertexAttrib1f(GLuint index, GLfloat x)
6003{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006004 EVENT("(GLuint index = %d, GLfloat x = %f)", index, x);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006005
6006 try
6007 {
6008 if (index >= gl::MAX_VERTEX_ATTRIBS)
6009 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006010 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006011 }
6012
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006013 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006014
6015 if (context)
6016 {
6017 GLfloat vals[4] = { x, 0, 0, 1 };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00006018 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006019 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006020 }
6021 catch(std::bad_alloc&)
6022 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006023 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006024 }
6025}
6026
6027void __stdcall glVertexAttrib1fv(GLuint index, const GLfloat* values)
6028{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006029 EVENT("(GLuint index = %d, const GLfloat* values = 0x%0.8p)", index, values);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006030
6031 try
6032 {
6033 if (index >= gl::MAX_VERTEX_ATTRIBS)
6034 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006035 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006036 }
6037
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006038 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006039
6040 if (context)
6041 {
6042 GLfloat vals[4] = { values[0], 0, 0, 1 };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00006043 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006044 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006045 }
6046 catch(std::bad_alloc&)
6047 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006048 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006049 }
6050}
6051
6052void __stdcall glVertexAttrib2f(GLuint index, GLfloat x, GLfloat y)
6053{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006054 EVENT("(GLuint index = %d, GLfloat x = %f, GLfloat y = %f)", index, x, y);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006055
6056 try
6057 {
6058 if (index >= gl::MAX_VERTEX_ATTRIBS)
6059 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006060 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006061 }
6062
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006063 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006064
6065 if (context)
6066 {
6067 GLfloat vals[4] = { x, y, 0, 1 };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00006068 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006069 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006070 }
6071 catch(std::bad_alloc&)
6072 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006073 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006074 }
6075}
6076
6077void __stdcall glVertexAttrib2fv(GLuint index, const GLfloat* values)
6078{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006079 EVENT("(GLuint index = %d, const GLfloat* values = 0x%0.8p)", index, values);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006080
6081 try
6082 {
6083 if (index >= gl::MAX_VERTEX_ATTRIBS)
6084 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006085 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006086 }
6087
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006088 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006089
6090 if (context)
6091 {
6092 GLfloat vals[4] = { values[0], values[1], 0, 1 };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00006093 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006094 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006095 }
6096 catch(std::bad_alloc&)
6097 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006098 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006099 }
6100}
6101
6102void __stdcall glVertexAttrib3f(GLuint index, GLfloat x, GLfloat y, GLfloat z)
6103{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006104 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 +00006105
6106 try
6107 {
6108 if (index >= gl::MAX_VERTEX_ATTRIBS)
6109 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006110 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006111 }
6112
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006113 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006114
6115 if (context)
6116 {
6117 GLfloat vals[4] = { x, y, z, 1 };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00006118 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006119 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006120 }
6121 catch(std::bad_alloc&)
6122 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006123 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006124 }
6125}
6126
6127void __stdcall glVertexAttrib3fv(GLuint index, const GLfloat* values)
6128{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006129 EVENT("(GLuint index = %d, const GLfloat* values = 0x%0.8p)", index, values);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006130
6131 try
6132 {
6133 if (index >= gl::MAX_VERTEX_ATTRIBS)
6134 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006135 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006136 }
6137
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006138 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006139
6140 if (context)
6141 {
6142 GLfloat vals[4] = { values[0], values[1], values[2], 1 };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00006143 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006144 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006145 }
6146 catch(std::bad_alloc&)
6147 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006148 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006149 }
6150}
6151
6152void __stdcall glVertexAttrib4f(GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
6153{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006154 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 +00006155
6156 try
6157 {
6158 if (index >= gl::MAX_VERTEX_ATTRIBS)
6159 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006160 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006161 }
6162
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006163 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006164
6165 if (context)
6166 {
6167 GLfloat vals[4] = { x, y, z, w };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00006168 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006169 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006170 }
6171 catch(std::bad_alloc&)
6172 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006173 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006174 }
6175}
6176
6177void __stdcall glVertexAttrib4fv(GLuint index, const GLfloat* values)
6178{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006179 EVENT("(GLuint index = %d, const GLfloat* values = 0x%0.8p)", index, values);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006180
6181 try
6182 {
6183 if (index >= gl::MAX_VERTEX_ATTRIBS)
6184 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006185 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006186 }
6187
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006188 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006189
6190 if (context)
6191 {
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00006192 context->setVertexAttribf(index, values);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006193 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006194 }
6195 catch(std::bad_alloc&)
6196 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006197 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006198 }
6199}
6200
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00006201void __stdcall glVertexAttribDivisorANGLE(GLuint index, GLuint divisor)
6202{
6203 EVENT("(GLuint index = %d, GLuint divisor = %d)", index, divisor);
6204
6205 try
6206 {
6207 if (index >= gl::MAX_VERTEX_ATTRIBS)
6208 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006209 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00006210 }
6211
6212 gl::Context *context = gl::getNonLostContext();
6213
6214 if (context)
6215 {
6216 context->setVertexAttribDivisor(index, divisor);
6217 }
6218 }
6219 catch(std::bad_alloc&)
6220 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006221 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00006222 }
6223}
6224
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00006225void __stdcall glVertexAttribPointer(GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid* ptr)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006226{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006227 EVENT("(GLuint index = %d, GLint size = %d, GLenum type = 0x%X, "
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006228 "GLboolean normalized = %u, GLsizei stride = %d, const GLvoid* ptr = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00006229 index, size, type, normalized, stride, ptr);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006230
6231 try
6232 {
6233 if (index >= gl::MAX_VERTEX_ATTRIBS)
6234 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006235 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006236 }
6237
6238 if (size < 1 || size > 4)
6239 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006240 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006241 }
6242
shannon.woods%transgaming.com@gtempaccount.com1a4e09a2013-04-13 03:33:30 +00006243 gl::Context *context = gl::getNonLostContext();
6244
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006245 switch (type)
6246 {
6247 case GL_BYTE:
6248 case GL_UNSIGNED_BYTE:
6249 case GL_SHORT:
6250 case GL_UNSIGNED_SHORT:
6251 case GL_FIXED:
6252 case GL_FLOAT:
6253 break;
shannon.woods%transgaming.com@gtempaccount.com1a4e09a2013-04-13 03:33:30 +00006254 case GL_HALF_FLOAT:
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00006255 case GL_INT:
6256 case GL_UNSIGNED_INT:
shannon.woods%transgaming.com@gtempaccount.com1ab57be2013-04-13 03:38:39 +00006257 case GL_INT_2_10_10_10_REV:
6258 case GL_UNSIGNED_INT_2_10_10_10_REV:
shannon.woods%transgaming.com@gtempaccount.com1a4e09a2013-04-13 03:33:30 +00006259 if (context && context->getClientVersion() < 3)
6260 {
6261 return gl::error(GL_INVALID_ENUM);
6262 }
6263 else
6264 {
6265 break;
6266 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006267 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006268 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006269 }
6270
6271 if (stride < 0)
6272 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006273 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006274 }
6275
shannon.woods%transgaming.com@gtempaccount.com1ab57be2013-04-13 03:38:39 +00006276 if ((type == GL_INT_2_10_10_10_REV || type == GL_UNSIGNED_INT_2_10_10_10_REV) && size != 4)
6277 {
6278 return gl::error(GL_INVALID_OPERATION);
6279 }
6280
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006281 if (context)
6282 {
Jamie Madilld8db8662013-07-02 11:57:04 -04006283 // [OpenGL ES 3.0.2] Section 2.8 page 24:
6284 // An INVALID_OPERATION error is generated when a non-zero vertex array object
6285 // is bound, zero is bound to the ARRAY_BUFFER buffer object binding point,
6286 // and the pointer argument is not NULL.
6287 if (context->getVertexArrayHandle() != 0 && context->getArrayBufferHandle() == 0 && ptr != NULL)
6288 {
6289 return gl::error(GL_INVALID_OPERATION);
6290 }
6291
shannon.woods%transgaming.com@gtempaccount.com8de4e6a2013-04-13 03:37:44 +00006292 context->setVertexAttribState(index, context->getArrayBuffer(), size, type,
6293 normalized == GL_TRUE, false, stride, ptr);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006294 }
6295 }
6296 catch(std::bad_alloc&)
6297 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006298 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006299 }
6300}
6301
6302void __stdcall glViewport(GLint x, GLint y, GLsizei width, GLsizei height)
6303{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006304 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 +00006305
6306 try
6307 {
6308 if (width < 0 || height < 0)
6309 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006310 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006311 }
6312
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006313 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006314
6315 if (context)
6316 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00006317 context->setViewportParams(x, y, width, height);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006318 }
6319 }
6320 catch(std::bad_alloc&)
6321 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006322 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006323 }
6324}
6325
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006326// OpenGL ES 3.0 functions
6327
6328void __stdcall glReadBuffer(GLenum mode)
6329{
6330 EVENT("(GLenum mode = 0x%X)", mode);
6331
6332 try
6333 {
6334 gl::Context *context = gl::getNonLostContext();
6335
6336 if (context)
6337 {
6338 if (context->getClientVersion() < 3)
6339 {
6340 return gl::error(GL_INVALID_OPERATION);
6341 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006342
Jamie Madill54133512013-06-21 09:33:07 -04006343 // glReadBuffer
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006344 UNIMPLEMENTED();
6345 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006346 }
6347 catch(std::bad_alloc&)
6348 {
6349 return gl::error(GL_OUT_OF_MEMORY);
6350 }
6351}
6352
6353void __stdcall glDrawRangeElements(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid* indices)
6354{
6355 EVENT("(GLenum mode = 0x%X, GLuint start = %u, GLuint end = %u, GLsizei count = %d, GLenum type = 0x%X, "
6356 "const GLvoid* indices = 0x%0.8p)", mode, start, end, count, type, indices);
6357
6358 try
6359 {
6360 gl::Context *context = gl::getNonLostContext();
6361
6362 if (context)
6363 {
6364 if (context->getClientVersion() < 3)
6365 {
6366 return gl::error(GL_INVALID_OPERATION);
6367 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006368
Jamie Madill54133512013-06-21 09:33:07 -04006369 // glDrawRangeElements
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006370 UNIMPLEMENTED();
6371 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006372 }
6373 catch(std::bad_alloc&)
6374 {
6375 return gl::error(GL_OUT_OF_MEMORY);
6376 }
6377}
6378
6379void __stdcall glTexImage3D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid* pixels)
6380{
6381 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint internalformat = %d, GLsizei width = %d, "
6382 "GLsizei height = %d, GLsizei depth = %d, GLint border = %d, GLenum format = 0x%X, "
6383 "GLenum type = 0x%X, const GLvoid* pixels = 0x%0.8p)",
6384 target, level, internalformat, width, height, depth, border, format, type, pixels);
6385
6386 try
6387 {
6388 gl::Context *context = gl::getNonLostContext();
6389
6390 if (context)
6391 {
6392 if (context->getClientVersion() < 3)
6393 {
6394 return gl::error(GL_INVALID_OPERATION);
6395 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006396
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006397 // validateES3TexImageFormat sets the error code if there is an error
Geoff Lang34dbb6f2013-08-05 15:05:47 -04006398 if (!ValidateES3TexImageParameters(context, target, level, internalformat, false, false,
Jamie Madillefb2a6f2013-09-24 10:22:42 -04006399 0, 0, 0, width, height, depth, border, format, type, pixels))
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006400 {
6401 return;
6402 }
6403
6404 switch(target)
6405 {
6406 case GL_TEXTURE_3D:
6407 {
6408 gl::Texture3D *texture = context->getTexture3D();
Jamie Madill88f18f42013-09-18 14:36:19 -04006409 texture->setImage(level, width, height, depth, internalformat, format, type, context->getUnpackState(), pixels);
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006410 }
6411 break;
6412
6413 case GL_TEXTURE_2D_ARRAY:
shannon.woods%transgaming.com@gtempaccount.com14e8f592013-04-13 03:46:21 +00006414 {
6415 gl::Texture2DArray *texture = context->getTexture2DArray();
Jamie Madill88f18f42013-09-18 14:36:19 -04006416 texture->setImage(level, width, height, depth, internalformat, format, type, context->getUnpackState(), pixels);
shannon.woods%transgaming.com@gtempaccount.com14e8f592013-04-13 03:46:21 +00006417 }
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006418 break;
6419
6420 default:
6421 return gl::error(GL_INVALID_ENUM);
6422 }
6423 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006424 }
6425 catch(std::bad_alloc&)
6426 {
6427 return gl::error(GL_OUT_OF_MEMORY);
6428 }
6429}
6430
6431void __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)
6432{
6433 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
6434 "GLint zoffset = %d, GLsizei width = %d, GLsizei height = %d, GLsizei depth = %d, "
6435 "GLenum format = 0x%X, GLenum type = 0x%X, const GLvoid* pixels = 0x%0.8p)",
6436 target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels);
6437
6438 try
6439 {
6440 gl::Context *context = gl::getNonLostContext();
6441
6442 if (context)
6443 {
6444 if (context->getClientVersion() < 3)
6445 {
6446 return gl::error(GL_INVALID_OPERATION);
6447 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006448
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006449 // validateES3TexImageFormat sets the error code if there is an error
Geoff Lang34dbb6f2013-08-05 15:05:47 -04006450 if (!ValidateES3TexImageParameters(context, target, level, GL_NONE, false, true,
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006451 xoffset, yoffset, zoffset, width, height, depth, 0,
Jamie Madillefb2a6f2013-09-24 10:22:42 -04006452 format, type, pixels))
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006453 {
6454 return;
6455 }
6456
6457 switch(target)
6458 {
6459 case GL_TEXTURE_3D:
6460 {
6461 gl::Texture3D *texture = context->getTexture3D();
Jamie Madill88f18f42013-09-18 14:36:19 -04006462 texture->subImage(level, xoffset, yoffset, zoffset, width, height, depth, format, type, context->getUnpackState(), pixels);
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006463 }
6464 break;
6465
6466 case GL_TEXTURE_2D_ARRAY:
shannon.woods%transgaming.com@gtempaccount.com14e8f592013-04-13 03:46:21 +00006467 {
6468 gl::Texture2DArray *texture = context->getTexture2DArray();
Jamie Madill88f18f42013-09-18 14:36:19 -04006469 texture->subImage(level, xoffset, yoffset, zoffset, width, height, depth, format, type, context->getUnpackState(), pixels);
shannon.woods%transgaming.com@gtempaccount.com14e8f592013-04-13 03:46:21 +00006470 }
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006471 break;
6472
6473 default:
6474 return gl::error(GL_INVALID_ENUM);
6475 }
6476 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006477 }
6478 catch(std::bad_alloc&)
6479 {
6480 return gl::error(GL_OUT_OF_MEMORY);
6481 }
6482}
6483
6484void __stdcall glCopyTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height)
6485{
6486 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
6487 "GLint zoffset = %d, GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d)",
6488 target, level, xoffset, yoffset, zoffset, x, y, width, height);
6489
6490 try
6491 {
6492 gl::Context *context = gl::getNonLostContext();
6493
6494 if (context)
6495 {
6496 if (context->getClientVersion() < 3)
6497 {
6498 return gl::error(GL_INVALID_OPERATION);
6499 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006500
Geoff Lang34dbb6f2013-08-05 15:05:47 -04006501 if (!ValidateES3CopyTexImageParameters(context, target, level, GL_NONE, false, xoffset, yoffset, zoffset,
shannonwoods@chromium.org6cf2b0e2013-05-30 00:13:36 +00006502 x, y, width, height, 0))
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006503 {
6504 return;
6505 }
6506
6507 gl::Framebuffer *framebuffer = context->getReadFramebuffer();
6508 gl::Texture *texture = NULL;
6509 switch (target)
6510 {
6511 case GL_TEXTURE_3D:
6512 texture = context->getTexture3D();
6513 break;
6514
6515 case GL_TEXTURE_2D_ARRAY:
shannon.woods%transgaming.com@gtempaccount.com14e8f592013-04-13 03:46:21 +00006516 texture = context->getTexture2DArray();
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006517 break;
6518
6519 default:
6520 return gl::error(GL_INVALID_ENUM);
6521 }
6522
6523 texture->copySubImage(target, level, xoffset, yoffset, zoffset, x, y, width, height, framebuffer);
6524 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006525 }
6526 catch(std::bad_alloc&)
6527 {
6528 return gl::error(GL_OUT_OF_MEMORY);
6529 }
6530}
6531
6532void __stdcall glCompressedTexImage3D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid* data)
6533{
Geoff Langeef52cc2013-10-16 15:07:39 -04006534 EVENT("(GLenum target = 0x%X, GLint level = %d, GLenum internalformat = 0x%X, GLsizei width = %d, "
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006535 "GLsizei height = %d, GLsizei depth = %d, GLint border = %d, GLsizei imageSize = %d, "
6536 "const GLvoid* data = 0x%0.8p)",
6537 target, level, internalformat, width, height, depth, border, imageSize, data);
6538
6539 try
6540 {
6541 gl::Context *context = gl::getNonLostContext();
6542
6543 if (context)
6544 {
6545 if (context->getClientVersion() < 3)
6546 {
6547 return gl::error(GL_INVALID_OPERATION);
6548 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006549
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +00006550 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 +00006551 {
6552 return gl::error(GL_INVALID_VALUE);
6553 }
6554
6555 // validateES3TexImageFormat sets the error code if there is an error
Geoff Lang34dbb6f2013-08-05 15:05:47 -04006556 if (!ValidateES3TexImageParameters(context, target, level, internalformat, true, false,
Jamie Madillefb2a6f2013-09-24 10:22:42 -04006557 0, 0, 0, width, height, depth, border, GL_NONE, GL_NONE, data))
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006558 {
6559 return;
6560 }
6561
6562 switch(target)
6563 {
6564 case GL_TEXTURE_3D:
6565 {
6566 gl::Texture3D *texture = context->getTexture3D();
6567 texture->setCompressedImage(level, internalformat, width, height, depth, imageSize, data);
6568 }
6569 break;
6570
6571 case GL_TEXTURE_2D_ARRAY:
shannon.woods%transgaming.com@gtempaccount.com14e8f592013-04-13 03:46:21 +00006572 {
6573 gl::Texture2DArray *texture = context->getTexture2DArray();
6574 texture->setCompressedImage(level, internalformat, width, height, depth, imageSize, data);
6575 }
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006576 break;
6577
6578 default:
6579 return gl::error(GL_INVALID_ENUM);
6580 }
6581 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006582 }
6583 catch(std::bad_alloc&)
6584 {
6585 return gl::error(GL_OUT_OF_MEMORY);
6586 }
6587}
6588
6589void __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)
6590{
6591 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
6592 "GLint zoffset = %d, GLsizei width = %d, GLsizei height = %d, GLsizei depth = %d, "
6593 "GLenum format = 0x%X, GLsizei imageSize = %d, const GLvoid* data = 0x%0.8p)",
6594 target, level, xoffset, yoffset, zoffset, width, height, depth, format, imageSize, data);
6595
6596 try
6597 {
6598 gl::Context *context = gl::getNonLostContext();
6599
6600 if (context)
6601 {
6602 if (context->getClientVersion() < 3)
6603 {
6604 return gl::error(GL_INVALID_OPERATION);
6605 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006606
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +00006607 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 +00006608 {
6609 return gl::error(GL_INVALID_VALUE);
6610 }
6611
6612 if (!data)
6613 {
6614 return gl::error(GL_INVALID_VALUE);
6615 }
6616
6617 // validateES3TexImageFormat sets the error code if there is an error
Geoff Lang34dbb6f2013-08-05 15:05:47 -04006618 if (!ValidateES3TexImageParameters(context, target, level, GL_NONE, true, true,
Jamie Madillefb2a6f2013-09-24 10:22:42 -04006619 0, 0, 0, width, height, depth, 0, GL_NONE, GL_NONE, data))
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006620 {
6621 return;
6622 }
6623
6624 switch(target)
6625 {
6626 case GL_TEXTURE_3D:
6627 {
6628 gl::Texture3D *texture = context->getTexture3D();
6629 texture->subImageCompressed(level, xoffset, yoffset, zoffset, width, height, depth,
6630 format, imageSize, data);
6631 }
6632 break;
6633
6634 case GL_TEXTURE_2D_ARRAY:
shannon.woods%transgaming.com@gtempaccount.com14e8f592013-04-13 03:46:21 +00006635 {
6636 gl::Texture2DArray *texture = context->getTexture2DArray();
6637 texture->subImageCompressed(level, xoffset, yoffset, zoffset, width, height, depth,
6638 format, imageSize, data);
6639 }
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006640 break;
6641
6642 default:
6643 return gl::error(GL_INVALID_ENUM);
6644 }
6645 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006646 }
6647 catch(std::bad_alloc&)
6648 {
6649 return gl::error(GL_OUT_OF_MEMORY);
6650 }
6651}
6652
6653void __stdcall glGenQueries(GLsizei n, GLuint* ids)
6654{
6655 EVENT("(GLsizei n = %d, GLuint* ids = 0x%0.8p)", n, ids);
6656
6657 try
6658 {
6659 gl::Context *context = gl::getNonLostContext();
6660
6661 if (context)
6662 {
6663 if (context->getClientVersion() < 3)
6664 {
6665 return gl::error(GL_INVALID_OPERATION);
6666 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006667
Jamie Madill3641b4b2013-07-26 12:54:59 -04006668 glGenQueriesEXT(n, ids);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006669 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006670 }
6671 catch(std::bad_alloc&)
6672 {
6673 return gl::error(GL_OUT_OF_MEMORY);
6674 }
6675}
6676
6677void __stdcall glDeleteQueries(GLsizei n, const GLuint* ids)
6678{
6679 EVENT("(GLsizei n = %d, GLuint* ids = 0x%0.8p)", n, ids);
6680
6681 try
6682 {
6683 gl::Context *context = gl::getNonLostContext();
6684
6685 if (context)
6686 {
6687 if (context->getClientVersion() < 3)
6688 {
6689 return gl::error(GL_INVALID_OPERATION);
6690 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006691
Jamie Madill3641b4b2013-07-26 12:54:59 -04006692 glDeleteQueriesEXT(n, ids);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006693 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006694 }
6695 catch(std::bad_alloc&)
6696 {
6697 return gl::error(GL_OUT_OF_MEMORY);
6698 }
6699}
6700
6701GLboolean __stdcall glIsQuery(GLuint id)
6702{
6703 EVENT("(GLuint id = %u)", id);
6704
6705 try
6706 {
6707 gl::Context *context = gl::getNonLostContext();
6708
6709 if (context)
6710 {
6711 if (context->getClientVersion() < 3)
6712 {
6713 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
6714 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006715
Jamie Madill3641b4b2013-07-26 12:54:59 -04006716 // TODO: XFB queries
6717 return glIsQueryEXT(id);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006718 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006719 }
6720 catch(std::bad_alloc&)
6721 {
6722 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
6723 }
6724
6725 return GL_FALSE;
6726}
6727
6728void __stdcall glBeginQuery(GLenum target, GLuint id)
6729{
6730 EVENT("(GLenum target = 0x%X, GLuint id = %u)", target, id);
6731
6732 try
6733 {
6734 gl::Context *context = gl::getNonLostContext();
6735
6736 if (context)
6737 {
6738 if (context->getClientVersion() < 3)
6739 {
6740 return gl::error(GL_INVALID_OPERATION);
6741 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006742
Jamie Madill3641b4b2013-07-26 12:54:59 -04006743 switch (target)
6744 {
6745 case GL_ANY_SAMPLES_PASSED:
6746 case GL_ANY_SAMPLES_PASSED_CONSERVATIVE:
6747 case GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN:
6748 break;
6749 default:
6750 return gl::error(GL_INVALID_ENUM);
6751 }
6752
6753 if (id == 0)
6754 {
6755 return gl::error(GL_INVALID_OPERATION);
6756 }
6757
6758 if (target == GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN)
6759 {
6760 // TODO: XFB queries
6761 UNIMPLEMENTED();
6762 }
6763 else
6764 {
6765 context->beginQuery(target, id);
6766 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006767 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006768 }
6769 catch(std::bad_alloc&)
6770 {
6771 return gl::error(GL_OUT_OF_MEMORY);
6772 }
6773}
6774
6775void __stdcall glEndQuery(GLenum target)
6776{
6777 EVENT("(GLenum target = 0x%X)", target);
6778
6779 try
6780 {
6781 gl::Context *context = gl::getNonLostContext();
6782
6783 if (context)
6784 {
6785 if (context->getClientVersion() < 3)
6786 {
6787 return gl::error(GL_INVALID_OPERATION);
6788 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006789
Jamie Madill3641b4b2013-07-26 12:54:59 -04006790 if (target == GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN)
6791 {
6792 // TODO: XFB queries
6793 UNIMPLEMENTED();
6794 }
6795 else
6796 {
6797 glEndQueryEXT(target);
6798 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006799 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006800 }
6801 catch(std::bad_alloc&)
6802 {
6803 return gl::error(GL_OUT_OF_MEMORY);
6804 }
6805}
6806
6807void __stdcall glGetQueryiv(GLenum target, GLenum pname, GLint* params)
6808{
6809 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLint* params = 0x%0.8p)", target, pname, params);
6810
6811 try
6812 {
6813 gl::Context *context = gl::getNonLostContext();
6814
6815 if (context)
6816 {
6817 if (context->getClientVersion() < 3)
6818 {
6819 return gl::error(GL_INVALID_OPERATION);
6820 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006821
Jamie Madill3641b4b2013-07-26 12:54:59 -04006822 if (target == GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN)
6823 {
6824 // TODO: XFB queries
6825 UNIMPLEMENTED();
6826 }
6827 else
6828 {
6829 glGetQueryivEXT(target, pname, params);
6830 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006831 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006832 }
6833 catch(std::bad_alloc&)
6834 {
6835 return gl::error(GL_OUT_OF_MEMORY);
6836 }
6837}
6838
6839void __stdcall glGetQueryObjectuiv(GLuint id, GLenum pname, GLuint* params)
6840{
6841 EVENT("(GLuint id = %u, GLenum pname = 0x%X, GLint* params = 0x%0.8p)", id, pname, params);
6842
6843 try
6844 {
6845 gl::Context *context = gl::getNonLostContext();
6846
6847 if (context)
6848 {
6849 if (context->getClientVersion() < 3)
6850 {
6851 return gl::error(GL_INVALID_OPERATION);
6852 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006853
Jamie Madill3641b4b2013-07-26 12:54:59 -04006854 // TODO: XFB queries
6855 glGetQueryObjectuivEXT(id, pname, params);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006856 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006857 }
6858 catch(std::bad_alloc&)
6859 {
6860 return gl::error(GL_OUT_OF_MEMORY);
6861 }
6862}
6863
6864GLboolean __stdcall glUnmapBuffer(GLenum target)
6865{
6866 EVENT("(GLenum target = 0x%X)", target);
6867
6868 try
6869 {
6870 gl::Context *context = gl::getNonLostContext();
6871
6872 if (context)
6873 {
6874 if (context->getClientVersion() < 3)
6875 {
6876 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
6877 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006878
Jamie Madill54133512013-06-21 09:33:07 -04006879 // glUnmapBuffer
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006880 UNIMPLEMENTED();
6881 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006882 }
6883 catch(std::bad_alloc&)
6884 {
6885 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
6886 }
6887
6888 return GL_FALSE;
6889}
6890
6891void __stdcall glGetBufferPointerv(GLenum target, GLenum pname, GLvoid** params)
6892{
6893 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLvoid** params = 0x%0.8p)", target, pname, params);
6894
6895 try
6896 {
6897 gl::Context *context = gl::getNonLostContext();
6898
6899 if (context)
6900 {
6901 if (context->getClientVersion() < 3)
6902 {
6903 return gl::error(GL_INVALID_OPERATION);
6904 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006905
Jamie Madill54133512013-06-21 09:33:07 -04006906 // glGetBufferPointerv
shannonwoods@chromium.org2d2190a2013-05-30 00:17:35 +00006907 UNIMPLEMENTED();
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006908 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006909 }
6910 catch(std::bad_alloc&)
6911 {
6912 return gl::error(GL_OUT_OF_MEMORY);
6913 }
6914}
6915
6916void __stdcall glDrawBuffers(GLsizei n, const GLenum* bufs)
6917{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006918 try
6919 {
6920 gl::Context *context = gl::getNonLostContext();
6921
6922 if (context)
6923 {
6924 if (context->getClientVersion() < 3)
6925 {
6926 return gl::error(GL_INVALID_OPERATION);
6927 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006928
shannon.woods%transgaming.com@gtempaccount.com7948c5f2013-04-13 03:38:58 +00006929 glDrawBuffersEXT(n, bufs);
6930 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006931 }
6932 catch(std::bad_alloc&)
6933 {
6934 return gl::error(GL_OUT_OF_MEMORY);
6935 }
6936}
6937
6938void __stdcall glUniformMatrix2x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
6939{
6940 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
6941 location, count, transpose, value);
6942
6943 try
6944 {
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006945 if (count < 0)
6946 {
6947 return gl::error(GL_INVALID_VALUE);
6948 }
6949
6950 if (location == -1)
6951 {
6952 return;
6953 }
6954
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006955 gl::Context *context = gl::getNonLostContext();
6956
6957 if (context)
6958 {
6959 if (context->getClientVersion() < 3)
6960 {
6961 return gl::error(GL_INVALID_OPERATION);
6962 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006963
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006964 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
6965 if (!programBinary)
6966 {
6967 return gl::error(GL_INVALID_OPERATION);
6968 }
6969
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00006970 if (!programBinary->setUniformMatrix2x3fv(location, count, transpose, value))
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006971 {
6972 return gl::error(GL_INVALID_OPERATION);
6973 }
6974 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006975 }
6976 catch(std::bad_alloc&)
6977 {
6978 return gl::error(GL_OUT_OF_MEMORY);
6979 }
6980}
6981
6982void __stdcall glUniformMatrix3x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
6983{
6984 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
6985 location, count, transpose, value);
6986
6987 try
6988 {
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006989 if (count < 0)
6990 {
6991 return gl::error(GL_INVALID_VALUE);
6992 }
6993
6994 if (location == -1)
6995 {
6996 return;
6997 }
6998
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006999 gl::Context *context = gl::getNonLostContext();
7000
7001 if (context)
7002 {
7003 if (context->getClientVersion() < 3)
7004 {
7005 return gl::error(GL_INVALID_OPERATION);
7006 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007007
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00007008 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
7009 if (!programBinary)
7010 {
7011 return gl::error(GL_INVALID_OPERATION);
7012 }
7013
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00007014 if (!programBinary->setUniformMatrix3x2fv(location, count, transpose, value))
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00007015 {
7016 return gl::error(GL_INVALID_OPERATION);
7017 }
7018 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007019 }
7020 catch(std::bad_alloc&)
7021 {
7022 return gl::error(GL_OUT_OF_MEMORY);
7023 }
7024}
7025
7026void __stdcall glUniformMatrix2x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
7027{
7028 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
7029 location, count, transpose, value);
7030
7031 try
7032 {
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00007033 if (count < 0)
7034 {
7035 return gl::error(GL_INVALID_VALUE);
7036 }
7037
7038 if (location == -1)
7039 {
7040 return;
7041 }
7042
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007043 gl::Context *context = gl::getNonLostContext();
7044
7045 if (context)
7046 {
7047 if (context->getClientVersion() < 3)
7048 {
7049 return gl::error(GL_INVALID_OPERATION);
7050 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007051
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00007052 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
7053 if (!programBinary)
7054 {
7055 return gl::error(GL_INVALID_OPERATION);
7056 }
7057
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00007058 if (!programBinary->setUniformMatrix2x4fv(location, count, transpose, value))
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00007059 {
7060 return gl::error(GL_INVALID_OPERATION);
7061 }
7062 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007063 }
7064 catch(std::bad_alloc&)
7065 {
7066 return gl::error(GL_OUT_OF_MEMORY);
7067 }
7068}
7069
7070void __stdcall glUniformMatrix4x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
7071{
7072 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
7073 location, count, transpose, value);
7074
7075 try
7076 {
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00007077 if (count < 0)
7078 {
7079 return gl::error(GL_INVALID_VALUE);
7080 }
7081
7082 if (location == -1)
7083 {
7084 return;
7085 }
7086
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007087 gl::Context *context = gl::getNonLostContext();
7088
7089 if (context)
7090 {
7091 if (context->getClientVersion() < 3)
7092 {
7093 return gl::error(GL_INVALID_OPERATION);
7094 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007095
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00007096 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
7097 if (!programBinary)
7098 {
7099 return gl::error(GL_INVALID_OPERATION);
7100 }
7101
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00007102 if (!programBinary->setUniformMatrix4x2fv(location, count, transpose, value))
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00007103 {
7104 return gl::error(GL_INVALID_OPERATION);
7105 }
7106 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007107 }
7108 catch(std::bad_alloc&)
7109 {
7110 return gl::error(GL_OUT_OF_MEMORY);
7111 }
7112}
7113
7114void __stdcall glUniformMatrix3x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
7115{
7116 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
7117 location, count, transpose, value);
7118
7119 try
7120 {
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00007121 if (count < 0)
7122 {
7123 return gl::error(GL_INVALID_VALUE);
7124 }
7125
7126 if (location == -1)
7127 {
7128 return;
7129 }
7130
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007131 gl::Context *context = gl::getNonLostContext();
7132
7133 if (context)
7134 {
7135 if (context->getClientVersion() < 3)
7136 {
7137 return gl::error(GL_INVALID_OPERATION);
7138 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007139
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00007140 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
7141 if (!programBinary)
7142 {
7143 return gl::error(GL_INVALID_OPERATION);
7144 }
7145
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00007146 if (!programBinary->setUniformMatrix3x4fv(location, count, transpose, value))
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00007147 {
7148 return gl::error(GL_INVALID_OPERATION);
7149 }
7150 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007151 }
7152 catch(std::bad_alloc&)
7153 {
7154 return gl::error(GL_OUT_OF_MEMORY);
7155 }
7156}
7157
7158void __stdcall glUniformMatrix4x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
7159{
7160 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
7161 location, count, transpose, value);
7162
7163 try
7164 {
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00007165 if (count < 0)
7166 {
7167 return gl::error(GL_INVALID_VALUE);
7168 }
7169
7170 if (location == -1)
7171 {
7172 return;
7173 }
7174
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007175 gl::Context *context = gl::getNonLostContext();
7176
7177 if (context)
7178 {
7179 if (context->getClientVersion() < 3)
7180 {
7181 return gl::error(GL_INVALID_OPERATION);
7182 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007183
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00007184 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
7185 if (!programBinary)
7186 {
7187 return gl::error(GL_INVALID_OPERATION);
7188 }
7189
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00007190 if (!programBinary->setUniformMatrix4x3fv(location, count, transpose, value))
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00007191 {
7192 return gl::error(GL_INVALID_OPERATION);
7193 }
7194 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007195 }
7196 catch(std::bad_alloc&)
7197 {
7198 return gl::error(GL_OUT_OF_MEMORY);
7199 }
7200}
7201
7202void __stdcall glBlitFramebuffer(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter)
7203{
7204 EVENT("(GLint srcX0 = %d, GLint srcY0 = %d, GLint srcX1 = %d, GLint srcY1 = %d, GLint dstX0 = %d, "
7205 "GLint dstY0 = %d, GLint dstX1 = %d, GLint dstY1 = %d, GLbitfield mask = 0x%X, GLenum filter = 0x%X)",
7206 srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter);
7207
7208 try
7209 {
7210 gl::Context *context = gl::getNonLostContext();
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007211 if (context)
7212 {
7213 if (context->getClientVersion() < 3)
7214 {
7215 return gl::error(GL_INVALID_OPERATION);
7216 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007217
Geoff Lang34dbb6f2013-08-05 15:05:47 -04007218 if (!ValidateBlitFramebufferParameters(context, srcX0, srcY0, srcX1, srcY1,
Geoff Lang758d5b22013-06-11 11:42:50 -04007219 dstX0, dstY0, dstX1, dstY1, mask, filter,
7220 false))
7221 {
7222 return;
7223 }
7224
7225 context->blitFramebuffer(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1,
7226 mask, filter);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007227 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007228 }
7229 catch(std::bad_alloc&)
7230 {
7231 return gl::error(GL_OUT_OF_MEMORY);
7232 }
7233}
7234
7235void __stdcall glRenderbufferStorageMultisample(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height)
7236{
7237 EVENT("(GLenum target = 0x%X, GLsizei samples = %d, GLenum internalformat = 0x%X, GLsizei width = %d, GLsizei height = %d)",
7238 target, samples, internalformat, width, height);
7239
7240 try
7241 {
7242 gl::Context *context = gl::getNonLostContext();
7243
7244 if (context)
7245 {
7246 if (context->getClientVersion() < 3)
7247 {
7248 return gl::error(GL_INVALID_OPERATION);
7249 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007250
Geoff Lang34dbb6f2013-08-05 15:05:47 -04007251 if (!ValidateRenderbufferStorageParameters(context, target, samples, internalformat,
Geoff Lang2e1dcd52013-05-29 10:34:08 -04007252 width, height, false))
7253 {
7254 return;
7255 }
7256
7257 context->setRenderbufferStorage(width, height, internalformat, samples);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007258 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007259 }
7260 catch(std::bad_alloc&)
7261 {
7262 return gl::error(GL_OUT_OF_MEMORY);
7263 }
7264}
7265
7266void __stdcall glFramebufferTextureLayer(GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer)
7267{
7268 EVENT("(GLenum target = 0x%X, GLenum attachment = 0x%X, GLuint texture = %u, GLint level = %d, GLint layer = %d)",
7269 target, attachment, texture, level, layer);
7270
7271 try
7272 {
7273 gl::Context *context = gl::getNonLostContext();
7274
7275 if (context)
7276 {
7277 if (context->getClientVersion() < 3)
7278 {
7279 return gl::error(GL_INVALID_OPERATION);
7280 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007281
Geoff Lang34dbb6f2013-08-05 15:05:47 -04007282 if (!ValidateES3FramebufferTextureParameters(context, target, attachment, GL_NONE, texture, level, layer, true))
Geoff Lang3ed0c482013-07-25 17:03:18 -04007283 {
7284 return;
7285 }
7286
7287 gl::Framebuffer *framebuffer = NULL;
7288 if (target == GL_READ_FRAMEBUFFER)
7289 {
7290 framebuffer = context->getReadFramebuffer();
7291 }
7292 else
7293 {
7294 framebuffer = context->getDrawFramebuffer();
7295 }
7296
7297 gl::Texture *textureObject = context->getTexture(texture);
7298 GLenum textarget = textureObject ? textureObject->getTarget() : GL_NONE;
7299
7300 if (attachment >= GL_COLOR_ATTACHMENT0_EXT && attachment <= GL_COLOR_ATTACHMENT15_EXT)
7301 {
7302 const unsigned int colorAttachment = (attachment - GL_COLOR_ATTACHMENT0_EXT);
7303 framebuffer->setColorbuffer(colorAttachment, textarget, texture, level, layer);
7304 }
7305 else
7306 {
7307 switch (attachment)
7308 {
7309 case GL_DEPTH_ATTACHMENT: framebuffer->setDepthbuffer(textarget, texture, level, layer); break;
7310 case GL_STENCIL_ATTACHMENT: framebuffer->setStencilbuffer(textarget, texture, level, layer); break;
7311 case GL_DEPTH_STENCIL_ATTACHMENT: framebuffer->setDepthStencilBuffer(textarget, texture, level, layer); break;
7312 }
7313 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007314 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007315 }
7316 catch(std::bad_alloc&)
7317 {
7318 return gl::error(GL_OUT_OF_MEMORY);
7319 }
7320}
7321
7322GLvoid* __stdcall glMapBufferRange(GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access)
7323{
7324 EVENT("(GLenum target = 0x%X, GLintptr offset = %d, GLsizeiptr length = %d, GLbitfield access = 0x%X)",
7325 target, offset, length, access);
7326
7327 try
7328 {
7329 gl::Context *context = gl::getNonLostContext();
7330
7331 if (context)
7332 {
7333 if (context->getClientVersion() < 3)
7334 {
7335 return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLvoid*>(NULL));
7336 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007337
Jamie Madill54133512013-06-21 09:33:07 -04007338 // glMapBufferRange
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007339 UNIMPLEMENTED();
7340 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007341 }
7342 catch(std::bad_alloc&)
7343 {
7344 return gl::error(GL_OUT_OF_MEMORY, reinterpret_cast<GLvoid*>(NULL));
7345 }
7346
7347 return NULL;
7348}
7349
7350void __stdcall glFlushMappedBufferRange(GLenum target, GLintptr offset, GLsizeiptr length)
7351{
7352 EVENT("(GLenum target = 0x%X, GLintptr offset = %d, GLsizeiptr length = %d)", target, offset, length);
7353
7354 try
7355 {
7356 gl::Context *context = gl::getNonLostContext();
7357
7358 if (context)
7359 {
7360 if (context->getClientVersion() < 3)
7361 {
7362 return gl::error(GL_INVALID_OPERATION);
7363 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007364
Jamie Madill54133512013-06-21 09:33:07 -04007365 // glFlushMappedBufferRange
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007366 UNIMPLEMENTED();
7367 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007368 }
7369 catch(std::bad_alloc&)
7370 {
7371 return gl::error(GL_OUT_OF_MEMORY);
7372 }
7373}
7374
7375void __stdcall glBindVertexArray(GLuint array)
7376{
7377 EVENT("(GLuint array = %u)", array);
7378
7379 try
7380 {
7381 gl::Context *context = gl::getNonLostContext();
7382
7383 if (context)
7384 {
7385 if (context->getClientVersion() < 3)
7386 {
7387 return gl::error(GL_INVALID_OPERATION);
7388 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007389
Jamie Madilld1028542013-07-02 11:57:04 -04007390 gl::VertexArray *vao = context->getVertexArray(array);
7391
7392 if (!vao)
7393 {
7394 // The default VAO should always exist
7395 ASSERT(array != 0);
7396 return gl::error(GL_INVALID_OPERATION);
7397 }
7398
7399 context->bindVertexArray(array);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007400 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007401 }
7402 catch(std::bad_alloc&)
7403 {
7404 return gl::error(GL_OUT_OF_MEMORY);
7405 }
7406}
7407
7408void __stdcall glDeleteVertexArrays(GLsizei n, const GLuint* arrays)
7409{
7410 EVENT("(GLsizei n = %d, const GLuint* arrays = 0x%0.8p)", n, arrays);
7411
7412 try
7413 {
7414 gl::Context *context = gl::getNonLostContext();
7415
7416 if (context)
7417 {
7418 if (context->getClientVersion() < 3)
7419 {
7420 return gl::error(GL_INVALID_OPERATION);
7421 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007422
Jamie Madilld1028542013-07-02 11:57:04 -04007423 if (n < 0)
7424 {
7425 return gl::error(GL_INVALID_VALUE);
7426 }
7427
7428 for (int arrayIndex = 0; arrayIndex < n; arrayIndex++)
7429 {
7430 if (arrays[arrayIndex] != 0)
7431 {
7432 context->deleteVertexArray(arrays[arrayIndex]);
7433 }
7434 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007435 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007436 }
7437 catch(std::bad_alloc&)
7438 {
7439 return gl::error(GL_OUT_OF_MEMORY);
7440 }
7441}
7442
7443void __stdcall glGenVertexArrays(GLsizei n, GLuint* arrays)
7444{
7445 EVENT("(GLsizei n = %d, GLuint* arrays = 0x%0.8p)", n, arrays);
7446
7447 try
7448 {
7449 gl::Context *context = gl::getNonLostContext();
7450
7451 if (context)
7452 {
7453 if (context->getClientVersion() < 3)
7454 {
7455 return gl::error(GL_INVALID_OPERATION);
7456 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007457
Jamie Madilld1028542013-07-02 11:57:04 -04007458 if (n < 0)
7459 {
7460 return gl::error(GL_INVALID_VALUE);
7461 }
7462
7463 for (int arrayIndex = 0; arrayIndex < n; arrayIndex++)
7464 {
7465 arrays[arrayIndex] = context->createVertexArray();
7466 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007467 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007468 }
7469 catch(std::bad_alloc&)
7470 {
7471 return gl::error(GL_OUT_OF_MEMORY);
7472 }
7473}
7474
7475GLboolean __stdcall glIsVertexArray(GLuint array)
7476{
7477 EVENT("(GLuint array = %u)", array);
7478
7479 try
7480 {
7481 gl::Context *context = gl::getNonLostContext();
7482
7483 if (context)
7484 {
7485 if (context->getClientVersion() < 3)
7486 {
7487 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
7488 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007489
Jamie Madilld1028542013-07-02 11:57:04 -04007490 if (array == 0)
7491 {
7492 return GL_FALSE;
7493 }
7494
7495 gl::VertexArray *vao = context->getVertexArray(array);
7496
7497 return (vao != NULL ? GL_TRUE : GL_FALSE);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007498 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007499 }
7500 catch(std::bad_alloc&)
7501 {
7502 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
7503 }
7504
7505 return GL_FALSE;
7506}
7507
7508void __stdcall glGetIntegeri_v(GLenum target, GLuint index, GLint* data)
7509{
7510 EVENT("(GLenum target = 0x%X, GLuint index = %u, GLint* data = 0x%0.8p)",
7511 target, index, data);
7512
7513 try
7514 {
7515 gl::Context *context = gl::getNonLostContext();
7516
7517 if (context)
7518 {
7519 if (context->getClientVersion() < 3)
7520 {
7521 return gl::error(GL_INVALID_OPERATION);
7522 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007523
Shannon Woods15934d52013-08-19 14:28:49 -04007524 switch (target)
7525 {
7526 case GL_TRANSFORM_FEEDBACK_BUFFER_START:
7527 case GL_TRANSFORM_FEEDBACK_BUFFER_SIZE:
7528 case GL_TRANSFORM_FEEDBACK_BUFFER_BINDING:
7529 if (index >= context->getMaxTransformFeedbackBufferBindings())
7530 return gl::error(GL_INVALID_VALUE);
7531 break;
7532 case GL_UNIFORM_BUFFER_START:
7533 case GL_UNIFORM_BUFFER_SIZE:
7534 case GL_UNIFORM_BUFFER_BINDING:
7535 if (index >= context->getMaximumCombinedUniformBufferBindings())
7536 return gl::error(GL_INVALID_VALUE);
7537 break;
7538 default:
7539 return gl::error(GL_INVALID_ENUM);
7540 }
7541
7542 if (!(context->getIndexedIntegerv(target, index, data)))
7543 {
7544 GLenum nativeType;
7545 unsigned int numParams = 0;
7546 if (!context->getIndexedQueryParameterInfo(target, &nativeType, &numParams))
7547 return gl::error(GL_INVALID_ENUM);
7548
7549 if (numParams == 0)
7550 return; // it is known that pname is valid, but there are no parameters to return
7551
7552 if (nativeType == GL_INT_64_ANGLEX)
7553 {
7554 GLint64 minIntValue = static_cast<GLint64>(std::numeric_limits<int>::min());
7555 GLint64 maxIntValue = static_cast<GLint64>(std::numeric_limits<int>::max());
7556 GLint64 *int64Params = new GLint64[numParams];
7557
7558 context->getIndexedInteger64v(target, index, int64Params);
7559
7560 for (unsigned int i = 0; i < numParams; ++i)
7561 {
7562 GLint64 clampedValue = std::max(std::min(int64Params[i], maxIntValue), minIntValue);
7563 data[i] = static_cast<GLint>(clampedValue);
7564 }
7565
7566 delete [] int64Params;
7567 }
7568 else
7569 {
7570 UNREACHABLE();
7571 }
7572 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007573 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007574 }
7575 catch(std::bad_alloc&)
7576 {
7577 return gl::error(GL_OUT_OF_MEMORY);
7578 }
7579}
7580
7581void __stdcall glBeginTransformFeedback(GLenum primitiveMode)
7582{
7583 EVENT("(GLenum primitiveMode = 0x%X)", primitiveMode);
7584
7585 try
7586 {
7587 gl::Context *context = gl::getNonLostContext();
7588
7589 if (context)
7590 {
7591 if (context->getClientVersion() < 3)
7592 {
7593 return gl::error(GL_INVALID_OPERATION);
7594 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007595
Jamie Madill54133512013-06-21 09:33:07 -04007596 // glBeginTransformFeedback
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007597 UNIMPLEMENTED();
7598 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007599 }
7600 catch(std::bad_alloc&)
7601 {
7602 return gl::error(GL_OUT_OF_MEMORY);
7603 }
7604}
7605
7606void __stdcall glEndTransformFeedback(void)
7607{
7608 EVENT("(void)");
7609
7610 try
7611 {
7612 gl::Context *context = gl::getNonLostContext();
7613
7614 if (context)
7615 {
7616 if (context->getClientVersion() < 3)
7617 {
7618 return gl::error(GL_INVALID_OPERATION);
7619 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007620
Jamie Madill54133512013-06-21 09:33:07 -04007621 // glEndTransformFeedback
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007622 UNIMPLEMENTED();
7623 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007624 }
7625 catch(std::bad_alloc&)
7626 {
7627 return gl::error(GL_OUT_OF_MEMORY);
7628 }
7629}
7630
7631void __stdcall glBindBufferRange(GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size)
7632{
7633 EVENT("(GLenum target = 0x%X, GLuint index = %u, GLuint buffer = %u, GLintptr offset = %d, GLsizeiptr size = %d)",
7634 target, index, buffer, offset, size);
7635
7636 try
7637 {
7638 gl::Context *context = gl::getNonLostContext();
7639
7640 if (context)
7641 {
7642 if (context->getClientVersion() < 3)
7643 {
7644 return gl::error(GL_INVALID_OPERATION);
7645 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007646
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007647 switch (target)
7648 {
7649 case GL_TRANSFORM_FEEDBACK_BUFFER:
shannonwoods@chromium.orgd11158f2013-05-30 00:06:19 +00007650 if (index >= context->getMaxTransformFeedbackBufferBindings())
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007651 {
7652 return gl::error(GL_INVALID_VALUE);
7653 }
7654 break;
7655
7656 case GL_UNIFORM_BUFFER:
7657 if (index >= context->getMaximumCombinedUniformBufferBindings())
7658 {
7659 return gl::error(GL_INVALID_VALUE);
7660 }
7661 break;
7662
7663 default:
7664 return gl::error(GL_INVALID_ENUM);
7665 }
7666
shannonwoods@chromium.orge6e00792013-05-30 00:06:07 +00007667 if (buffer != 0 && size <= 0)
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007668 {
7669 return gl::error(GL_INVALID_VALUE);
7670 }
7671
7672 switch (target)
7673 {
7674 case GL_TRANSFORM_FEEDBACK_BUFFER:
shannonwoods@chromium.orga26aeaf2013-05-30 00:06:13 +00007675
7676 // size and offset must be a multiple of 4
7677 if (buffer != 0 && ((offset % 4) != 0 || (size % 4) != 0))
7678 {
7679 return gl::error(GL_INVALID_VALUE);
7680 }
7681
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +00007682 context->bindIndexedTransformFeedbackBuffer(buffer, index, offset, size);
7683 context->bindGenericTransformFeedbackBuffer(buffer);
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007684 break;
7685
7686 case GL_UNIFORM_BUFFER:
shannonwoods@chromium.org97c3d502013-05-30 00:04:34 +00007687
7688 // it is an error to bind an offset not a multiple of the alignment
7689 if (buffer != 0 && (offset % context->getUniformBufferOffsetAlignment()) != 0)
7690 {
7691 return gl::error(GL_INVALID_VALUE);
7692 }
7693
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +00007694 context->bindIndexedUniformBuffer(buffer, index, offset, size);
7695 context->bindGenericUniformBuffer(buffer);
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007696 break;
7697
7698 default:
7699 UNREACHABLE();
7700 }
7701 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007702 }
7703 catch(std::bad_alloc&)
7704 {
7705 return gl::error(GL_OUT_OF_MEMORY);
7706 }
7707}
7708
7709void __stdcall glBindBufferBase(GLenum target, GLuint index, GLuint buffer)
7710{
7711 EVENT("(GLenum target = 0x%X, GLuint index = %u, GLuint buffer = %u)",
7712 target, index, buffer);
7713
7714 try
7715 {
7716 gl::Context *context = gl::getNonLostContext();
7717
7718 if (context)
7719 {
7720 if (context->getClientVersion() < 3)
7721 {
7722 return gl::error(GL_INVALID_OPERATION);
7723 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007724
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007725 switch (target)
7726 {
7727 case GL_TRANSFORM_FEEDBACK_BUFFER:
shannonwoods@chromium.orgd11158f2013-05-30 00:06:19 +00007728 if (index >= context->getMaxTransformFeedbackBufferBindings())
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007729 {
7730 return gl::error(GL_INVALID_VALUE);
7731 }
7732 break;
7733
7734 case GL_UNIFORM_BUFFER:
shannonwoods@chromium.orgd11158f2013-05-30 00:06:19 +00007735 if (index >= context->getMaximumCombinedUniformBufferBindings())
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007736 {
7737 return gl::error(GL_INVALID_VALUE);
7738 }
7739 break;
7740
7741 default:
7742 return gl::error(GL_INVALID_ENUM);
7743 }
7744
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007745 switch (target)
7746 {
7747 case GL_TRANSFORM_FEEDBACK_BUFFER:
shannonwoods@chromium.org3eeca1e2013-05-30 00:04:28 +00007748 context->bindIndexedTransformFeedbackBuffer(buffer, index, 0, 0);
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +00007749 context->bindGenericTransformFeedbackBuffer(buffer);
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007750 break;
7751
7752 case GL_UNIFORM_BUFFER:
shannonwoods@chromium.org3eeca1e2013-05-30 00:04:28 +00007753 context->bindIndexedUniformBuffer(buffer, index, 0, 0);
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +00007754 context->bindGenericUniformBuffer(buffer);
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007755 break;
7756
7757 default:
7758 UNREACHABLE();
7759 }
7760 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007761 }
7762 catch(std::bad_alloc&)
7763 {
7764 return gl::error(GL_OUT_OF_MEMORY);
7765 }
7766}
7767
7768void __stdcall glTransformFeedbackVaryings(GLuint program, GLsizei count, const GLchar* const* varyings, GLenum bufferMode)
7769{
7770 EVENT("(GLuint program = %u, GLsizei count = %d, const GLchar* const* varyings = 0x%0.8p, GLenum bufferMode = 0x%X)",
7771 program, count, varyings, bufferMode);
7772
7773 try
7774 {
7775 gl::Context *context = gl::getNonLostContext();
7776
7777 if (context)
7778 {
7779 if (context->getClientVersion() < 3)
7780 {
7781 return gl::error(GL_INVALID_OPERATION);
7782 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007783
Jamie Madill54133512013-06-21 09:33:07 -04007784 // glTransformFeedbackVaryings
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007785 UNIMPLEMENTED();
7786 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007787 }
7788 catch(std::bad_alloc&)
7789 {
7790 return gl::error(GL_OUT_OF_MEMORY);
7791 }
7792}
7793
7794void __stdcall glGetTransformFeedbackVarying(GLuint program, GLuint index, GLsizei bufSize, GLsizei* length, GLsizei* size, GLenum* type, GLchar* name)
7795{
7796 EVENT("(GLuint program = %u, GLuint index = %u, GLsizei bufSize = %d, GLsizei* length = 0x%0.8p, "
7797 "GLsizei* size = 0x%0.8p, GLenum* type = 0x%0.8p, GLchar* name = 0x%0.8p)",
7798 program, index, bufSize, length, size, type, name);
7799
7800 try
7801 {
7802 gl::Context *context = gl::getNonLostContext();
7803
7804 if (context)
7805 {
7806 if (context->getClientVersion() < 3)
7807 {
7808 return gl::error(GL_INVALID_OPERATION);
7809 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007810
Jamie Madill54133512013-06-21 09:33:07 -04007811 // glGetTransformFeedbackVarying
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007812 UNIMPLEMENTED();
7813 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007814 }
7815 catch(std::bad_alloc&)
7816 {
7817 return gl::error(GL_OUT_OF_MEMORY);
7818 }
7819}
7820
7821void __stdcall glVertexAttribIPointer(GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid* pointer)
7822{
7823 EVENT("(GLuint index = %u, GLint size = %d, GLenum type = 0x%X, GLsizei stride = %d, const GLvoid* pointer = 0x%0.8p)",
7824 index, size, type, stride, pointer);
7825
7826 try
7827 {
7828 gl::Context *context = gl::getNonLostContext();
7829
7830 if (context)
7831 {
7832 if (context->getClientVersion() < 3)
7833 {
7834 return gl::error(GL_INVALID_OPERATION);
7835 }
7836 }
7837
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007838 if (index >= gl::MAX_VERTEX_ATTRIBS)
7839 {
7840 return gl::error(GL_INVALID_VALUE);
7841 }
7842
7843 if (size < 1 || size > 4)
7844 {
7845 return gl::error(GL_INVALID_VALUE);
7846 }
7847
7848 switch (type)
7849 {
7850 case GL_BYTE:
7851 case GL_UNSIGNED_BYTE:
7852 case GL_SHORT:
7853 case GL_UNSIGNED_SHORT:
7854 case GL_INT:
7855 case GL_UNSIGNED_INT:
shannon.woods%transgaming.com@gtempaccount.com1ab57be2013-04-13 03:38:39 +00007856 case GL_INT_2_10_10_10_REV:
7857 case GL_UNSIGNED_INT_2_10_10_10_REV:
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007858 break;
7859 default:
7860 return gl::error(GL_INVALID_ENUM);
7861 }
7862
7863 if (stride < 0)
7864 {
7865 return gl::error(GL_INVALID_VALUE);
7866 }
7867
shannon.woods%transgaming.com@gtempaccount.com1ab57be2013-04-13 03:38:39 +00007868 if ((type == GL_INT_2_10_10_10_REV || type == GL_UNSIGNED_INT_2_10_10_10_REV) && size != 4)
7869 {
7870 return gl::error(GL_INVALID_OPERATION);
7871 }
7872
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007873 if (context)
7874 {
Jamie Madilld8db8662013-07-02 11:57:04 -04007875 // [OpenGL ES 3.0.2] Section 2.8 page 24:
7876 // An INVALID_OPERATION error is generated when a non-zero vertex array object
7877 // is bound, zero is bound to the ARRAY_BUFFER buffer object binding point,
7878 // and the pointer argument is not NULL.
7879 if (context->getVertexArrayHandle() != 0 && context->getArrayBufferHandle() == 0 && pointer != NULL)
7880 {
7881 return gl::error(GL_INVALID_OPERATION);
7882 }
7883
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007884 context->setVertexAttribState(index, context->getArrayBuffer(), size, type, false, true,
7885 stride, pointer);
7886 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007887 }
7888 catch(std::bad_alloc&)
7889 {
7890 return gl::error(GL_OUT_OF_MEMORY);
7891 }
7892}
7893
7894void __stdcall glGetVertexAttribIiv(GLuint index, GLenum pname, GLint* params)
7895{
7896 EVENT("(GLuint index = %u, GLenum pname = 0x%X, GLint* params = 0x%0.8p)",
7897 index, pname, params);
7898
7899 try
7900 {
7901 gl::Context *context = gl::getNonLostContext();
7902
7903 if (context)
7904 {
7905 if (context->getClientVersion() < 3)
7906 {
7907 return gl::error(GL_INVALID_OPERATION);
7908 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007909
Jamie Madilla7d05862013-07-02 11:57:06 -04007910 if (index >= gl::MAX_VERTEX_ATTRIBS)
7911 {
7912 return gl::error(GL_INVALID_VALUE);
7913 }
7914
7915 const gl::VertexAttribute &attribState = context->getVertexAttribState(index);
7916
Geoff Lang34dbb6f2013-08-05 15:05:47 -04007917 if (!gl::ValidateGetVertexAttribParameters(pname, context->getClientVersion()))
Jamie Madilla7d05862013-07-02 11:57:06 -04007918 {
7919 return;
7920 }
7921
7922 if (pname == GL_CURRENT_VERTEX_ATTRIB)
7923 {
7924 const gl::VertexAttribCurrentValueData &currentValueData = context->getVertexAttribCurrentValue(index);
7925 for (int i = 0; i < 4; ++i)
7926 {
7927 params[i] = currentValueData.IntValues[i];
7928 }
7929 }
7930 else
7931 {
7932 *params = attribState.querySingleParameter<GLint>(pname);
7933 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007934 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007935 }
7936 catch(std::bad_alloc&)
7937 {
7938 return gl::error(GL_OUT_OF_MEMORY);
7939 }
7940}
7941
7942void __stdcall glGetVertexAttribIuiv(GLuint index, GLenum pname, GLuint* params)
7943{
7944 EVENT("(GLuint index = %u, GLenum pname = 0x%X, GLuint* params = 0x%0.8p)",
7945 index, pname, params);
7946
7947 try
7948 {
7949 gl::Context *context = gl::getNonLostContext();
7950
7951 if (context)
7952 {
7953 if (context->getClientVersion() < 3)
7954 {
7955 return gl::error(GL_INVALID_OPERATION);
7956 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007957
Jamie Madilla7d05862013-07-02 11:57:06 -04007958 if (index >= gl::MAX_VERTEX_ATTRIBS)
7959 {
7960 return gl::error(GL_INVALID_VALUE);
7961 }
7962
7963 const gl::VertexAttribute &attribState = context->getVertexAttribState(index);
7964
Geoff Lang34dbb6f2013-08-05 15:05:47 -04007965 if (!gl::ValidateGetVertexAttribParameters(pname, context->getClientVersion()))
Jamie Madilla7d05862013-07-02 11:57:06 -04007966 {
7967 return;
7968 }
7969
7970 if (pname == GL_CURRENT_VERTEX_ATTRIB)
7971 {
7972 const gl::VertexAttribCurrentValueData &currentValueData = context->getVertexAttribCurrentValue(index);
7973 for (int i = 0; i < 4; ++i)
7974 {
7975 params[i] = currentValueData.UnsignedIntValues[i];
7976 }
7977 }
7978 else
7979 {
7980 *params = attribState.querySingleParameter<GLuint>(pname);
7981 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007982 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007983 }
7984 catch(std::bad_alloc&)
7985 {
7986 return gl::error(GL_OUT_OF_MEMORY);
7987 }
7988}
7989
7990void __stdcall glVertexAttribI4i(GLuint index, GLint x, GLint y, GLint z, GLint w)
7991{
7992 EVENT("(GLuint index = %u, GLint x = %d, GLint y = %d, GLint z = %d, GLint w = %d)",
7993 index, x, y, z, w);
7994
7995 try
7996 {
7997 gl::Context *context = gl::getNonLostContext();
7998
7999 if (context)
8000 {
8001 if (context->getClientVersion() < 3)
8002 {
8003 return gl::error(GL_INVALID_OPERATION);
8004 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008005
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00008006 if (index >= gl::MAX_VERTEX_ATTRIBS)
8007 {
8008 return gl::error(GL_INVALID_VALUE);
8009 }
8010
8011 GLint vals[4] = { x, y, z, w };
8012 context->setVertexAttribi(index, vals);
8013 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008014 }
8015 catch(std::bad_alloc&)
8016 {
8017 return gl::error(GL_OUT_OF_MEMORY);
8018 }
8019}
8020
8021void __stdcall glVertexAttribI4ui(GLuint index, GLuint x, GLuint y, GLuint z, GLuint w)
8022{
8023 EVENT("(GLuint index = %u, GLuint x = %u, GLuint y = %u, GLuint z = %u, GLuint w = %u)",
8024 index, x, y, z, w);
8025
8026 try
8027 {
8028 gl::Context *context = gl::getNonLostContext();
8029
8030 if (context)
8031 {
8032 if (context->getClientVersion() < 3)
8033 {
8034 return gl::error(GL_INVALID_OPERATION);
8035 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008036
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00008037 if (index >= gl::MAX_VERTEX_ATTRIBS)
8038 {
8039 return gl::error(GL_INVALID_VALUE);
8040 }
8041
8042 GLuint vals[4] = { x, y, z, w };
8043 context->setVertexAttribu(index, vals);
8044 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008045 }
8046 catch(std::bad_alloc&)
8047 {
8048 return gl::error(GL_OUT_OF_MEMORY);
8049 }
8050}
8051
8052void __stdcall glVertexAttribI4iv(GLuint index, const GLint* v)
8053{
8054 EVENT("(GLuint index = %u, const GLint* v = 0x%0.8p)", index, v);
8055
8056 try
8057 {
8058 gl::Context *context = gl::getNonLostContext();
8059
8060 if (context)
8061 {
8062 if (context->getClientVersion() < 3)
8063 {
8064 return gl::error(GL_INVALID_OPERATION);
8065 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008066
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00008067 if (index >= gl::MAX_VERTEX_ATTRIBS)
8068 {
8069 return gl::error(GL_INVALID_VALUE);
8070 }
8071
8072 context->setVertexAttribi(index, v);
8073 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008074 }
8075 catch(std::bad_alloc&)
8076 {
8077 return gl::error(GL_OUT_OF_MEMORY);
8078 }
8079}
8080
8081void __stdcall glVertexAttribI4uiv(GLuint index, const GLuint* v)
8082{
8083 EVENT("(GLuint index = %u, const GLuint* v = 0x%0.8p)", index, v);
8084
8085 try
8086 {
8087 gl::Context *context = gl::getNonLostContext();
8088
8089 if (context)
8090 {
8091 if (context->getClientVersion() < 3)
8092 {
8093 return gl::error(GL_INVALID_OPERATION);
8094 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008095
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00008096 if (index >= gl::MAX_VERTEX_ATTRIBS)
8097 {
8098 return gl::error(GL_INVALID_VALUE);
8099 }
8100
8101 context->setVertexAttribu(index, v);
8102 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008103 }
8104 catch(std::bad_alloc&)
8105 {
8106 return gl::error(GL_OUT_OF_MEMORY);
8107 }
8108}
8109
8110void __stdcall glGetUniformuiv(GLuint program, GLint location, GLuint* params)
8111{
8112 EVENT("(GLuint program = %u, GLint location = %d, GLuint* params = 0x%0.8p)",
8113 program, location, params);
8114
8115 try
8116 {
8117 gl::Context *context = gl::getNonLostContext();
8118
8119 if (context)
8120 {
8121 if (context->getClientVersion() < 3)
8122 {
8123 return gl::error(GL_INVALID_OPERATION);
8124 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008125
shannon.woods%transgaming.com@gtempaccount.come2290122013-04-13 03:41:07 +00008126 if (program == 0)
8127 {
8128 return gl::error(GL_INVALID_VALUE);
8129 }
8130
8131 gl::Program *programObject = context->getProgram(program);
8132
8133 if (!programObject || !programObject->isLinked())
8134 {
8135 return gl::error(GL_INVALID_OPERATION);
8136 }
8137
8138 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
8139 if (!programBinary)
8140 {
8141 return gl::error(GL_INVALID_OPERATION);
8142 }
8143
8144 if (!programBinary->getUniformuiv(location, NULL, params))
8145 {
8146 return gl::error(GL_INVALID_OPERATION);
8147 }
8148 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008149 }
8150 catch(std::bad_alloc&)
8151 {
8152 return gl::error(GL_OUT_OF_MEMORY);
8153 }
8154}
8155
8156GLint __stdcall glGetFragDataLocation(GLuint program, const GLchar *name)
8157{
8158 EVENT("(GLuint program = %u, const GLchar *name = 0x%0.8p)",
8159 program, name);
8160
8161 try
8162 {
8163 gl::Context *context = gl::getNonLostContext();
8164
8165 if (context)
8166 {
8167 if (context->getClientVersion() < 3)
8168 {
Jamie Madilld1e78c92013-06-20 11:55:50 -04008169 return gl::error(GL_INVALID_OPERATION, -1);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008170 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008171
Jamie Madilld1e78c92013-06-20 11:55:50 -04008172 if (program == 0)
8173 {
8174 return gl::error(GL_INVALID_VALUE, -1);
8175 }
8176
8177 gl::Program *programObject = context->getProgram(program);
8178
8179 if (!programObject || !programObject->isLinked())
8180 {
8181 return gl::error(GL_INVALID_OPERATION, -1);
8182 }
8183
8184 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
8185 if (!programBinary)
8186 {
8187 return gl::error(GL_INVALID_OPERATION, -1);
8188 }
8189
8190 return programBinary->getFragDataLocation(name);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008191 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008192 }
8193 catch(std::bad_alloc&)
8194 {
8195 return gl::error(GL_OUT_OF_MEMORY, 0);
8196 }
8197
8198 return 0;
8199}
8200
8201void __stdcall glUniform1ui(GLint location, GLuint v0)
8202{
shannon.woods%transgaming.com@gtempaccount.com8431b9c2013-04-13 03:40:17 +00008203 glUniform1uiv(location, 1, &v0);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008204}
8205
8206void __stdcall glUniform2ui(GLint location, GLuint v0, GLuint v1)
8207{
shannon.woods%transgaming.com@gtempaccount.com8431b9c2013-04-13 03:40:17 +00008208 const GLuint xy[] = { v0, v1 };
8209 glUniform2uiv(location, 1, xy);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008210}
8211
8212void __stdcall glUniform3ui(GLint location, GLuint v0, GLuint v1, GLuint v2)
8213{
shannon.woods%transgaming.com@gtempaccount.com8431b9c2013-04-13 03:40:17 +00008214 const GLuint xyz[] = { v0, v1, v2 };
8215 glUniform3uiv(location, 1, xyz);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008216}
8217
8218void __stdcall glUniform4ui(GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3)
8219{
shannon.woods%transgaming.com@gtempaccount.com8431b9c2013-04-13 03:40:17 +00008220 const GLuint xyzw[] = { v0, v1, v2, v3 };
8221 glUniform4uiv(location, 1, xyzw);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008222}
8223
8224void __stdcall glUniform1uiv(GLint location, GLsizei count, const GLuint* value)
8225{
8226 EVENT("(GLint location = %d, GLsizei count = %d, const GLuint* value = 0x%0.8p)",
8227 location, count, value);
8228
8229 try
8230 {
8231 gl::Context *context = gl::getNonLostContext();
8232
8233 if (context)
8234 {
8235 if (context->getClientVersion() < 3)
8236 {
8237 return gl::error(GL_INVALID_OPERATION);
8238 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008239
shannon.woods%transgaming.com@gtempaccount.com50ea4ab2013-04-13 03:40:36 +00008240 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
8241 if (!programBinary)
8242 {
8243 return gl::error(GL_INVALID_OPERATION);
8244 }
8245
8246 if (!programBinary->setUniform1uiv(location, count, value))
8247 {
8248 return gl::error(GL_INVALID_OPERATION);
8249 }
8250 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008251 }
8252 catch(std::bad_alloc&)
8253 {
8254 return gl::error(GL_OUT_OF_MEMORY);
8255 }
8256}
8257
8258void __stdcall glUniform2uiv(GLint location, GLsizei count, const GLuint* value)
8259{
8260 EVENT("(GLint location = %d, GLsizei count = %d, const GLuint* value = 0x%0.8p)",
8261 location, count, value);
8262
8263 try
8264 {
8265 gl::Context *context = gl::getNonLostContext();
8266
8267 if (context)
8268 {
8269 if (context->getClientVersion() < 3)
8270 {
8271 return gl::error(GL_INVALID_OPERATION);
8272 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008273
shannon.woods%transgaming.com@gtempaccount.com50ea4ab2013-04-13 03:40:36 +00008274 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
8275 if (!programBinary)
8276 {
8277 return gl::error(GL_INVALID_OPERATION);
8278 }
8279
8280 if (!programBinary->setUniform2uiv(location, count, value))
8281 {
8282 return gl::error(GL_INVALID_OPERATION);
8283 }
8284 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008285 }
8286 catch(std::bad_alloc&)
8287 {
8288 return gl::error(GL_OUT_OF_MEMORY);
8289 }
8290}
8291
8292void __stdcall glUniform3uiv(GLint location, GLsizei count, const GLuint* value)
8293{
8294 EVENT("(GLint location = %d, GLsizei count = %d, const GLuint* value)",
8295 location, count, value);
8296
8297 try
8298 {
8299 gl::Context *context = gl::getNonLostContext();
8300
8301 if (context)
8302 {
8303 if (context->getClientVersion() < 3)
8304 {
8305 return gl::error(GL_INVALID_OPERATION);
8306 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008307
shannon.woods%transgaming.com@gtempaccount.com50ea4ab2013-04-13 03:40:36 +00008308 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
8309 if (!programBinary)
8310 {
8311 return gl::error(GL_INVALID_OPERATION);
8312 }
8313
8314 if (!programBinary->setUniform3uiv(location, count, value))
8315 {
8316 return gl::error(GL_INVALID_OPERATION);
8317 }
8318 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008319 }
8320 catch(std::bad_alloc&)
8321 {
8322 return gl::error(GL_OUT_OF_MEMORY);
8323 }
8324}
8325
8326void __stdcall glUniform4uiv(GLint location, GLsizei count, const GLuint* value)
8327{
8328 EVENT("(GLint location = %d, GLsizei count = %d, const GLuint* value = 0x%0.8p)",
8329 location, count, value);
8330
8331 try
8332 {
8333 gl::Context *context = gl::getNonLostContext();
8334
8335 if (context)
8336 {
8337 if (context->getClientVersion() < 3)
8338 {
8339 return gl::error(GL_INVALID_OPERATION);
8340 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008341
shannon.woods%transgaming.com@gtempaccount.com50ea4ab2013-04-13 03:40:36 +00008342 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
8343 if (!programBinary)
8344 {
8345 return gl::error(GL_INVALID_OPERATION);
8346 }
8347
8348 if (!programBinary->setUniform4uiv(location, count, value))
8349 {
8350 return gl::error(GL_INVALID_OPERATION);
8351 }
8352 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008353 }
8354 catch(std::bad_alloc&)
8355 {
8356 return gl::error(GL_OUT_OF_MEMORY);
8357 }
8358}
8359
8360void __stdcall glClearBufferiv(GLenum buffer, GLint drawbuffer, const GLint* value)
8361{
8362 EVENT("(GLenum buffer = 0x%X, GLint drawbuffer = %d, const GLint* value = 0x%0.8p)",
8363 buffer, drawbuffer, value);
8364
8365 try
8366 {
8367 gl::Context *context = gl::getNonLostContext();
8368
8369 if (context)
8370 {
8371 if (context->getClientVersion() < 3)
8372 {
8373 return gl::error(GL_INVALID_OPERATION);
8374 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008375
Geoff Lang42359ca2013-08-21 13:25:17 -04008376 switch (buffer)
8377 {
8378 case GL_COLOR:
8379 if (drawbuffer < 0 || drawbuffer >= static_cast<GLint>(context->getMaximumRenderTargets()))
8380 {
8381 return gl::error(GL_INVALID_VALUE);
8382 }
8383 break;
8384 case GL_STENCIL:
8385 if (drawbuffer != 0)
8386 {
8387 return gl::error(GL_INVALID_VALUE);
8388 }
8389 default:
8390 return gl::error(GL_INVALID_ENUM);
8391 }
8392
8393 context->clearBufferiv(buffer, drawbuffer, value);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008394 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008395 }
8396 catch(std::bad_alloc&)
8397 {
8398 return gl::error(GL_OUT_OF_MEMORY);
8399 }
8400}
8401
8402void __stdcall glClearBufferuiv(GLenum buffer, GLint drawbuffer, const GLuint* value)
8403{
8404 EVENT("(GLenum buffer = 0x%X, GLint drawbuffer = %d, const GLuint* value = 0x%0.8p)",
8405 buffer, drawbuffer, value);
8406
8407 try
8408 {
8409 gl::Context *context = gl::getNonLostContext();
8410
8411 if (context)
8412 {
8413 if (context->getClientVersion() < 3)
8414 {
8415 return gl::error(GL_INVALID_OPERATION);
8416 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008417
Geoff Lang42359ca2013-08-21 13:25:17 -04008418 switch (buffer)
8419 {
8420 case GL_COLOR:
8421 if (drawbuffer < 0 || drawbuffer >= static_cast<GLint>(context->getMaximumRenderTargets()))
8422 {
8423 return gl::error(GL_INVALID_VALUE);
8424 }
8425 break;
8426 default:
8427 return gl::error(GL_INVALID_ENUM);
8428 }
8429
8430 context->clearBufferuiv(buffer, drawbuffer, value);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008431 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008432 }
8433 catch(std::bad_alloc&)
8434 {
8435 return gl::error(GL_OUT_OF_MEMORY);
8436 }
8437}
8438
8439void __stdcall glClearBufferfv(GLenum buffer, GLint drawbuffer, const GLfloat* value)
8440{
8441 EVENT("(GLenum buffer = 0x%X, GLint drawbuffer = %d, const GLfloat* value = 0x%0.8p)",
8442 buffer, drawbuffer, value);
8443
8444 try
8445 {
8446 gl::Context *context = gl::getNonLostContext();
8447
8448 if (context)
8449 {
8450 if (context->getClientVersion() < 3)
8451 {
8452 return gl::error(GL_INVALID_OPERATION);
8453 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008454
Geoff Lang42359ca2013-08-21 13:25:17 -04008455 switch (buffer)
8456 {
8457 case GL_COLOR:
8458 if (drawbuffer < 0 || drawbuffer >= static_cast<GLint>(context->getMaximumRenderTargets()))
8459 {
8460 return gl::error(GL_INVALID_VALUE);
8461 }
8462 break;
8463 case GL_DEPTH:
8464 if (drawbuffer != 0)
8465 {
8466 return gl::error(GL_INVALID_VALUE);
8467 }
8468 break;
8469 default:
8470 return gl::error(GL_INVALID_ENUM);
8471 }
8472
8473 context->clearBufferfv(buffer, drawbuffer, value);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008474 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008475 }
8476 catch(std::bad_alloc&)
8477 {
8478 return gl::error(GL_OUT_OF_MEMORY);
8479 }
8480}
8481
8482void __stdcall glClearBufferfi(GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil)
8483{
8484 EVENT("(GLenum buffer = 0x%X, GLint drawbuffer = %d, GLfloat depth, GLint stencil = %d)",
8485 buffer, drawbuffer, depth, stencil);
8486
8487 try
8488 {
8489 gl::Context *context = gl::getNonLostContext();
8490
8491 if (context)
8492 {
8493 if (context->getClientVersion() < 3)
8494 {
8495 return gl::error(GL_INVALID_OPERATION);
8496 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008497
Geoff Lang42359ca2013-08-21 13:25:17 -04008498 switch (buffer)
8499 {
8500 case GL_DEPTH_STENCIL:
8501 if (drawbuffer != 0)
8502 {
8503 return gl::error(GL_INVALID_VALUE);
8504 }
8505 break;
8506 default:
8507 return gl::error(GL_INVALID_ENUM);
8508 }
8509
8510 context->clearBufferfi(buffer, drawbuffer, depth, stencil);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008511 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008512 }
8513 catch(std::bad_alloc&)
8514 {
8515 return gl::error(GL_OUT_OF_MEMORY);
8516 }
8517}
8518
8519const GLubyte* __stdcall glGetStringi(GLenum name, GLuint index)
8520{
8521 EVENT("(GLenum name = 0x%X, GLuint index = %u)", name, index);
8522
8523 try
8524 {
8525 gl::Context *context = gl::getNonLostContext();
8526
8527 if (context)
8528 {
8529 if (context->getClientVersion() < 3)
8530 {
8531 return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLubyte*>(NULL));
8532 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008533
shannonwoods@chromium.org302df742013-05-30 00:05:54 +00008534 if (name != GL_EXTENSIONS)
8535 {
8536 return gl::error(GL_INVALID_ENUM, reinterpret_cast<GLubyte*>(NULL));
8537 }
8538
8539 if (index >= context->getNumExtensions())
8540 {
8541 return gl::error(GL_INVALID_VALUE, reinterpret_cast<GLubyte*>(NULL));
8542 }
8543
8544 return reinterpret_cast<const GLubyte*>(context->getExtensionString(index));
8545 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008546 }
8547 catch(std::bad_alloc&)
8548 {
8549 return gl::error(GL_OUT_OF_MEMORY, reinterpret_cast<GLubyte*>(NULL));
8550 }
8551
8552 return NULL;
8553}
8554
8555void __stdcall glCopyBufferSubData(GLenum readTarget, GLenum writeTarget, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size)
8556{
8557 EVENT("(GLenum readTarget = 0x%X, GLenum writeTarget = 0x%X, GLintptr readOffset = %d, GLintptr writeOffset = %d, GLsizeiptr size = %d)",
8558 readTarget, writeTarget, readOffset, writeOffset, size);
8559
8560 try
8561 {
8562 gl::Context *context = gl::getNonLostContext();
8563
8564 if (context)
8565 {
8566 if (context->getClientVersion() < 3)
8567 {
8568 return gl::error(GL_INVALID_OPERATION);
8569 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008570
shannon.woods%transgaming.com@gtempaccount.com296c3f22013-04-13 03:39:39 +00008571 gl::Buffer *readBuffer = NULL;
8572 switch (readTarget)
8573 {
8574 case GL_ARRAY_BUFFER:
8575 readBuffer = context->getArrayBuffer();
8576 break;
8577 case GL_COPY_READ_BUFFER:
8578 readBuffer = context->getCopyReadBuffer();
8579 break;
8580 case GL_COPY_WRITE_BUFFER:
8581 readBuffer = context->getCopyWriteBuffer();
8582 break;
8583 case GL_ELEMENT_ARRAY_BUFFER:
8584 readBuffer = context->getElementArrayBuffer();
8585 break;
8586 case GL_PIXEL_PACK_BUFFER:
8587 readBuffer = context->getPixelPackBuffer();
8588 break;
8589 case GL_PIXEL_UNPACK_BUFFER:
8590 readBuffer = context->getPixelUnpackBuffer();
8591 break;
8592 case GL_TRANSFORM_FEEDBACK_BUFFER:
8593 readBuffer = context->getGenericTransformFeedbackBuffer();
8594 break;
8595 case GL_UNIFORM_BUFFER:
8596 readBuffer = context->getGenericUniformBuffer();
8597 break;
8598 default:
8599 return gl::error(GL_INVALID_ENUM);
8600 }
8601
8602 gl::Buffer *writeBuffer = NULL;
8603 switch (writeTarget)
8604 {
8605 case GL_ARRAY_BUFFER:
8606 writeBuffer = context->getArrayBuffer();
8607 break;
8608 case GL_COPY_READ_BUFFER:
8609 writeBuffer = context->getCopyReadBuffer();
8610 break;
8611 case GL_COPY_WRITE_BUFFER:
8612 writeBuffer = context->getCopyWriteBuffer();
8613 break;
8614 case GL_ELEMENT_ARRAY_BUFFER:
8615 writeBuffer = context->getElementArrayBuffer();
8616 break;
8617 case GL_PIXEL_PACK_BUFFER:
8618 writeBuffer = context->getPixelPackBuffer();
8619 break;
8620 case GL_PIXEL_UNPACK_BUFFER:
8621 writeBuffer = context->getPixelUnpackBuffer();
8622 break;
8623 case GL_TRANSFORM_FEEDBACK_BUFFER:
8624 writeBuffer = context->getGenericTransformFeedbackBuffer();
8625 break;
8626 case GL_UNIFORM_BUFFER:
8627 writeBuffer = context->getGenericUniformBuffer();
8628 break;
8629 default:
8630 return gl::error(GL_INVALID_ENUM);
8631 }
8632
8633 if (!readBuffer || !writeBuffer)
8634 {
8635 return gl::error(GL_INVALID_OPERATION);
8636 }
8637
8638 if (readOffset < 0 || writeOffset < 0 || size < 0 ||
8639 static_cast<unsigned int>(readOffset + size) > readBuffer->size() ||
8640 static_cast<unsigned int>(writeOffset + size) > writeBuffer->size())
8641 {
8642 return gl::error(GL_INVALID_VALUE);
8643 }
8644
8645 if (readBuffer == writeBuffer && abs(readOffset - writeOffset) < size)
8646 {
8647 return gl::error(GL_INVALID_VALUE);
8648 }
8649
8650 // TODO: Verify that readBuffer and writeBuffer are not currently mapped (GL_INVALID_OPERATION)
8651
shannon.woods%transgaming.com@gtempaccount.comc53376a2013-04-13 03:41:23 +00008652 // if size is zero, the copy is a successful no-op
8653 if (size > 0)
8654 {
8655 writeBuffer->copyBufferSubData(readBuffer, readOffset, writeOffset, size);
8656 }
shannon.woods%transgaming.com@gtempaccount.com296c3f22013-04-13 03:39:39 +00008657 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008658 }
8659 catch(std::bad_alloc&)
8660 {
8661 return gl::error(GL_OUT_OF_MEMORY);
8662 }
8663}
8664
8665void __stdcall glGetUniformIndices(GLuint program, GLsizei uniformCount, const GLchar* const* uniformNames, GLuint* uniformIndices)
8666{
8667 EVENT("(GLuint program = %u, GLsizei uniformCount = %d, const GLchar* const* uniformNames = 0x%0.8p, GLuint* uniformIndices = 0x%0.8p)",
8668 program, uniformCount, uniformNames, uniformIndices);
8669
8670 try
8671 {
8672 gl::Context *context = gl::getNonLostContext();
8673
8674 if (context)
8675 {
8676 if (context->getClientVersion() < 3)
8677 {
8678 return gl::error(GL_INVALID_OPERATION);
8679 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008680
shannonwoods@chromium.orgc2ed9912013-05-30 00:05:33 +00008681 if (uniformCount < 0)
8682 {
8683 return gl::error(GL_INVALID_VALUE);
8684 }
8685
8686 gl::Program *programObject = context->getProgram(program);
8687
8688 if (!programObject)
8689 {
8690 if (context->getShader(program))
8691 {
8692 return gl::error(GL_INVALID_OPERATION);
8693 }
8694 else
8695 {
8696 return gl::error(GL_INVALID_VALUE);
8697 }
8698 }
8699
8700 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
8701 if (!programObject->isLinked() || !programBinary)
8702 {
8703 for (int uniformId = 0; uniformId < uniformCount; uniformId++)
8704 {
8705 uniformIndices[uniformId] = GL_INVALID_INDEX;
8706 }
8707 }
8708 else
8709 {
8710 for (int uniformId = 0; uniformId < uniformCount; uniformId++)
8711 {
8712 uniformIndices[uniformId] = programBinary->getUniformIndex(uniformNames[uniformId]);
8713 }
8714 }
8715 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008716 }
8717 catch(std::bad_alloc&)
8718 {
8719 return gl::error(GL_OUT_OF_MEMORY);
8720 }
8721}
8722
8723void __stdcall glGetActiveUniformsiv(GLuint program, GLsizei uniformCount, const GLuint* uniformIndices, GLenum pname, GLint* params)
8724{
8725 EVENT("(GLuint program = %u, GLsizei uniformCount = %d, const GLuint* uniformIndices = 0x%0.8p, GLenum pname = 0x%X, GLint* params = 0x%0.8p)",
8726 program, uniformCount, uniformIndices, pname, params);
8727
8728 try
8729 {
8730 gl::Context *context = gl::getNonLostContext();
8731
8732 if (context)
8733 {
8734 if (context->getClientVersion() < 3)
8735 {
8736 return gl::error(GL_INVALID_OPERATION);
8737 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008738
shannonwoods@chromium.org2a9a9d22013-05-30 00:05:40 +00008739 if (uniformCount < 0)
8740 {
8741 return gl::error(GL_INVALID_VALUE);
8742 }
8743
8744 gl::Program *programObject = context->getProgram(program);
8745
8746 if (!programObject)
8747 {
8748 if (context->getShader(program))
8749 {
8750 return gl::error(GL_INVALID_OPERATION);
8751 }
8752 else
8753 {
8754 return gl::error(GL_INVALID_VALUE);
8755 }
8756 }
8757
8758 switch (pname)
8759 {
8760 case GL_UNIFORM_TYPE:
8761 case GL_UNIFORM_SIZE:
8762 case GL_UNIFORM_NAME_LENGTH:
8763 case GL_UNIFORM_BLOCK_INDEX:
8764 case GL_UNIFORM_OFFSET:
8765 case GL_UNIFORM_ARRAY_STRIDE:
8766 case GL_UNIFORM_MATRIX_STRIDE:
8767 case GL_UNIFORM_IS_ROW_MAJOR:
8768 break;
8769 default:
8770 return gl::error(GL_INVALID_ENUM);
8771 }
8772
8773 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
8774
8775 if (!programBinary && uniformCount > 0)
8776 {
8777 return gl::error(GL_INVALID_VALUE);
8778 }
8779
8780 for (int uniformId = 0; uniformId < uniformCount; uniformId++)
8781 {
8782 const GLuint index = uniformIndices[uniformId];
8783
8784 if (index >= (GLuint)programBinary->getActiveUniformCount())
8785 {
8786 return gl::error(GL_INVALID_VALUE);
8787 }
8788 }
8789
8790 for (int uniformId = 0; uniformId < uniformCount; uniformId++)
8791 {
8792 const GLuint index = uniformIndices[uniformId];
8793 params[uniformId] = programBinary->getActiveUniformi(index, pname);
8794 }
8795 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008796 }
8797 catch(std::bad_alloc&)
8798 {
8799 return gl::error(GL_OUT_OF_MEMORY);
8800 }
8801}
8802
8803GLuint __stdcall glGetUniformBlockIndex(GLuint program, const GLchar* uniformBlockName)
8804{
8805 EVENT("(GLuint program = %u, const GLchar* uniformBlockName = 0x%0.8p)", program, uniformBlockName);
8806
8807 try
8808 {
8809 gl::Context *context = gl::getNonLostContext();
8810
8811 if (context)
8812 {
8813 if (context->getClientVersion() < 3)
8814 {
shannonwoods@chromium.org42766252013-05-30 00:07:12 +00008815 return gl::error(GL_INVALID_OPERATION, GL_INVALID_INDEX);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008816 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008817
shannonwoods@chromium.org42766252013-05-30 00:07:12 +00008818 gl::Program *programObject = context->getProgram(program);
8819
8820 if (!programObject)
8821 {
8822 if (context->getShader(program))
8823 {
8824 return gl::error(GL_INVALID_OPERATION, GL_INVALID_INDEX);
8825 }
8826 else
8827 {
8828 return gl::error(GL_INVALID_VALUE, GL_INVALID_INDEX);
8829 }
8830 }
8831
8832 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
8833 if (!programBinary)
8834 {
8835 return GL_INVALID_INDEX;
8836 }
8837
8838 return programBinary->getUniformBlockIndex(uniformBlockName);
8839 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008840 }
8841 catch(std::bad_alloc&)
8842 {
8843 return gl::error(GL_OUT_OF_MEMORY, 0);
8844 }
8845
8846 return 0;
8847}
8848
8849void __stdcall glGetActiveUniformBlockiv(GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint* params)
8850{
8851 EVENT("(GLuint program = %u, GLuint uniformBlockIndex = %u, GLenum pname = 0x%X, GLint* params = 0x%0.8p)",
8852 program, uniformBlockIndex, pname, params);
8853
8854 try
8855 {
8856 gl::Context *context = gl::getNonLostContext();
8857
8858 if (context)
8859 {
8860 if (context->getClientVersion() < 3)
8861 {
8862 return gl::error(GL_INVALID_OPERATION);
8863 }
shannonwoods@chromium.orge7317ca2013-05-30 00:07:35 +00008864 gl::Program *programObject = context->getProgram(program);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008865
shannonwoods@chromium.orge7317ca2013-05-30 00:07:35 +00008866 if (!programObject)
8867 {
8868 if (context->getShader(program))
8869 {
8870 return gl::error(GL_INVALID_OPERATION);
8871 }
8872 else
8873 {
8874 return gl::error(GL_INVALID_VALUE);
8875 }
8876 }
8877
8878 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
8879
8880 if (!programBinary || uniformBlockIndex >= programBinary->getActiveUniformBlockCount())
8881 {
8882 return gl::error(GL_INVALID_VALUE);
8883 }
8884
8885 switch (pname)
8886 {
8887 case GL_UNIFORM_BLOCK_BINDING:
8888 *params = static_cast<GLint>(programObject->getUniformBlockBinding(uniformBlockIndex));
8889 break;
8890
8891 case GL_UNIFORM_BLOCK_DATA_SIZE:
8892 case GL_UNIFORM_BLOCK_NAME_LENGTH:
8893 case GL_UNIFORM_BLOCK_ACTIVE_UNIFORMS:
8894 case GL_UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES:
8895 case GL_UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER:
8896 case GL_UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER:
8897 programBinary->getActiveUniformBlockiv(uniformBlockIndex, pname, params);
8898 break;
8899
8900 default:
8901 return gl::error(GL_INVALID_ENUM);
8902 }
8903 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008904 }
8905 catch(std::bad_alloc&)
8906 {
8907 return gl::error(GL_OUT_OF_MEMORY);
8908 }
8909}
8910
8911void __stdcall glGetActiveUniformBlockName(GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei* length, GLchar* uniformBlockName)
8912{
8913 EVENT("(GLuint program = %u, GLuint uniformBlockIndex = %u, GLsizei bufSize = %d, GLsizei* length = 0x%0.8p, GLchar* uniformBlockName = 0x%0.8p)",
8914 program, uniformBlockIndex, bufSize, length, uniformBlockName);
8915
8916 try
8917 {
8918 gl::Context *context = gl::getNonLostContext();
8919
8920 if (context)
8921 {
8922 if (context->getClientVersion() < 3)
8923 {
8924 return gl::error(GL_INVALID_OPERATION);
8925 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008926
shannonwoods@chromium.orgbeb02782013-05-30 00:07:28 +00008927 gl::Program *programObject = context->getProgram(program);
8928
8929 if (!programObject)
8930 {
8931 if (context->getShader(program))
8932 {
8933 return gl::error(GL_INVALID_OPERATION);
8934 }
8935 else
8936 {
8937 return gl::error(GL_INVALID_VALUE);
8938 }
8939 }
8940
8941 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
8942
8943 if (!programBinary || uniformBlockIndex >= programBinary->getActiveUniformBlockCount())
8944 {
8945 return gl::error(GL_INVALID_VALUE);
8946 }
8947
8948 programBinary->getActiveUniformBlockName(uniformBlockIndex, bufSize, length, uniformBlockName);
8949 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008950 }
8951 catch(std::bad_alloc&)
8952 {
8953 return gl::error(GL_OUT_OF_MEMORY);
8954 }
8955}
8956
8957void __stdcall glUniformBlockBinding(GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding)
8958{
8959 EVENT("(GLuint program = %u, GLuint uniformBlockIndex = %u, GLuint uniformBlockBinding = %u)",
8960 program, uniformBlockIndex, uniformBlockBinding);
8961
8962 try
8963 {
8964 gl::Context *context = gl::getNonLostContext();
8965
8966 if (context)
8967 {
8968 if (context->getClientVersion() < 3)
8969 {
8970 return gl::error(GL_INVALID_OPERATION);
8971 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008972
shannonwoods@chromium.org70eb1ea2013-05-30 00:07:20 +00008973 if (uniformBlockBinding >= context->getMaximumCombinedUniformBufferBindings())
8974 {
8975 return gl::error(GL_INVALID_VALUE);
8976 }
8977
8978 gl::Program *programObject = context->getProgram(program);
8979
8980 if (!programObject)
8981 {
8982 if (context->getShader(program))
8983 {
8984 return gl::error(GL_INVALID_OPERATION);
8985 }
8986 else
8987 {
8988 return gl::error(GL_INVALID_VALUE);
8989 }
8990 }
8991
8992 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
8993
8994 // if never linked, there won't be any uniform blocks
8995 if (!programBinary || uniformBlockIndex >= programBinary->getActiveUniformBlockCount())
8996 {
8997 return gl::error(GL_INVALID_VALUE);
8998 }
8999
9000 programObject->bindUniformBlock(uniformBlockIndex, uniformBlockBinding);
9001 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009002 }
9003 catch(std::bad_alloc&)
9004 {
9005 return gl::error(GL_OUT_OF_MEMORY);
9006 }
9007}
9008
9009void __stdcall glDrawArraysInstanced(GLenum mode, GLint first, GLsizei count, GLsizei instanceCount)
9010{
9011 EVENT("(GLenum mode = 0x%X, GLint first = %d, GLsizei count = %d, GLsizei instanceCount = %d)",
9012 mode, first, count, instanceCount);
9013
9014 try
9015 {
9016 gl::Context *context = gl::getNonLostContext();
9017
9018 if (context)
9019 {
9020 if (context->getClientVersion() < 3)
9021 {
9022 return gl::error(GL_INVALID_OPERATION);
9023 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009024
Jamie Madill54133512013-06-21 09:33:07 -04009025 // glDrawArraysInstanced
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009026 UNIMPLEMENTED();
9027 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009028 }
9029 catch(std::bad_alloc&)
9030 {
9031 return gl::error(GL_OUT_OF_MEMORY);
9032 }
9033}
9034
9035void __stdcall glDrawElementsInstanced(GLenum mode, GLsizei count, GLenum type, const GLvoid* indices, GLsizei instanceCount)
9036{
9037 EVENT("(GLenum mode = 0x%X, GLsizei count = %d, GLenum type = 0x%X, const GLvoid* indices = 0x%0.8p, GLsizei instanceCount = %d)",
9038 mode, count, type, indices, instanceCount);
9039
9040 try
9041 {
9042 gl::Context *context = gl::getNonLostContext();
9043
9044 if (context)
9045 {
9046 if (context->getClientVersion() < 3)
9047 {
9048 return gl::error(GL_INVALID_OPERATION);
9049 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009050
Jamie Madill54133512013-06-21 09:33:07 -04009051 // glDrawElementsInstanced
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009052 UNIMPLEMENTED();
9053 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009054 }
9055 catch(std::bad_alloc&)
9056 {
9057 return gl::error(GL_OUT_OF_MEMORY);
9058 }
9059}
9060
9061GLsync __stdcall glFenceSync(GLenum condition, GLbitfield flags)
9062{
9063 EVENT("(GLenum condition = 0x%X, GLbitfield flags = 0x%X)", condition, flags);
9064
9065 try
9066 {
9067 gl::Context *context = gl::getNonLostContext();
9068
9069 if (context)
9070 {
9071 if (context->getClientVersion() < 3)
9072 {
Jamie Madill5215e1a2013-07-26 11:55:19 -04009073 return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLsync>(0));
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009074 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009075
Jamie Madill5215e1a2013-07-26 11:55:19 -04009076 if (condition != GL_SYNC_GPU_COMMANDS_COMPLETE)
9077 {
9078 return gl::error(GL_INVALID_ENUM, reinterpret_cast<GLsync>(0));
9079 }
9080
9081 if (flags != 0)
9082 {
9083 return gl::error(GL_INVALID_VALUE, reinterpret_cast<GLsync>(0));
9084 }
9085
9086 return context->createFenceSync(condition);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009087 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009088 }
9089 catch(std::bad_alloc&)
9090 {
9091 return gl::error(GL_OUT_OF_MEMORY, reinterpret_cast<GLsync>(NULL));
9092 }
9093
9094 return NULL;
9095}
9096
9097GLboolean __stdcall glIsSync(GLsync sync)
9098{
9099 EVENT("(GLsync sync = 0x%0.8p)", sync);
9100
9101 try
9102 {
9103 gl::Context *context = gl::getNonLostContext();
9104
9105 if (context)
9106 {
9107 if (context->getClientVersion() < 3)
9108 {
9109 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
9110 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009111
Jamie Madill5215e1a2013-07-26 11:55:19 -04009112 return (context->getFenceSync(sync) != NULL);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009113 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009114 }
9115 catch(std::bad_alloc&)
9116 {
9117 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
9118 }
9119
9120 return GL_FALSE;
9121}
9122
9123void __stdcall glDeleteSync(GLsync sync)
9124{
9125 EVENT("(GLsync sync = 0x%0.8p)", sync);
9126
9127 try
9128 {
9129 gl::Context *context = gl::getNonLostContext();
9130
9131 if (context)
9132 {
9133 if (context->getClientVersion() < 3)
9134 {
9135 return gl::error(GL_INVALID_OPERATION);
9136 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009137
Jamie Madill5215e1a2013-07-26 11:55:19 -04009138 if (sync != static_cast<GLsync>(0) && !context->getFenceSync(sync))
9139 {
9140 return gl::error(GL_INVALID_VALUE);
9141 }
9142
9143 context->deleteFenceSync(sync);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009144 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009145 }
9146 catch(std::bad_alloc&)
9147 {
9148 return gl::error(GL_OUT_OF_MEMORY);
9149 }
9150}
9151
9152GLenum __stdcall glClientWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout)
9153{
9154 EVENT("(GLsync sync = 0x%0.8p, GLbitfield flags = 0x%X, GLuint64 timeout = %llu)",
9155 sync, flags, timeout);
9156
9157 try
9158 {
9159 gl::Context *context = gl::getNonLostContext();
9160
9161 if (context)
9162 {
9163 if (context->getClientVersion() < 3)
9164 {
Jamie Madill5215e1a2013-07-26 11:55:19 -04009165 return gl::error(GL_INVALID_OPERATION, GL_WAIT_FAILED);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009166 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009167
Jamie Madill5215e1a2013-07-26 11:55:19 -04009168 if ((flags & ~(GL_SYNC_FLUSH_COMMANDS_BIT)) != 0)
9169 {
9170 return gl::error(GL_INVALID_VALUE, GL_WAIT_FAILED);
9171 }
9172
9173 gl::FenceSync *fenceSync = context->getFenceSync(sync);
9174
9175 if (!fenceSync)
9176 {
9177 return gl::error(GL_INVALID_VALUE, GL_WAIT_FAILED);
9178 }
9179
9180 return fenceSync->clientWait(flags, timeout);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009181 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009182 }
9183 catch(std::bad_alloc&)
9184 {
9185 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
9186 }
9187
9188 return GL_FALSE;
9189}
9190
9191void __stdcall glWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout)
9192{
9193 EVENT("(GLsync sync = 0x%0.8p, GLbitfield flags = 0x%X, GLuint64 timeout = %llu)",
9194 sync, flags, timeout);
9195
9196 try
9197 {
9198 gl::Context *context = gl::getNonLostContext();
9199
9200 if (context)
9201 {
9202 if (context->getClientVersion() < 3)
9203 {
9204 return gl::error(GL_INVALID_OPERATION);
9205 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009206
Jamie Madill5215e1a2013-07-26 11:55:19 -04009207 if (flags != 0)
9208 {
9209 return gl::error(GL_INVALID_VALUE);
9210 }
9211
9212 if (timeout != GL_TIMEOUT_IGNORED)
9213 {
9214 return gl::error(GL_INVALID_VALUE);
9215 }
9216
9217 gl::FenceSync *fenceSync = context->getFenceSync(sync);
9218
9219 if (!fenceSync)
9220 {
9221 return gl::error(GL_INVALID_VALUE);
9222 }
9223
9224 fenceSync->serverWait();
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009225 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009226 }
9227 catch(std::bad_alloc&)
9228 {
9229 return gl::error(GL_OUT_OF_MEMORY);
9230 }
9231}
9232
9233void __stdcall glGetInteger64v(GLenum pname, GLint64* params)
9234{
9235 EVENT("(GLenum pname = 0x%X, GLint64* params = 0x%0.8p)",
9236 pname, params);
9237
9238 try
9239 {
9240 gl::Context *context = gl::getNonLostContext();
9241
9242 if (context)
9243 {
9244 if (context->getClientVersion() < 3)
9245 {
9246 return gl::error(GL_INVALID_OPERATION);
9247 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009248
Jamie Madill79f2f452013-12-19 11:13:02 -05009249 GLenum nativeType;
9250 unsigned int numParams = 0;
9251 if (!context->getQueryParameterInfo(pname, &nativeType, &numParams))
9252 return gl::error(GL_INVALID_ENUM);
9253
9254 // pname is valid, but that there are no parameters to return.
9255 if (numParams == 0)
9256 return;
9257
9258 if (nativeType == GL_INT_64_ANGLEX)
Jamie Madill71fbd602013-07-19 16:36:55 -04009259 {
Jamie Madill79f2f452013-12-19 11:13:02 -05009260 context->getInteger64v(pname, params);
9261 }
9262 else if (nativeType == GL_BOOL)
9263 {
9264 GLboolean *boolParams = NULL;
9265 boolParams = new GLboolean[numParams];
Jamie Madill71fbd602013-07-19 16:36:55 -04009266
Jamie Madill79f2f452013-12-19 11:13:02 -05009267 context->getBooleanv(pname, boolParams);
Jamie Madill71fbd602013-07-19 16:36:55 -04009268
Jamie Madill79f2f452013-12-19 11:13:02 -05009269 for (unsigned int i = 0; i < numParams; ++i)
Jamie Madill71fbd602013-07-19 16:36:55 -04009270 {
Jamie Madill79f2f452013-12-19 11:13:02 -05009271 if (boolParams[i] == GL_FALSE)
9272 params[i] = 0;
9273 else
9274 params[i] = 1;
Jamie Madill71fbd602013-07-19 16:36:55 -04009275 }
Jamie Madill79f2f452013-12-19 11:13:02 -05009276
9277 delete [] boolParams;
9278 }
9279 else if (nativeType == GL_INT)
9280 {
9281 GLint *intParams = NULL;
9282 intParams = new GLint[numParams];
9283
9284 context->getIntegerv(pname, intParams);
9285
9286 for (unsigned int i = 0; i < numParams; ++i)
Jamie Madill71fbd602013-07-19 16:36:55 -04009287 {
Jamie Madill79f2f452013-12-19 11:13:02 -05009288 params[i] = static_cast<GLint64>(intParams[i]);
Jamie Madill71fbd602013-07-19 16:36:55 -04009289 }
Jamie Madill79f2f452013-12-19 11:13:02 -05009290
9291 delete [] intParams;
9292 }
9293 else if (nativeType == GL_FLOAT)
9294 {
9295 GLfloat *floatParams = NULL;
9296 floatParams = new GLfloat[numParams];
9297
9298 context->getFloatv(pname, floatParams);
9299
9300 for (unsigned int i = 0; i < numParams; ++i)
Jamie Madill71fbd602013-07-19 16:36:55 -04009301 {
Jamie Madill79f2f452013-12-19 11:13:02 -05009302 // RGBA color values and DepthRangeF values are converted to integer using Equation 2.4 from Table 4.5
9303 if (pname == GL_DEPTH_RANGE || pname == GL_COLOR_CLEAR_VALUE || pname == GL_DEPTH_CLEAR_VALUE || pname == GL_BLEND_COLOR)
Jamie Madill71fbd602013-07-19 16:36:55 -04009304 {
Jamie Madill79f2f452013-12-19 11:13:02 -05009305 params[i] = static_cast<GLint64>((static_cast<GLfloat>(0xFFFFFFFF) * floatParams[i] - 1.0f) / 2.0f);
Jamie Madill71fbd602013-07-19 16:36:55 -04009306 }
Jamie Madill79f2f452013-12-19 11:13:02 -05009307 else
9308 {
9309 params[i] = gl::iround<GLint64>(floatParams[i]);
9310 }
Jamie Madill71fbd602013-07-19 16:36:55 -04009311 }
Jamie Madill79f2f452013-12-19 11:13:02 -05009312
9313 delete [] floatParams;
Jamie Madill71fbd602013-07-19 16:36:55 -04009314 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009315 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009316 }
9317 catch(std::bad_alloc&)
9318 {
9319 return gl::error(GL_OUT_OF_MEMORY);
9320 }
9321}
9322
9323void __stdcall glGetSynciv(GLsync sync, GLenum pname, GLsizei bufSize, GLsizei* length, GLint* values)
9324{
9325 EVENT("(GLsync sync = 0x%0.8p, GLenum pname = 0x%X, GLsizei bufSize = %d, GLsizei* length = 0x%0.8p, GLint* values = 0x%0.8p)",
9326 sync, pname, bufSize, length, values);
9327
9328 try
9329 {
9330 gl::Context *context = gl::getNonLostContext();
9331
9332 if (context)
9333 {
9334 if (context->getClientVersion() < 3)
9335 {
9336 return gl::error(GL_INVALID_OPERATION);
9337 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009338
Jamie Madill5215e1a2013-07-26 11:55:19 -04009339 if (bufSize < 0)
9340 {
9341 return gl::error(GL_INVALID_VALUE);
9342 }
9343
9344 gl::FenceSync *fenceSync = context->getFenceSync(sync);
9345
9346 if (!fenceSync)
9347 {
9348 return gl::error(GL_INVALID_VALUE);
9349 }
9350
9351 switch (pname)
9352 {
9353 case GL_OBJECT_TYPE: values[0] = static_cast<GLint>(GL_SYNC_FENCE); break;
9354 case GL_SYNC_STATUS: values[0] = static_cast<GLint>(fenceSync->getStatus()); break;
9355 case GL_SYNC_CONDITION: values[0] = static_cast<GLint>(fenceSync->getCondition()); break;
9356 case GL_SYNC_FLAGS: values[0] = 0; break;
9357
9358 default:
9359 return gl::error(GL_INVALID_ENUM);
9360 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009361 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009362 }
9363 catch(std::bad_alloc&)
9364 {
9365 return gl::error(GL_OUT_OF_MEMORY);
9366 }
9367}
9368
9369void __stdcall glGetInteger64i_v(GLenum target, GLuint index, GLint64* data)
9370{
9371 EVENT("(GLenum target = 0x%X, GLuint index = %u, GLint64* data = 0x%0.8p)",
9372 target, index, data);
9373
9374 try
9375 {
9376 gl::Context *context = gl::getNonLostContext();
9377
9378 if (context)
9379 {
9380 if (context->getClientVersion() < 3)
9381 {
9382 return gl::error(GL_INVALID_OPERATION);
9383 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009384
Shannon Woods15934d52013-08-19 14:28:49 -04009385 switch (target)
9386 {
9387 case GL_TRANSFORM_FEEDBACK_BUFFER_START:
9388 case GL_TRANSFORM_FEEDBACK_BUFFER_SIZE:
9389 case GL_TRANSFORM_FEEDBACK_BUFFER_BINDING:
9390 if (index >= context->getMaxTransformFeedbackBufferBindings())
9391 return gl::error(GL_INVALID_VALUE);
9392 break;
9393 case GL_UNIFORM_BUFFER_START:
9394 case GL_UNIFORM_BUFFER_SIZE:
9395 case GL_UNIFORM_BUFFER_BINDING:
9396 if (index >= context->getMaximumCombinedUniformBufferBindings())
9397 return gl::error(GL_INVALID_VALUE);
9398 break;
9399 default:
9400 return gl::error(GL_INVALID_ENUM);
9401 }
9402
9403 if (!(context->getIndexedInteger64v(target, index, data)))
9404 {
9405 GLenum nativeType;
9406 unsigned int numParams = 0;
9407 if (!context->getIndexedQueryParameterInfo(target, &nativeType, &numParams))
9408 return gl::error(GL_INVALID_ENUM);
9409
9410 if (numParams == 0)
9411 return; // it is known that pname is valid, but there are no parameters to return
9412
9413 if (nativeType == GL_INT)
9414 {
9415 GLint *intParams = new GLint[numParams];
9416
9417 context->getIndexedIntegerv(target, index, intParams);
9418
9419 for (unsigned int i = 0; i < numParams; ++i)
9420 {
9421 data[i] = static_cast<GLint64>(intParams[i]);
9422 }
9423
9424 delete [] intParams;
9425 }
9426 else
9427 {
9428 UNREACHABLE();
9429 }
9430 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009431 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009432 }
9433 catch(std::bad_alloc&)
9434 {
9435 return gl::error(GL_OUT_OF_MEMORY);
9436 }
9437}
9438
9439void __stdcall glGetBufferParameteri64v(GLenum target, GLenum pname, GLint64* params)
9440{
9441 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLint64* params = 0x%0.8p)",
9442 target, pname, params);
9443
9444 try
9445 {
9446 gl::Context *context = gl::getNonLostContext();
9447
9448 if (context)
9449 {
9450 if (context->getClientVersion() < 3)
9451 {
9452 return gl::error(GL_INVALID_OPERATION);
9453 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009454
Jamie Madill54133512013-06-21 09:33:07 -04009455 // glGetBufferParameteri64v
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009456 UNIMPLEMENTED();
9457 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009458 }
9459 catch(std::bad_alloc&)
9460 {
9461 return gl::error(GL_OUT_OF_MEMORY);
9462 }
9463}
9464
9465void __stdcall glGenSamplers(GLsizei count, GLuint* samplers)
9466{
9467 EVENT("(GLsizei count = %d, GLuint* samplers = 0x%0.8p)", count, samplers);
9468
9469 try
9470 {
9471 gl::Context *context = gl::getNonLostContext();
9472
9473 if (context)
9474 {
9475 if (context->getClientVersion() < 3)
9476 {
9477 return gl::error(GL_INVALID_OPERATION);
9478 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009479
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009480 if (count < 0)
9481 {
9482 return gl::error(GL_INVALID_VALUE);
9483 }
9484
9485 for (int i = 0; i < count; i++)
9486 {
9487 samplers[i] = context->createSampler();
9488 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009489 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009490 }
9491 catch(std::bad_alloc&)
9492 {
9493 return gl::error(GL_OUT_OF_MEMORY);
9494 }
9495}
9496
9497void __stdcall glDeleteSamplers(GLsizei count, const GLuint* samplers)
9498{
9499 EVENT("(GLsizei count = %d, const GLuint* samplers = 0x%0.8p)", count, samplers);
9500
9501 try
9502 {
9503 gl::Context *context = gl::getNonLostContext();
9504
9505 if (context)
9506 {
9507 if (context->getClientVersion() < 3)
9508 {
9509 return gl::error(GL_INVALID_OPERATION);
9510 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009511
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009512 if (count < 0)
9513 {
9514 return gl::error(GL_INVALID_VALUE);
9515 }
9516
9517 for (int i = 0; i < count; i++)
9518 {
9519 context->deleteSampler(samplers[i]);
9520 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009521 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009522 }
9523 catch(std::bad_alloc&)
9524 {
9525 return gl::error(GL_OUT_OF_MEMORY);
9526 }
9527}
9528
9529GLboolean __stdcall glIsSampler(GLuint sampler)
9530{
9531 EVENT("(GLuint sampler = %u)", sampler);
9532
9533 try
9534 {
9535 gl::Context *context = gl::getNonLostContext();
9536
9537 if (context)
9538 {
9539 if (context->getClientVersion() < 3)
9540 {
9541 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
9542 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009543
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009544 return context->isSampler(sampler);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009545 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009546 }
9547 catch(std::bad_alloc&)
9548 {
9549 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
9550 }
9551
9552 return GL_FALSE;
9553}
9554
9555void __stdcall glBindSampler(GLuint unit, GLuint sampler)
9556{
9557 EVENT("(GLuint unit = %u, GLuint sampler = %u)", unit, sampler);
9558
9559 try
9560 {
9561 gl::Context *context = gl::getNonLostContext();
9562
9563 if (context)
9564 {
9565 if (context->getClientVersion() < 3)
9566 {
9567 return gl::error(GL_INVALID_OPERATION);
9568 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009569
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009570 if (sampler != 0 && !context->isSampler(sampler))
9571 {
9572 return gl::error(GL_INVALID_OPERATION);
9573 }
9574
9575 if (unit >= context->getMaximumCombinedTextureImageUnits())
9576 {
9577 return gl::error(GL_INVALID_VALUE);
9578 }
9579
9580 context->bindSampler(unit, sampler);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009581 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009582 }
9583 catch(std::bad_alloc&)
9584 {
9585 return gl::error(GL_OUT_OF_MEMORY);
9586 }
9587}
9588
9589void __stdcall glSamplerParameteri(GLuint sampler, GLenum pname, GLint param)
9590{
9591 EVENT("(GLuint sampler = %u, GLenum pname = 0x%X, GLint param = %d)", sampler, pname, param);
9592
9593 try
9594 {
9595 gl::Context *context = gl::getNonLostContext();
9596
9597 if (context)
9598 {
9599 if (context->getClientVersion() < 3)
9600 {
9601 return gl::error(GL_INVALID_OPERATION);
9602 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009603
Geoff Lang34dbb6f2013-08-05 15:05:47 -04009604 if (!gl::ValidateSamplerObjectParameter(pname))
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009605 {
9606 return;
9607 }
9608
Geoff Lang34dbb6f2013-08-05 15:05:47 -04009609 if (!gl::ValidateTexParamParameters(context, pname, param))
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009610 {
9611 return;
9612 }
9613
9614 if (!context->isSampler(sampler))
9615 {
9616 return gl::error(GL_INVALID_OPERATION);
9617 }
9618
9619 context->samplerParameteri(sampler, pname, param);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009620 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009621 }
9622 catch(std::bad_alloc&)
9623 {
9624 return gl::error(GL_OUT_OF_MEMORY);
9625 }
9626}
9627
9628void __stdcall glSamplerParameteriv(GLuint sampler, GLenum pname, const GLint* param)
9629{
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009630 glSamplerParameteri(sampler, pname, *param);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009631}
9632
9633void __stdcall glSamplerParameterf(GLuint sampler, GLenum pname, GLfloat param)
9634{
9635 EVENT("(GLuint sampler = %u, GLenum pname = 0x%X, GLfloat param = %g)", sampler, pname, param);
9636
9637 try
9638 {
9639 gl::Context *context = gl::getNonLostContext();
9640
9641 if (context)
9642 {
9643 if (context->getClientVersion() < 3)
9644 {
9645 return gl::error(GL_INVALID_OPERATION);
9646 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009647
Geoff Lang34dbb6f2013-08-05 15:05:47 -04009648 if (!gl::ValidateSamplerObjectParameter(pname))
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009649 {
9650 return;
9651 }
9652
Geoff Lang34dbb6f2013-08-05 15:05:47 -04009653 if (!gl::ValidateTexParamParameters(context, pname, static_cast<GLint>(param)))
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009654 {
9655 return;
9656 }
9657
9658 if (!context->isSampler(sampler))
9659 {
9660 return gl::error(GL_INVALID_OPERATION);
9661 }
9662
9663 context->samplerParameterf(sampler, pname, param);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009664 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009665 }
9666 catch(std::bad_alloc&)
9667 {
9668 return gl::error(GL_OUT_OF_MEMORY);
9669 }
9670}
9671
9672void __stdcall glSamplerParameterfv(GLuint sampler, GLenum pname, const GLfloat* param)
9673{
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009674 glSamplerParameterf(sampler, pname, *param);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009675}
9676
9677void __stdcall glGetSamplerParameteriv(GLuint sampler, GLenum pname, GLint* params)
9678{
9679 EVENT("(GLuint sampler = %u, GLenum pname = 0x%X, GLint* params = 0x%0.8p)", sampler, pname, params);
9680
9681 try
9682 {
9683 gl::Context *context = gl::getNonLostContext();
9684
9685 if (context)
9686 {
9687 if (context->getClientVersion() < 3)
9688 {
9689 return gl::error(GL_INVALID_OPERATION);
9690 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009691
Geoff Lang34dbb6f2013-08-05 15:05:47 -04009692 if (!gl::ValidateSamplerObjectParameter(pname))
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009693 {
9694 return;
9695 }
9696
9697 if (!context->isSampler(sampler))
9698 {
9699 return gl::error(GL_INVALID_OPERATION);
9700 }
9701
9702 *params = context->getSamplerParameteri(sampler, pname);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009703 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009704 }
9705 catch(std::bad_alloc&)
9706 {
9707 return gl::error(GL_OUT_OF_MEMORY);
9708 }
9709}
9710
9711void __stdcall glGetSamplerParameterfv(GLuint sampler, GLenum pname, GLfloat* params)
9712{
9713 EVENT("(GLuint sample = %ur, GLenum pname = 0x%X, GLfloat* params = 0x%0.8p)", sampler, pname, params);
9714
9715 try
9716 {
9717 gl::Context *context = gl::getNonLostContext();
9718
9719 if (context)
9720 {
9721 if (context->getClientVersion() < 3)
9722 {
9723 return gl::error(GL_INVALID_OPERATION);
9724 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009725
Geoff Lang34dbb6f2013-08-05 15:05:47 -04009726 if (!gl::ValidateSamplerObjectParameter(pname))
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009727 {
9728 return;
9729 }
9730
9731 if (!context->isSampler(sampler))
9732 {
9733 return gl::error(GL_INVALID_OPERATION);
9734 }
9735
9736 *params = context->getSamplerParameterf(sampler, pname);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009737 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009738 }
9739 catch(std::bad_alloc&)
9740 {
9741 return gl::error(GL_OUT_OF_MEMORY);
9742 }
9743}
9744
9745void __stdcall glVertexAttribDivisor(GLuint index, GLuint divisor)
9746{
9747 EVENT("(GLuint index = %u, GLuint divisor = %u)", index, divisor);
9748
9749 try
9750 {
shannon.woods%transgaming.com@gtempaccount.com8736bd62013-04-13 03:35:41 +00009751 if (index >= gl::MAX_VERTEX_ATTRIBS)
9752 {
9753 return gl::error(GL_INVALID_VALUE);
9754 }
9755
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009756 gl::Context *context = gl::getNonLostContext();
9757
9758 if (context)
9759 {
9760 if (context->getClientVersion() < 3)
9761 {
9762 return gl::error(GL_INVALID_OPERATION);
9763 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009764
shannon.woods%transgaming.com@gtempaccount.com8736bd62013-04-13 03:35:41 +00009765 context->setVertexAttribDivisor(index, divisor);
9766 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009767 }
9768 catch(std::bad_alloc&)
9769 {
9770 return gl::error(GL_OUT_OF_MEMORY);
9771 }
9772}
9773
9774void __stdcall glBindTransformFeedback(GLenum target, GLuint id)
9775{
9776 EVENT("(GLenum target = 0x%X, GLuint id = %u)", target, id);
9777
9778 try
9779 {
9780 gl::Context *context = gl::getNonLostContext();
9781
9782 if (context)
9783 {
9784 if (context->getClientVersion() < 3)
9785 {
9786 return gl::error(GL_INVALID_OPERATION);
9787 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009788
Jamie Madill54133512013-06-21 09:33:07 -04009789 // glBindTransformFeedback
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009790 UNIMPLEMENTED();
9791 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009792 }
9793 catch(std::bad_alloc&)
9794 {
9795 return gl::error(GL_OUT_OF_MEMORY);
9796 }
9797}
9798
9799void __stdcall glDeleteTransformFeedbacks(GLsizei n, const GLuint* ids)
9800{
9801 EVENT("(GLsizei n = %d, const GLuint* ids = 0x%0.8p)", n, ids);
9802
9803 try
9804 {
9805 gl::Context *context = gl::getNonLostContext();
9806
9807 if (context)
9808 {
9809 if (context->getClientVersion() < 3)
9810 {
9811 return gl::error(GL_INVALID_OPERATION);
9812 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009813
Jamie Madill54133512013-06-21 09:33:07 -04009814 // glDeleteTransformFeedbacks
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009815 UNIMPLEMENTED();
9816 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009817 }
9818 catch(std::bad_alloc&)
9819 {
9820 return gl::error(GL_OUT_OF_MEMORY);
9821 }
9822}
9823
9824void __stdcall glGenTransformFeedbacks(GLsizei n, GLuint* ids)
9825{
9826 EVENT("(GLsizei n = %d, GLuint* ids = 0x%0.8p)", n, ids);
9827
9828 try
9829 {
9830 gl::Context *context = gl::getNonLostContext();
9831
9832 if (context)
9833 {
9834 if (context->getClientVersion() < 3)
9835 {
9836 return gl::error(GL_INVALID_OPERATION);
9837 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009838
Jamie Madill54133512013-06-21 09:33:07 -04009839 // glGenTransformFeedbacks
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009840 UNIMPLEMENTED();
9841 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009842 }
9843 catch(std::bad_alloc&)
9844 {
9845 return gl::error(GL_OUT_OF_MEMORY);
9846 }
9847}
9848
9849GLboolean __stdcall glIsTransformFeedback(GLuint id)
9850{
9851 EVENT("(GLuint id = %u)", id);
9852
9853 try
9854 {
9855 gl::Context *context = gl::getNonLostContext();
9856
9857 if (context)
9858 {
9859 if (context->getClientVersion() < 3)
9860 {
9861 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
9862 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009863
Jamie Madill54133512013-06-21 09:33:07 -04009864 // glIsTransformFeedback
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009865 UNIMPLEMENTED();
9866 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009867 }
9868 catch(std::bad_alloc&)
9869 {
9870 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
9871 }
9872
9873 return GL_FALSE;
9874}
9875
9876void __stdcall glPauseTransformFeedback(void)
9877{
9878 EVENT("(void)");
9879
9880 try
9881 {
9882 gl::Context *context = gl::getNonLostContext();
9883
9884 if (context)
9885 {
9886 if (context->getClientVersion() < 3)
9887 {
9888 return gl::error(GL_INVALID_OPERATION);
9889 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009890
Jamie Madill54133512013-06-21 09:33:07 -04009891 // glPauseTransformFeedback
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009892 UNIMPLEMENTED();
9893 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009894 }
9895 catch(std::bad_alloc&)
9896 {
9897 return gl::error(GL_OUT_OF_MEMORY);
9898 }
9899}
9900
9901void __stdcall glResumeTransformFeedback(void)
9902{
9903 EVENT("(void)");
9904
9905 try
9906 {
9907 gl::Context *context = gl::getNonLostContext();
9908
9909 if (context)
9910 {
9911 if (context->getClientVersion() < 3)
9912 {
9913 return gl::error(GL_INVALID_OPERATION);
9914 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009915
Jamie Madill54133512013-06-21 09:33:07 -04009916 // glResumeTransformFeedback
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009917 UNIMPLEMENTED();
9918 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009919 }
9920 catch(std::bad_alloc&)
9921 {
9922 return gl::error(GL_OUT_OF_MEMORY);
9923 }
9924}
9925
9926void __stdcall glGetProgramBinary(GLuint program, GLsizei bufSize, GLsizei* length, GLenum* binaryFormat, GLvoid* binary)
9927{
9928 EVENT("(GLuint program = %u, GLsizei bufSize = %d, GLsizei* length = 0x%0.8p, GLenum* binaryFormat = 0x%0.8p, GLvoid* binary = 0x%0.8p)",
9929 program, bufSize, length, binaryFormat, binary);
9930
9931 try
9932 {
9933 gl::Context *context = gl::getNonLostContext();
9934
9935 if (context)
9936 {
9937 if (context->getClientVersion() < 3)
9938 {
9939 return gl::error(GL_INVALID_OPERATION);
9940 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009941
Jamie Madill54133512013-06-21 09:33:07 -04009942 // glGetProgramBinary
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009943 UNIMPLEMENTED();
9944 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009945 }
9946 catch(std::bad_alloc&)
9947 {
9948 return gl::error(GL_OUT_OF_MEMORY);
9949 }
9950}
9951
9952void __stdcall glProgramBinary(GLuint program, GLenum binaryFormat, const GLvoid* binary, GLsizei length)
9953{
9954 EVENT("(GLuint program = %u, GLenum binaryFormat = 0x%X, const GLvoid* binary = 0x%0.8p, GLsizei length = %d)",
9955 program, binaryFormat, binary, length);
9956
9957 try
9958 {
9959 gl::Context *context = gl::getNonLostContext();
9960
9961 if (context)
9962 {
9963 if (context->getClientVersion() < 3)
9964 {
9965 return gl::error(GL_INVALID_OPERATION);
9966 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009967
Jamie Madill54133512013-06-21 09:33:07 -04009968 // glProgramBinary
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009969 UNIMPLEMENTED();
9970 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009971 }
9972 catch(std::bad_alloc&)
9973 {
9974 return gl::error(GL_OUT_OF_MEMORY);
9975 }
9976}
9977
9978void __stdcall glProgramParameteri(GLuint program, GLenum pname, GLint value)
9979{
9980 EVENT("(GLuint program = %u, GLenum pname = 0x%X, GLint value = %d)",
9981 program, pname, value);
9982
9983 try
9984 {
9985 gl::Context *context = gl::getNonLostContext();
9986
9987 if (context)
9988 {
9989 if (context->getClientVersion() < 3)
9990 {
9991 return gl::error(GL_INVALID_OPERATION);
9992 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009993
Jamie Madill54133512013-06-21 09:33:07 -04009994 // glProgramParameteri
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009995 UNIMPLEMENTED();
9996 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009997 }
9998 catch(std::bad_alloc&)
9999 {
10000 return gl::error(GL_OUT_OF_MEMORY);
10001 }
10002}
10003
10004void __stdcall glInvalidateFramebuffer(GLenum target, GLsizei numAttachments, const GLenum* attachments)
10005{
10006 EVENT("(GLenum target = 0x%X, GLsizei numAttachments = %d, const GLenum* attachments = 0x%0.8p)",
10007 target, numAttachments, attachments);
10008
10009 try
10010 {
10011 gl::Context *context = gl::getNonLostContext();
10012
10013 if (context)
10014 {
10015 if (context->getClientVersion() < 3)
10016 {
10017 return gl::error(GL_INVALID_OPERATION);
10018 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +000010019
Geoff Lang34dbb6f2013-08-05 15:05:47 -040010020 if (!ValidateInvalidateFramebufferParameters(context, target, numAttachments, attachments))
shannonwoods@chromium.orgd63ef892013-05-30 00:10:56 +000010021 {
10022 return;
10023 }
10024
10025 int maxDimension = context->getMaximumRenderbufferDimension();
10026 context->invalidateFrameBuffer(target, numAttachments, attachments, 0, 0, maxDimension, maxDimension);
10027 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +000010028 }
10029 catch(std::bad_alloc&)
10030 {
10031 return gl::error(GL_OUT_OF_MEMORY);
10032 }
10033}
10034
10035void __stdcall glInvalidateSubFramebuffer(GLenum target, GLsizei numAttachments, const GLenum* attachments, GLint x, GLint y, GLsizei width, GLsizei height)
10036{
10037 EVENT("(GLenum target = 0x%X, GLsizei numAttachments = %d, const GLenum* attachments = 0x%0.8p, GLint x = %d, "
10038 "GLint y = %d, GLsizei width = %d, GLsizei height = %d)",
10039 target, numAttachments, attachments, x, y, width, height);
10040
10041 try
10042 {
10043 gl::Context *context = gl::getNonLostContext();
10044
10045 if (context)
10046 {
10047 if (context->getClientVersion() < 3)
10048 {
10049 return gl::error(GL_INVALID_OPERATION);
10050 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +000010051
Geoff Lang34dbb6f2013-08-05 15:05:47 -040010052 if (!ValidateInvalidateFramebufferParameters(context, target, numAttachments, attachments))
shannonwoods@chromium.orgd63ef892013-05-30 00:10:56 +000010053 {
10054 return;
10055 }
10056
10057 context->invalidateFrameBuffer(target, numAttachments, attachments, x, y, width, height);
10058 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +000010059 }
10060 catch(std::bad_alloc&)
10061 {
10062 return gl::error(GL_OUT_OF_MEMORY);
10063 }
10064}
10065
10066void __stdcall glTexStorage2D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height)
10067{
10068 EVENT("(GLenum target = 0x%X, GLsizei levels = %d, GLenum internalformat = 0x%X, GLsizei width = %d, GLsizei height = %d)",
10069 target, levels, internalformat, width, height);
10070
10071 try
10072 {
10073 gl::Context *context = gl::getNonLostContext();
10074
10075 if (context)
10076 {
10077 if (context->getClientVersion() < 3)
10078 {
10079 return gl::error(GL_INVALID_OPERATION);
10080 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +000010081
Geoff Lang34dbb6f2013-08-05 15:05:47 -040010082 if (!ValidateES3TexStorageParameters(context, target, levels, internalformat, width, height, 1))
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +000010083 {
10084 return;
10085 }
10086
10087 switch (target)
10088 {
10089 case GL_TEXTURE_2D:
10090 {
10091 gl::Texture2D *texture2d = context->getTexture2D();
10092 texture2d->storage(levels, internalformat, width, height);
10093 }
10094 break;
10095
Geoff Lang01c21d22013-09-24 11:52:16 -040010096 case GL_TEXTURE_CUBE_MAP:
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +000010097 {
10098 gl::TextureCubeMap *textureCube = context->getTextureCubeMap();
10099 textureCube->storage(levels, internalformat, width);
10100 }
10101 break;
10102
10103 default:
10104 return gl::error(GL_INVALID_ENUM);
10105 }
10106 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +000010107 }
10108 catch(std::bad_alloc&)
10109 {
10110 return gl::error(GL_OUT_OF_MEMORY);
10111 }
10112}
10113
10114void __stdcall glTexStorage3D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth)
10115{
10116 EVENT("(GLenum target = 0x%X, GLsizei levels = %d, GLenum internalformat = 0x%X, GLsizei width = %d, "
10117 "GLsizei height = %d, GLsizei depth = %d)",
10118 target, levels, internalformat, width, height, depth);
10119
10120 try
10121 {
10122 gl::Context *context = gl::getNonLostContext();
10123
10124 if (context)
10125 {
10126 if (context->getClientVersion() < 3)
10127 {
10128 return gl::error(GL_INVALID_OPERATION);
10129 }
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +000010130
Geoff Lang34dbb6f2013-08-05 15:05:47 -040010131 if (!ValidateES3TexStorageParameters(context, target, levels, internalformat, width, height, depth))
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +000010132 {
10133 return;
10134 }
10135
10136 switch (target)
10137 {
10138 case GL_TEXTURE_3D:
10139 {
10140 gl::Texture3D *texture3d = context->getTexture3D();
10141 texture3d->storage(levels, internalformat, width, height, depth);
10142 }
10143 break;
10144
10145 case GL_TEXTURE_2D_ARRAY:
10146 {
10147 gl::Texture2DArray *texture2darray = context->getTexture2DArray();
10148 texture2darray->storage(levels, internalformat, width, height, depth);
10149 }
10150 break;
10151
10152 default:
Geoff Lang01c21d22013-09-24 11:52:16 -040010153 UNREACHABLE();
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +000010154 }
shannon.woods%transgaming.com@gtempaccount.com14eb55e2013-04-13 03:35:06 +000010155 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +000010156 }
10157 catch(std::bad_alloc&)
10158 {
10159 return gl::error(GL_OUT_OF_MEMORY);
10160 }
10161}
10162
10163void __stdcall glGetInternalformativ(GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize, GLint* params)
10164{
10165 EVENT("(GLenum target = 0x%X, GLenum internalformat = 0x%X, GLenum pname = 0x%X, GLsizei bufSize = %d, "
10166 "GLint* params = 0x%0.8p)",
10167 target, internalformat, pname, bufSize, params);
10168
10169 try
10170 {
10171 gl::Context *context = gl::getNonLostContext();
10172
10173 if (context)
10174 {
10175 if (context->getClientVersion() < 3)
10176 {
10177 return gl::error(GL_INVALID_OPERATION);
10178 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +000010179
Shannon Woods809d2502013-07-08 10:32:18 -040010180 if (!gl::IsColorRenderingSupported(internalformat, context) &&
10181 !gl::IsDepthRenderingSupported(internalformat, context) &&
10182 !gl::IsStencilRenderingSupported(internalformat, context))
10183 {
10184 return gl::error(GL_INVALID_ENUM);
10185 }
10186
10187 if (target != GL_RENDERBUFFER)
10188 {
10189 return gl::error(GL_INVALID_ENUM);
10190 }
10191
10192 if (bufSize < 0)
10193 {
10194 return gl::error(GL_INVALID_VALUE);
10195 }
10196
10197 switch (pname)
10198 {
10199 case GL_NUM_SAMPLE_COUNTS:
10200 if (bufSize != 0)
10201 *params = context->getNumSampleCounts(internalformat);
10202 break;
10203 case GL_SAMPLES:
10204 context->getSampleCounts(internalformat, bufSize, params);
10205 break;
10206 default:
10207 return gl::error(GL_INVALID_ENUM);
10208 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +000010209 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +000010210 }
10211 catch(std::bad_alloc&)
10212 {
10213 return gl::error(GL_OUT_OF_MEMORY);
10214 }
10215}
10216
10217// Extension functions
10218
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +000010219void __stdcall glBlitFramebufferANGLE(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1,
10220 GLbitfield mask, GLenum filter)
10221{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +000010222 EVENT("(GLint srcX0 = %d, GLint srcY0 = %d, GLint srcX1 = %d, GLint srcY1 = %d, "
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +000010223 "GLint dstX0 = %d, GLint dstY0 = %d, GLint dstX1 = %d, GLint dstY1 = %d, "
10224 "GLbitfield mask = 0x%X, GLenum filter = 0x%X)",
10225 srcX0, srcY0, srcX1, srcX1, dstX0, dstY0, dstX1, dstY1, mask, filter);
10226
10227 try
10228 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +000010229 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +000010230
10231 if (context)
10232 {
Geoff Lang34dbb6f2013-08-05 15:05:47 -040010233 if (!ValidateBlitFramebufferParameters(context, srcX0, srcY0, srcX1, srcY1,
Geoff Lang758d5b22013-06-11 11:42:50 -040010234 dstX0, dstY0, dstX1, dstY1, mask, filter,
10235 true))
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +000010236 {
Geoff Lang758d5b22013-06-11 11:42:50 -040010237 return;
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +000010238 }
10239
Geoff Lang758d5b22013-06-11 11:42:50 -040010240 context->blitFramebuffer(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1,
10241 mask, filter);
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +000010242 }
10243 }
10244 catch(std::bad_alloc&)
10245 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010246 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +000010247 }
10248}
10249
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +000010250void __stdcall glTexImage3DOES(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth,
10251 GLint border, GLenum format, GLenum type, const GLvoid* pixels)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000010252{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +000010253 EVENT("(GLenum target = 0x%X, GLint level = %d, GLenum internalformat = 0x%X, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +000010254 "GLsizei width = %d, GLsizei height = %d, GLsizei depth = %d, GLint border = %d, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +000010255 "GLenum format = 0x%X, GLenum type = 0x%x, const GLvoid* pixels = 0x%0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000010256 target, level, internalformat, width, height, depth, border, format, type, pixels);
10257
10258 try
10259 {
10260 UNIMPLEMENTED(); // FIXME
10261 }
10262 catch(std::bad_alloc&)
10263 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010264 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000010265 }
10266}
daniel@transgaming.comce3d0f22010-05-04 03:35:14 +000010267
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010268void __stdcall glGetProgramBinaryOES(GLuint program, GLsizei bufSize, GLsizei *length,
10269 GLenum *binaryFormat, void *binary)
10270{
apatrick@chromium.org90080e32012-07-09 22:15:33 +000010271 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 +000010272 program, bufSize, length, binaryFormat, binary);
10273
10274 try
10275 {
10276 gl::Context *context = gl::getNonLostContext();
10277
10278 if (context)
10279 {
10280 gl::Program *programObject = context->getProgram(program);
10281
daniel@transgaming.com716056c2012-07-24 18:38:59 +000010282 if (!programObject || !programObject->isLinked())
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010283 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010284 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010285 }
10286
10287 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
10288
10289 if (!programBinary)
10290 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010291 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010292 }
10293
apatrick@chromium.org90080e32012-07-09 22:15:33 +000010294 if (!programBinary->save(binary, bufSize, length))
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010295 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010296 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010297 }
apatrick@chromium.org90080e32012-07-09 22:15:33 +000010298
10299 *binaryFormat = GL_PROGRAM_BINARY_ANGLE;
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010300 }
10301 }
10302 catch(std::bad_alloc&)
10303 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010304 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010305 }
10306}
10307
10308void __stdcall glProgramBinaryOES(GLuint program, GLenum binaryFormat,
10309 const void *binary, GLint length)
10310{
10311 EVENT("(GLenum program = 0x%X, binaryFormat = 0x%x, binary = 0x%0.8p, length = %d)",
10312 program, binaryFormat, binary, length);
10313
10314 try
10315 {
10316 gl::Context *context = gl::getNonLostContext();
10317
10318 if (context)
10319 {
10320 if (binaryFormat != GL_PROGRAM_BINARY_ANGLE)
10321 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010322 return gl::error(GL_INVALID_ENUM);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010323 }
10324
10325 gl::Program *programObject = context->getProgram(program);
10326
10327 if (!programObject)
10328 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010329 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010330 }
10331
daniel@transgaming.com95d29422012-07-24 18:36:10 +000010332 context->setProgramBinary(program, binary, length);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010333 }
10334 }
10335 catch(std::bad_alloc&)
10336 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010337 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010338 }
10339}
10340
shannon.woods%transgaming.com@gtempaccount.com4059a382013-04-13 03:31:16 +000010341void __stdcall glDrawBuffersEXT(GLsizei n, const GLenum *bufs)
10342{
10343 EVENT("(GLenum n = %d, bufs = 0x%0.8p)", n, bufs);
10344
10345 try
10346 {
10347 gl::Context *context = gl::getNonLostContext();
10348
10349 if (context)
10350 {
10351 if (n < 0 || (unsigned int)n > context->getMaximumRenderTargets())
10352 {
10353 return gl::error(GL_INVALID_VALUE);
10354 }
10355
10356 if (context->getDrawFramebufferHandle() == 0)
10357 {
shannon.woods%transgaming.com@gtempaccount.com2fa73c52013-04-13 03:37:20 +000010358 if (n != 1)
shannon.woods%transgaming.com@gtempaccount.com4059a382013-04-13 03:31:16 +000010359 {
10360 return gl::error(GL_INVALID_OPERATION);
10361 }
10362
shannon.woods%transgaming.com@gtempaccount.com2fa73c52013-04-13 03:37:20 +000010363 if (bufs[0] != GL_NONE && bufs[0] != GL_BACK)
shannon.woods%transgaming.com@gtempaccount.com4059a382013-04-13 03:31:16 +000010364 {
shannon.woods%transgaming.com@gtempaccount.com2fa73c52013-04-13 03:37:20 +000010365 return gl::error(GL_INVALID_OPERATION);
shannon.woods%transgaming.com@gtempaccount.com4059a382013-04-13 03:31:16 +000010366 }
10367 }
10368 else
10369 {
10370 for (int colorAttachment = 0; colorAttachment < n; colorAttachment++)
10371 {
10372 const GLenum attachment = GL_COLOR_ATTACHMENT0_EXT + colorAttachment;
10373 if (bufs[colorAttachment] != GL_NONE && bufs[colorAttachment] != attachment)
10374 {
10375 return gl::error(GL_INVALID_OPERATION);
10376 }
10377 }
10378 }
10379
10380 gl::Framebuffer *framebuffer = context->getDrawFramebuffer();
10381
10382 for (int colorAttachment = 0; colorAttachment < n; colorAttachment++)
10383 {
10384 framebuffer->setDrawBufferState(colorAttachment, bufs[colorAttachment]);
10385 }
shannon.woods%transgaming.com@gtempaccount.com2fa73c52013-04-13 03:37:20 +000010386
10387 for (int colorAttachment = n; colorAttachment < (int)context->getMaximumRenderTargets(); colorAttachment++)
10388 {
10389 framebuffer->setDrawBufferState(colorAttachment, GL_NONE);
10390 }
shannon.woods%transgaming.com@gtempaccount.com4059a382013-04-13 03:31:16 +000010391 }
10392 }
10393 catch (std::bad_alloc&)
10394 {
10395 return gl::error(GL_OUT_OF_MEMORY);
10396 }
10397}
10398
daniel@transgaming.comce3d0f22010-05-04 03:35:14 +000010399__eglMustCastToProperFunctionPointerType __stdcall glGetProcAddress(const char *procname)
10400{
10401 struct Extension
10402 {
10403 const char *name;
10404 __eglMustCastToProperFunctionPointerType address;
10405 };
10406
10407 static const Extension glExtensions[] =
10408 {
10409 {"glTexImage3DOES", (__eglMustCastToProperFunctionPointerType)glTexImage3DOES},
daniel@transgaming.com01868132010-08-24 19:21:17 +000010410 {"glBlitFramebufferANGLE", (__eglMustCastToProperFunctionPointerType)glBlitFramebufferANGLE},
daniel@transgaming.com1fe96c92011-01-14 15:08:44 +000010411 {"glRenderbufferStorageMultisampleANGLE", (__eglMustCastToProperFunctionPointerType)glRenderbufferStorageMultisampleANGLE},
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +000010412 {"glDeleteFencesNV", (__eglMustCastToProperFunctionPointerType)glDeleteFencesNV},
10413 {"glGenFencesNV", (__eglMustCastToProperFunctionPointerType)glGenFencesNV},
10414 {"glIsFenceNV", (__eglMustCastToProperFunctionPointerType)glIsFenceNV},
10415 {"glTestFenceNV", (__eglMustCastToProperFunctionPointerType)glTestFenceNV},
10416 {"glGetFenceivNV", (__eglMustCastToProperFunctionPointerType)glGetFenceivNV},
10417 {"glFinishFenceNV", (__eglMustCastToProperFunctionPointerType)glFinishFenceNV},
10418 {"glSetFenceNV", (__eglMustCastToProperFunctionPointerType)glSetFenceNV},
zmo@google.coma574f782011-10-03 21:45:23 +000010419 {"glGetTranslatedShaderSourceANGLE", (__eglMustCastToProperFunctionPointerType)glGetTranslatedShaderSourceANGLE},
daniel@transgaming.com0bd1f2f2011-11-11 04:19:03 +000010420 {"glTexStorage2DEXT", (__eglMustCastToProperFunctionPointerType)glTexStorage2DEXT},
daniel@transgaming.com709ed112011-11-12 03:18:10 +000010421 {"glGetGraphicsResetStatusEXT", (__eglMustCastToProperFunctionPointerType)glGetGraphicsResetStatusEXT},
10422 {"glReadnPixelsEXT", (__eglMustCastToProperFunctionPointerType)glReadnPixelsEXT},
10423 {"glGetnUniformfvEXT", (__eglMustCastToProperFunctionPointerType)glGetnUniformfvEXT},
10424 {"glGetnUniformivEXT", (__eglMustCastToProperFunctionPointerType)glGetnUniformivEXT},
daniel@transgaming.com86bdb822012-01-20 18:24:39 +000010425 {"glGenQueriesEXT", (__eglMustCastToProperFunctionPointerType)glGenQueriesEXT},
10426 {"glDeleteQueriesEXT", (__eglMustCastToProperFunctionPointerType)glDeleteQueriesEXT},
10427 {"glIsQueryEXT", (__eglMustCastToProperFunctionPointerType)glIsQueryEXT},
10428 {"glBeginQueryEXT", (__eglMustCastToProperFunctionPointerType)glBeginQueryEXT},
10429 {"glEndQueryEXT", (__eglMustCastToProperFunctionPointerType)glEndQueryEXT},
10430 {"glGetQueryivEXT", (__eglMustCastToProperFunctionPointerType)glGetQueryivEXT},
10431 {"glGetQueryObjectuivEXT", (__eglMustCastToProperFunctionPointerType)glGetQueryObjectuivEXT},
shannon.woods%transgaming.com@gtempaccount.com77d94722013-04-13 03:34:22 +000010432 {"glDrawBuffersEXT", (__eglMustCastToProperFunctionPointerType)glDrawBuffersEXT},
daniel@transgaming.comdce02fd2012-01-27 15:39:51 +000010433 {"glVertexAttribDivisorANGLE", (__eglMustCastToProperFunctionPointerType)glVertexAttribDivisorANGLE},
10434 {"glDrawArraysInstancedANGLE", (__eglMustCastToProperFunctionPointerType)glDrawArraysInstancedANGLE},
10435 {"glDrawElementsInstancedANGLE", (__eglMustCastToProperFunctionPointerType)glDrawElementsInstancedANGLE},
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010436 {"glGetProgramBinaryOES", (__eglMustCastToProperFunctionPointerType)glGetProgramBinaryOES},
10437 {"glProgramBinaryOES", (__eglMustCastToProperFunctionPointerType)glProgramBinaryOES}, };
daniel@transgaming.comce3d0f22010-05-04 03:35:14 +000010438
shannon.woods@transgaming.comd438fd42013-02-28 23:17:45 +000010439 for (unsigned int ext = 0; ext < ArraySize(glExtensions); ext++)
daniel@transgaming.comce3d0f22010-05-04 03:35:14 +000010440 {
10441 if (strcmp(procname, glExtensions[ext].name) == 0)
10442 {
10443 return (__eglMustCastToProperFunctionPointerType)glExtensions[ext].address;
10444 }
10445 }
10446
10447 return NULL;
10448}
10449
daniel@transgaming.com17f548c2011-11-09 17:47:02 +000010450// Non-public functions used by EGL
10451
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +000010452bool __stdcall glBindTexImage(egl::Surface *surface)
jbauman@chromium.orgae345802011-03-30 22:04:25 +000010453{
10454 EVENT("(egl::Surface* surface = 0x%0.8p)",
10455 surface);
10456
10457 try
10458 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +000010459 gl::Context *context = gl::getNonLostContext();
jbauman@chromium.orgae345802011-03-30 22:04:25 +000010460
10461 if (context)
10462 {
10463 gl::Texture2D *textureObject = context->getTexture2D();
10464
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +000010465 if (textureObject->isImmutable())
10466 {
10467 return false;
10468 }
10469
jbauman@chromium.orgae345802011-03-30 22:04:25 +000010470 if (textureObject)
10471 {
10472 textureObject->bindTexImage(surface);
10473 }
10474 }
10475 }
10476 catch(std::bad_alloc&)
10477 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010478 return gl::error(GL_OUT_OF_MEMORY, false);
jbauman@chromium.orgae345802011-03-30 22:04:25 +000010479 }
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +000010480
10481 return true;
jbauman@chromium.orgae345802011-03-30 22:04:25 +000010482}
10483
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000010484}