blob: fff09941cf10fca62b820588b38da443b7d85504 [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
Jamie Madill35d15012013-10-07 10:46:37 -04002214 GLint internalFormat = texture->getBaseLevelInternalFormat();
2215
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
2226 texture->generateMipmaps();
daniel@transgaming.com8fd99e22010-04-20 18:52:00 +00002227 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002228 }
2229 catch(std::bad_alloc&)
2230 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002231 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002232 }
2233}
2234
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002235void __stdcall glGenFencesNV(GLsizei n, GLuint* fences)
2236{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002237 EVENT("(GLsizei n = %d, GLuint* fences = 0x%0.8p)", n, fences);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002238
2239 try
2240 {
2241 if (n < 0)
2242 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002243 return gl::error(GL_INVALID_VALUE);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002244 }
2245
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002246 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002247
2248 if (context)
2249 {
2250 for (int i = 0; i < n; i++)
2251 {
Jamie Madill33dc8432013-07-26 11:55:05 -04002252 fences[i] = context->createFenceNV();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002253 }
2254 }
2255 }
2256 catch(std::bad_alloc&)
2257 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002258 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002259 }
2260}
2261
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002262void __stdcall glGenFramebuffers(GLsizei n, GLuint* framebuffers)
2263{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002264 EVENT("(GLsizei n = %d, GLuint* framebuffers = 0x%0.8p)", n, framebuffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002265
2266 try
2267 {
2268 if (n < 0)
2269 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002270 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002271 }
2272
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002273 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002274
2275 if (context)
2276 {
2277 for (int i = 0; i < n; i++)
2278 {
2279 framebuffers[i] = context->createFramebuffer();
2280 }
2281 }
2282 }
2283 catch(std::bad_alloc&)
2284 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002285 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002286 }
2287}
2288
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00002289void __stdcall glGenQueriesEXT(GLsizei n, GLuint* ids)
2290{
2291 EVENT("(GLsizei n = %d, GLuint* ids = 0x%0.8p)", n, ids);
2292
2293 try
2294 {
2295 if (n < 0)
2296 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002297 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00002298 }
2299
2300 gl::Context *context = gl::getNonLostContext();
2301
2302 if (context)
2303 {
2304 for (int i = 0; i < n; i++)
2305 {
2306 ids[i] = context->createQuery();
2307 }
2308 }
2309 }
2310 catch(std::bad_alloc&)
2311 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002312 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00002313 }
2314}
2315
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002316void __stdcall glGenRenderbuffers(GLsizei n, GLuint* renderbuffers)
2317{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002318 EVENT("(GLsizei n = %d, GLuint* renderbuffers = 0x%0.8p)", n, renderbuffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002319
2320 try
2321 {
2322 if (n < 0)
2323 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002324 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002325 }
2326
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002327 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002328
2329 if (context)
2330 {
2331 for (int i = 0; i < n; i++)
2332 {
2333 renderbuffers[i] = context->createRenderbuffer();
2334 }
2335 }
2336 }
2337 catch(std::bad_alloc&)
2338 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002339 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002340 }
2341}
2342
2343void __stdcall glGenTextures(GLsizei n, GLuint* textures)
2344{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002345 EVENT("(GLsizei n = %d, GLuint* textures = 0x%0.8p)", n, textures);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002346
2347 try
2348 {
2349 if (n < 0)
2350 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002351 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002352 }
2353
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002354 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002355
2356 if (context)
2357 {
2358 for (int i = 0; i < n; i++)
2359 {
2360 textures[i] = context->createTexture();
2361 }
2362 }
2363 }
2364 catch(std::bad_alloc&)
2365 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002366 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002367 }
2368}
2369
daniel@transgaming.com85423182010-04-22 13:35:27 +00002370void __stdcall glGetActiveAttrib(GLuint program, GLuint index, GLsizei bufsize, GLsizei *length, GLint *size, GLenum *type, GLchar *name)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002371{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002372 EVENT("(GLuint program = %d, GLuint index = %d, GLsizei bufsize = %d, GLsizei *length = 0x%0.8p, "
daniel@transgaming.com85423182010-04-22 13:35:27 +00002373 "GLint *size = 0x%0.8p, GLenum *type = %0.8p, GLchar *name = %0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002374 program, index, bufsize, length, size, type, name);
2375
2376 try
2377 {
2378 if (bufsize < 0)
2379 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002380 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002381 }
2382
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002383 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com85423182010-04-22 13:35:27 +00002384
2385 if (context)
2386 {
2387 gl::Program *programObject = context->getProgram(program);
2388
2389 if (!programObject)
2390 {
2391 if (context->getShader(program))
2392 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002393 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com85423182010-04-22 13:35:27 +00002394 }
2395 else
2396 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002397 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com85423182010-04-22 13:35:27 +00002398 }
2399 }
2400
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00002401 if (index >= (GLuint)programObject->getActiveAttributeCount())
daniel@transgaming.com85423182010-04-22 13:35:27 +00002402 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002403 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com85423182010-04-22 13:35:27 +00002404 }
2405
2406 programObject->getActiveAttribute(index, bufsize, length, size, type, name);
2407 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002408 }
2409 catch(std::bad_alloc&)
2410 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002411 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002412 }
2413}
2414
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00002415void __stdcall glGetActiveUniform(GLuint program, GLuint index, GLsizei bufsize, GLsizei* length, GLint* size, GLenum* type, GLchar* name)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002416{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002417 EVENT("(GLuint program = %d, GLuint index = %d, GLsizei bufsize = %d, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00002418 "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 +00002419 program, index, bufsize, length, size, type, name);
2420
2421 try
2422 {
2423 if (bufsize < 0)
2424 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002425 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002426 }
2427
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002428 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00002429
2430 if (context)
2431 {
2432 gl::Program *programObject = context->getProgram(program);
2433
2434 if (!programObject)
2435 {
2436 if (context->getShader(program))
2437 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002438 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00002439 }
2440 else
2441 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002442 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00002443 }
2444 }
2445
2446 if (index >= (GLuint)programObject->getActiveUniformCount())
2447 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002448 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00002449 }
2450
2451 programObject->getActiveUniform(index, bufsize, length, size, type, name);
2452 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002453 }
2454 catch(std::bad_alloc&)
2455 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002456 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002457 }
2458}
2459
2460void __stdcall glGetAttachedShaders(GLuint program, GLsizei maxcount, GLsizei* count, GLuint* shaders)
2461{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002462 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 +00002463 program, maxcount, count, shaders);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002464
2465 try
2466 {
2467 if (maxcount < 0)
2468 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002469 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002470 }
2471
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002472 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com6c785212010-03-30 03:36:17 +00002473
2474 if (context)
2475 {
2476 gl::Program *programObject = context->getProgram(program);
2477
2478 if (!programObject)
2479 {
daniel@transgaming.com23953e32010-04-13 19:53:31 +00002480 if (context->getShader(program))
2481 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002482 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com23953e32010-04-13 19:53:31 +00002483 }
2484 else
2485 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002486 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com23953e32010-04-13 19:53:31 +00002487 }
daniel@transgaming.com6c785212010-03-30 03:36:17 +00002488 }
2489
2490 return programObject->getAttachedShaders(maxcount, count, shaders);
2491 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002492 }
2493 catch(std::bad_alloc&)
2494 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002495 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002496 }
2497}
2498
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00002499int __stdcall glGetAttribLocation(GLuint program, const GLchar* name)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002500{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002501 EVENT("(GLuint program = %d, const GLchar* name = %s)", program, name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002502
2503 try
2504 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002505 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002506
2507 if (context)
2508 {
daniel@transgaming.combb274c32010-04-13 03:26:21 +00002509
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002510 gl::Program *programObject = context->getProgram(program);
2511
2512 if (!programObject)
2513 {
daniel@transgaming.combb274c32010-04-13 03:26:21 +00002514 if (context->getShader(program))
2515 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002516 return gl::error(GL_INVALID_OPERATION, -1);
daniel@transgaming.combb274c32010-04-13 03:26:21 +00002517 }
2518 else
2519 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002520 return gl::error(GL_INVALID_VALUE, -1);
daniel@transgaming.combb274c32010-04-13 03:26:21 +00002521 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002522 }
2523
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00002524 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
daniel@transgaming.com716056c2012-07-24 18:38:59 +00002525 if (!programObject->isLinked() || !programBinary)
daniel@transgaming.comcf4aa872010-04-13 03:26:27 +00002526 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002527 return gl::error(GL_INVALID_OPERATION, -1);
daniel@transgaming.comcf4aa872010-04-13 03:26:27 +00002528 }
2529
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00002530 return programBinary->getAttributeLocation(name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002531 }
2532 }
2533 catch(std::bad_alloc&)
2534 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002535 return gl::error(GL_OUT_OF_MEMORY, -1);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002536 }
2537
2538 return -1;
2539}
2540
2541void __stdcall glGetBooleanv(GLenum pname, GLboolean* params)
2542{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002543 EVENT("(GLenum pname = 0x%X, GLboolean* params = 0x%0.8p)", pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002544
2545 try
2546 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002547 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com777f2672010-04-07 03:25:16 +00002548
2549 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002550 {
daniel@transgaming.com777f2672010-04-07 03:25:16 +00002551 if (!(context->getBooleanv(pname, params)))
2552 {
2553 GLenum nativeType;
2554 unsigned int numParams = 0;
2555 if (!context->getQueryParameterInfo(pname, &nativeType, &numParams))
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002556 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com777f2672010-04-07 03:25:16 +00002557
2558 if (numParams == 0)
2559 return; // it is known that the pname is valid, but there are no parameters to return
2560
2561 if (nativeType == GL_FLOAT)
2562 {
2563 GLfloat *floatParams = NULL;
2564 floatParams = new GLfloat[numParams];
2565
2566 context->getFloatv(pname, floatParams);
2567
2568 for (unsigned int i = 0; i < numParams; ++i)
2569 {
2570 if (floatParams[i] == 0.0f)
2571 params[i] = GL_FALSE;
2572 else
2573 params[i] = GL_TRUE;
2574 }
2575
2576 delete [] floatParams;
2577 }
2578 else if (nativeType == GL_INT)
2579 {
2580 GLint *intParams = NULL;
2581 intParams = new GLint[numParams];
2582
2583 context->getIntegerv(pname, intParams);
2584
2585 for (unsigned int i = 0; i < numParams; ++i)
2586 {
2587 if (intParams[i] == 0)
2588 params[i] = GL_FALSE;
2589 else
2590 params[i] = GL_TRUE;
2591 }
2592
2593 delete [] intParams;
2594 }
Jamie Madill71fbd602013-07-19 16:36:55 -04002595 else if (nativeType == GL_INT_64_ANGLEX)
2596 {
2597 GLint64 *int64Params = NULL;
2598 int64Params = new GLint64[numParams];
2599
2600 context->getInteger64v(pname, int64Params);
2601
2602 for (unsigned int i = 0; i < numParams; ++i)
2603 {
2604 if (int64Params[i] == 0)
2605 params[i] = GL_FALSE;
2606 else
2607 params[i] = GL_TRUE;
2608 }
2609
2610 delete [] int64Params;
2611 }
daniel@transgaming.com777f2672010-04-07 03:25:16 +00002612 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002613 }
2614 }
2615 catch(std::bad_alloc&)
2616 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002617 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002618 }
2619}
2620
2621void __stdcall glGetBufferParameteriv(GLenum target, GLenum pname, GLint* params)
2622{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002623 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 +00002624
2625 try
2626 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002627 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comaa0ccbd2010-04-15 20:45:05 +00002628
2629 if (context)
2630 {
2631 gl::Buffer *buffer;
2632
2633 switch (target)
2634 {
2635 case GL_ARRAY_BUFFER:
2636 buffer = context->getArrayBuffer();
2637 break;
2638 case GL_ELEMENT_ARRAY_BUFFER:
2639 buffer = context->getElementArrayBuffer();
2640 break;
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002641 default: return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comaa0ccbd2010-04-15 20:45:05 +00002642 }
2643
2644 if (!buffer)
2645 {
2646 // A null buffer means that "0" is bound to the requested buffer target
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002647 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comaa0ccbd2010-04-15 20:45:05 +00002648 }
2649
2650 switch (pname)
2651 {
2652 case GL_BUFFER_USAGE:
2653 *params = buffer->usage();
2654 break;
2655 case GL_BUFFER_SIZE:
2656 *params = buffer->size();
2657 break;
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002658 default: return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comaa0ccbd2010-04-15 20:45:05 +00002659 }
2660 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002661 }
2662 catch(std::bad_alloc&)
2663 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002664 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002665 }
2666}
2667
2668GLenum __stdcall glGetError(void)
2669{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002670 EVENT("()");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002671
2672 gl::Context *context = gl::getContext();
2673
2674 if (context)
2675 {
daniel@transgaming.com82b28912011-12-12 21:01:35 +00002676 return context->getError();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002677 }
2678
2679 return GL_NO_ERROR;
2680}
2681
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002682void __stdcall glGetFenceivNV(GLuint fence, GLenum pname, GLint *params)
2683{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002684 EVENT("(GLuint fence = %d, GLenum pname = 0x%X, GLint *params = 0x%0.8p)", fence, pname, params);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002685
2686 try
2687 {
2688
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002689 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002690
2691 if (context)
2692 {
Jamie Madill33dc8432013-07-26 11:55:05 -04002693 gl::FenceNV *fenceObject = context->getFenceNV(fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002694
2695 if (fenceObject == NULL)
2696 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002697 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002698 }
2699
Jamie Madillfb9a7402013-07-26 11:55:01 -04002700 if (fenceObject->isFence() != GL_TRUE)
2701 {
2702 return gl::error(GL_INVALID_OPERATION);
2703 }
2704
2705 switch (pname)
2706 {
2707 case GL_FENCE_STATUS_NV:
2708 case GL_FENCE_CONDITION_NV:
2709 break;
2710
2711 default: return gl::error(GL_INVALID_ENUM);
2712 }
2713
2714 params[0] = fenceObject->getFencei(pname);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002715 }
2716 }
2717 catch(std::bad_alloc&)
2718 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002719 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002720 }
2721}
2722
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002723void __stdcall glGetFloatv(GLenum pname, GLfloat* params)
2724{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002725 EVENT("(GLenum pname = 0x%X, GLfloat* params = 0x%0.8p)", pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002726
2727 try
2728 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002729 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com32e58cd2010-03-24 09:44:10 +00002730
2731 if (context)
2732 {
daniel@transgaming.com777f2672010-04-07 03:25:16 +00002733 if (!(context->getFloatv(pname, params)))
daniel@transgaming.com32e58cd2010-03-24 09:44:10 +00002734 {
daniel@transgaming.com777f2672010-04-07 03:25:16 +00002735 GLenum nativeType;
2736 unsigned int numParams = 0;
2737 if (!context->getQueryParameterInfo(pname, &nativeType, &numParams))
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002738 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com777f2672010-04-07 03:25:16 +00002739
2740 if (numParams == 0)
2741 return; // it is known that the pname is valid, but that there are no parameters to return.
2742
2743 if (nativeType == GL_BOOL)
2744 {
2745 GLboolean *boolParams = NULL;
2746 boolParams = new GLboolean[numParams];
2747
2748 context->getBooleanv(pname, boolParams);
2749
2750 for (unsigned int i = 0; i < numParams; ++i)
2751 {
2752 if (boolParams[i] == GL_FALSE)
2753 params[i] = 0.0f;
2754 else
2755 params[i] = 1.0f;
2756 }
2757
2758 delete [] boolParams;
2759 }
2760 else if (nativeType == GL_INT)
2761 {
2762 GLint *intParams = NULL;
2763 intParams = new GLint[numParams];
2764
2765 context->getIntegerv(pname, intParams);
2766
2767 for (unsigned int i = 0; i < numParams; ++i)
2768 {
Jamie Madill71fbd602013-07-19 16:36:55 -04002769 params[i] = static_cast<GLfloat>(intParams[i]);
daniel@transgaming.com777f2672010-04-07 03:25:16 +00002770 }
2771
2772 delete [] intParams;
2773 }
Jamie Madill71fbd602013-07-19 16:36:55 -04002774 else if (nativeType == GL_INT_64_ANGLEX)
2775 {
2776 GLint64 *int64Params = NULL;
2777 int64Params = new GLint64[numParams];
2778
2779 context->getInteger64v(pname, int64Params);
2780
2781 for (unsigned int i = 0; i < numParams; ++i)
2782 {
2783 params[i] = static_cast<GLfloat>(int64Params[i]);
2784 }
2785
2786 delete [] int64Params;
2787 }
daniel@transgaming.com32e58cd2010-03-24 09:44:10 +00002788 }
2789 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002790 }
2791 catch(std::bad_alloc&)
2792 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002793 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002794 }
2795}
2796
2797void __stdcall glGetFramebufferAttachmentParameteriv(GLenum target, GLenum attachment, GLenum pname, GLint* params)
2798{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002799 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 +00002800 target, attachment, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002801
2802 try
2803 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002804 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002805
2806 if (context)
2807 {
Geoff Lang646559f2013-08-15 11:08:15 -04002808 META_ASSERT(GL_DRAW_FRAMEBUFFER_ANGLE == GL_DRAW_FRAMEBUFFER && GL_READ_FRAMEBUFFER_ANGLE == GL_READ_FRAMEBUFFER);
2809 if (target != GL_FRAMEBUFFER && target != GL_DRAW_FRAMEBUFFER && target != GL_READ_FRAMEBUFFER)
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002810 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002811 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002812 }
2813
Geoff Lang646559f2013-08-15 11:08:15 -04002814 switch (pname)
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002815 {
Geoff Lang646559f2013-08-15 11:08:15 -04002816 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE:
2817 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME:
2818 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL:
2819 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE:
2820 break;
2821 case GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE:
2822 case GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE:
2823 case GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE:
2824 case GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE:
2825 case GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE:
2826 case GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE:
2827 case GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE:
2828 case GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING:
2829 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER:
2830 if (context->getClientVersion() >= 3)
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002831 {
Geoff Lang646559f2013-08-15 11:08:15 -04002832 break;
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002833 }
Geoff Lang646559f2013-08-15 11:08:15 -04002834 default:
2835 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002836 }
Geoff Lang646559f2013-08-15 11:08:15 -04002837
2838 // Determine if the attachment is a valid enum
2839 switch (attachment)
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002840 {
Geoff Lang646559f2013-08-15 11:08:15 -04002841 case GL_BACK:
2842 case GL_FRONT:
2843 case GL_STENCIL:
2844 case GL_DEPTH_STENCIL_ATTACHMENT:
2845 if (context->getClientVersion() < 3)
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002846 {
Geoff Lang646559f2013-08-15 11:08:15 -04002847 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002848 }
Geoff Lang646559f2013-08-15 11:08:15 -04002849 break;
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002850
Geoff Lang646559f2013-08-15 11:08:15 -04002851 case GL_DEPTH_ATTACHMENT:
2852 case GL_STENCIL_ATTACHMENT:
2853 break;
2854
2855 default:
2856 if (attachment < GL_COLOR_ATTACHMENT0_EXT ||
2857 (attachment - GL_COLOR_ATTACHMENT0_EXT) >= context->getMaximumRenderTargets())
2858 {
2859 return gl::error(GL_INVALID_ENUM);
2860 }
2861 break;
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002862 }
2863
Geoff Lang646559f2013-08-15 11:08:15 -04002864 GLuint framebufferHandle = (target == GL_READ_FRAMEBUFFER) ? context->getReadFramebufferHandle()
2865 : context->getDrawFramebufferHandle();
2866
2867 gl::Framebuffer *framebuffer = context->getFramebuffer(framebufferHandle);
2868
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002869 GLenum attachmentType;
2870 GLuint attachmentHandle;
Geoff Lang309c92a2013-07-25 16:23:19 -04002871 GLuint attachmentLevel;
2872 GLuint attachmentLayer;
Geoff Lang646559f2013-08-15 11:08:15 -04002873 gl::Renderbuffer *renderbuffer;
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002874
Geoff Lang646559f2013-08-15 11:08:15 -04002875 if(framebufferHandle == 0)
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002876 {
Geoff Lang646559f2013-08-15 11:08:15 -04002877 if(context->getClientVersion() < 3)
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002878 {
Geoff Lang646559f2013-08-15 11:08:15 -04002879 return gl::error(GL_INVALID_OPERATION);
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002880 }
2881
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002882 switch (attachment)
2883 {
Geoff Lang646559f2013-08-15 11:08:15 -04002884 case GL_BACK:
2885 attachmentType = framebuffer->getColorbufferType(0);
2886 attachmentHandle = framebuffer->getColorbufferHandle(0);
2887 attachmentLevel = framebuffer->getColorbufferMipLevel(0);
2888 attachmentLayer = framebuffer->getColorbufferLayer(0);
2889 renderbuffer = framebuffer->getColorbuffer(0);
2890 break;
2891 case GL_DEPTH:
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002892 attachmentType = framebuffer->getDepthbufferType();
2893 attachmentHandle = framebuffer->getDepthbufferHandle();
Geoff Lang309c92a2013-07-25 16:23:19 -04002894 attachmentLevel = framebuffer->getDepthbufferMipLevel();
2895 attachmentLayer = framebuffer->getDepthbufferLayer();
Geoff Lang646559f2013-08-15 11:08:15 -04002896 renderbuffer = framebuffer->getDepthbuffer();
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002897 break;
Geoff Lang646559f2013-08-15 11:08:15 -04002898 case GL_STENCIL:
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002899 attachmentType = framebuffer->getStencilbufferType();
2900 attachmentHandle = framebuffer->getStencilbufferHandle();
Geoff Lang309c92a2013-07-25 16:23:19 -04002901 attachmentLevel = framebuffer->getStencilbufferMipLevel();
2902 attachmentLayer = framebuffer->getStencilbufferLayer();
Geoff Lang646559f2013-08-15 11:08:15 -04002903 renderbuffer = framebuffer->getStencilbuffer();
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002904 break;
Geoff Lang646559f2013-08-15 11:08:15 -04002905 default:
2906 return gl::error(GL_INVALID_OPERATION);
2907 }
2908 }
2909 else
2910 {
2911 if (attachment >= GL_COLOR_ATTACHMENT0_EXT && attachment <= GL_COLOR_ATTACHMENT15_EXT)
2912 {
2913 const unsigned int colorAttachment = (attachment - GL_COLOR_ATTACHMENT0_EXT);
2914 attachmentType = framebuffer->getColorbufferType(colorAttachment);
2915 attachmentHandle = framebuffer->getColorbufferHandle(colorAttachment);
2916 attachmentLevel = framebuffer->getColorbufferMipLevel(colorAttachment);
2917 attachmentLayer = framebuffer->getColorbufferLayer(colorAttachment);
2918 renderbuffer = framebuffer->getColorbuffer(colorAttachment);
2919 }
2920 else
2921 {
2922 switch (attachment)
Geoff Lang55ba29c2013-07-11 16:57:53 -04002923 {
Geoff Lang646559f2013-08-15 11:08:15 -04002924 case GL_DEPTH_ATTACHMENT:
2925 attachmentType = framebuffer->getDepthbufferType();
2926 attachmentHandle = framebuffer->getDepthbufferHandle();
2927 attachmentLevel = framebuffer->getDepthbufferMipLevel();
2928 attachmentLayer = framebuffer->getDepthbufferLayer();
2929 renderbuffer = framebuffer->getDepthbuffer();
2930 break;
2931 case GL_STENCIL_ATTACHMENT:
2932 attachmentType = framebuffer->getStencilbufferType();
2933 attachmentHandle = framebuffer->getStencilbufferHandle();
2934 attachmentLevel = framebuffer->getStencilbufferMipLevel();
2935 attachmentLayer = framebuffer->getStencilbufferLayer();
2936 renderbuffer = framebuffer->getStencilbuffer();
2937 break;
2938 case GL_DEPTH_STENCIL_ATTACHMENT:
2939 if (framebuffer->getDepthbufferHandle() != framebuffer->getStencilbufferHandle())
2940 {
2941 return gl::error(GL_INVALID_OPERATION);
2942 }
2943 attachmentType = framebuffer->getDepthStencilbufferType();
2944 attachmentHandle = framebuffer->getDepthStencilbufferHandle();
2945 attachmentLevel = framebuffer->getDepthStencilbufferMipLevel();
2946 attachmentLayer = framebuffer->getDepthStencilbufferLayer();
2947 renderbuffer = framebuffer->getDepthStencilBuffer();
2948 break;
2949 default:
Geoff Lang55ba29c2013-07-11 16:57:53 -04002950 return gl::error(GL_INVALID_OPERATION);
2951 }
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002952 }
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002953 }
2954
2955 GLenum attachmentObjectType; // Type category
Geoff Lang646559f2013-08-15 11:08:15 -04002956 if (framebufferHandle == 0)
2957 {
2958 attachmentObjectType = GL_FRAMEBUFFER_DEFAULT;
2959 }
2960 else if (attachmentType == GL_NONE || attachmentType == GL_RENDERBUFFER)
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002961 {
2962 attachmentObjectType = attachmentType;
2963 }
Geoff Lang0fe19492013-07-25 17:04:31 -04002964 else if (gl::IsInternalTextureTarget(attachmentType, context->getClientVersion()))
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002965 {
2966 attachmentObjectType = GL_TEXTURE;
2967 }
apatrick@chromium.orga1d80592012-01-25 21:52:10 +00002968 else
2969 {
2970 UNREACHABLE();
2971 return;
2972 }
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002973
Geoff Lang646559f2013-08-15 11:08:15 -04002974 if (attachmentObjectType == GL_NONE)
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002975 {
Geoff Lang646559f2013-08-15 11:08:15 -04002976 // ES 2.0.25 spec pg 127 states that if the value of FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE
2977 // is NONE, then querying any other pname will generate INVALID_ENUM.
2978
2979 // ES 3.0.2 spec pg 235 states that if the attachment type is none,
2980 // GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME will return zero and be an
2981 // INVALID_OPERATION for all other pnames
2982
2983 switch (pname)
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002984 {
Geoff Lang646559f2013-08-15 11:08:15 -04002985 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE:
2986 *params = attachmentObjectType;
2987 break;
2988
2989 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME:
2990 if (context->getClientVersion() < 3)
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002991 {
Geoff Lang646559f2013-08-15 11:08:15 -04002992 return gl::error(GL_INVALID_ENUM);
2993 }
2994 *params = 0;
2995 break;
2996
2997 default:
2998 if (context->getClientVersion() < 3)
2999 {
3000 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003001 }
3002 else
3003 {
Geoff Lang646559f2013-08-15 11:08:15 -04003004 gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003005 }
3006 }
Geoff Lang646559f2013-08-15 11:08:15 -04003007 }
3008 else
3009 {
3010 ASSERT(attachmentObjectType == GL_RENDERBUFFER || attachmentObjectType == GL_TEXTURE ||
3011 attachmentObjectType == GL_FRAMEBUFFER_DEFAULT);
3012 ASSERT(renderbuffer != NULL);
3013
3014 switch (pname)
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003015 {
Geoff Lang646559f2013-08-15 11:08:15 -04003016 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE:
3017 *params = attachmentObjectType;
3018 break;
3019
3020 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME:
3021 if (attachmentObjectType != GL_RENDERBUFFER && attachmentObjectType != GL_TEXTURE)
3022 {
3023 return gl::error(GL_INVALID_ENUM);
3024 }
3025 *params = attachmentHandle;
3026 break;
3027
3028 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL:
3029 if (attachmentObjectType != GL_TEXTURE)
3030 {
3031 return gl::error(GL_INVALID_ENUM);
3032 }
3033 *params = attachmentLevel;
3034 break;
3035
3036 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE:
3037 if (attachmentObjectType != GL_TEXTURE)
3038 {
3039 return gl::error(GL_INVALID_ENUM);
3040 }
3041 *params = gl::IsCubemapTextureTarget(attachmentType) ? attachmentType : 0;
3042 break;
3043
3044 case GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE:
3045 *params = renderbuffer->getRedSize();
3046 break;
3047
3048 case GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE:
3049 *params = renderbuffer->getGreenSize();
3050 break;
3051
3052 case GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE:
3053 *params = renderbuffer->getBlueSize();
3054 break;
3055
3056 case GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE:
3057 *params = renderbuffer->getAlphaSize();
3058 break;
3059
3060 case GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE:
3061 *params = renderbuffer->getDepthSize();
3062 break;
3063
3064 case GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE:
3065 *params = renderbuffer->getStencilSize();
3066 break;
3067
3068 case GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE:
3069 if (attachment == GL_DEPTH_STENCIL)
3070 {
3071 gl::error(GL_INVALID_OPERATION);
3072 }
3073 *params = renderbuffer->getComponentType();
3074 break;
3075
3076 case GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING:
3077 *params = renderbuffer->getColorEncoding();
3078 break;
3079
3080 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER:
3081 if (attachmentObjectType != GL_TEXTURE)
3082 {
3083 return gl::error(GL_INVALID_ENUM);
3084 }
3085 *params = attachmentLayer;
3086 break;
3087
3088 default:
3089 UNREACHABLE();
3090 break;
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003091 }
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003092 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003093 }
3094 }
3095 catch(std::bad_alloc&)
3096 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003097 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003098 }
3099}
3100
daniel@transgaming.com17f548c2011-11-09 17:47:02 +00003101GLenum __stdcall glGetGraphicsResetStatusEXT(void)
3102{
3103 EVENT("()");
3104
3105 try
3106 {
3107 gl::Context *context = gl::getContext();
3108
3109 if (context)
3110 {
3111 return context->getResetStatus();
3112 }
3113
3114 return GL_NO_ERROR;
3115 }
3116 catch(std::bad_alloc&)
3117 {
3118 return GL_OUT_OF_MEMORY;
3119 }
3120}
3121
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003122void __stdcall glGetIntegerv(GLenum pname, GLint* params)
3123{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003124 EVENT("(GLenum pname = 0x%X, GLint* params = 0x%0.8p)", pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003125
3126 try
3127 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003128 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003129
3130 if (context)
3131 {
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003132 if (!(context->getIntegerv(pname, params)))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003133 {
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003134 GLenum nativeType;
3135 unsigned int numParams = 0;
3136 if (!context->getQueryParameterInfo(pname, &nativeType, &numParams))
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003137 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003138
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003139 if (numParams == 0)
3140 return; // it is known that pname is valid, but there are no parameters to return
3141
3142 if (nativeType == GL_BOOL)
3143 {
3144 GLboolean *boolParams = NULL;
3145 boolParams = new GLboolean[numParams];
3146
3147 context->getBooleanv(pname, boolParams);
3148
3149 for (unsigned int i = 0; i < numParams; ++i)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003150 {
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003151 if (boolParams[i] == GL_FALSE)
3152 params[i] = 0;
3153 else
3154 params[i] = 1;
3155 }
3156
3157 delete [] boolParams;
3158 }
3159 else if (nativeType == GL_FLOAT)
3160 {
3161 GLfloat *floatParams = NULL;
3162 floatParams = new GLfloat[numParams];
3163
3164 context->getFloatv(pname, floatParams);
3165
3166 for (unsigned int i = 0; i < numParams; ++i)
3167 {
Jamie Madill71fbd602013-07-19 16:36:55 -04003168 // RGBA color values and DepthRangeF values are converted to integer using Equation 2.4 from Table 4.5
daniel@transgaming.comc1641352010-04-26 15:33:36 +00003169 if (pname == GL_DEPTH_RANGE || pname == GL_COLOR_CLEAR_VALUE || pname == GL_DEPTH_CLEAR_VALUE || pname == GL_BLEND_COLOR)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003170 {
Jamie Madill71fbd602013-07-19 16:36:55 -04003171 params[i] = static_cast<GLint>((static_cast<GLfloat>(0xFFFFFFFF) * floatParams[i] - 1.0f) / 2.0f);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003172 }
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003173 else
Jamie Madill71fbd602013-07-19 16:36:55 -04003174 {
Jamie Madillaf496912013-07-19 16:36:54 -04003175 params[i] = gl::iround<GLint>(floatParams[i]);
Jamie Madill71fbd602013-07-19 16:36:55 -04003176 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003177 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003178
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003179 delete [] floatParams;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003180 }
Jamie Madill71fbd602013-07-19 16:36:55 -04003181 else if (nativeType == GL_INT_64_ANGLEX)
3182 {
3183 GLint64 minIntValue = static_cast<GLint64>(std::numeric_limits<int>::min());
3184 GLint64 maxIntValue = static_cast<GLint64>(std::numeric_limits<int>::max());
3185 GLint64 *int64Params = NULL;
3186 int64Params = new GLint64[numParams];
3187
3188 context->getInteger64v(pname, int64Params);
3189
3190 for (unsigned int i = 0; i < numParams; ++i)
3191 {
3192 GLint64 clampedValue = std::max(std::min(int64Params[i], maxIntValue), minIntValue);
3193 params[i] = static_cast<GLint>(clampedValue);
3194 }
3195
3196 delete [] int64Params;
3197 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003198 }
3199 }
3200 }
3201 catch(std::bad_alloc&)
3202 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003203 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003204 }
3205}
3206
3207void __stdcall glGetProgramiv(GLuint program, GLenum pname, GLint* params)
3208{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003209 EVENT("(GLuint program = %d, GLenum pname = %d, GLint* params = 0x%0.8p)", program, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003210
3211 try
3212 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003213 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003214
3215 if (context)
3216 {
3217 gl::Program *programObject = context->getProgram(program);
3218
3219 if (!programObject)
3220 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003221 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003222 }
3223
shannonwoods@chromium.orge684b582013-05-30 00:07:42 +00003224 if (context->getClientVersion() < 3)
3225 {
3226 switch (pname)
3227 {
3228 case GL_ACTIVE_UNIFORM_BLOCKS:
3229 case GL_ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH:
3230 return gl::error(GL_INVALID_ENUM);
3231 }
3232 }
3233
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003234 switch (pname)
3235 {
3236 case GL_DELETE_STATUS:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003237 *params = programObject->isFlaggedForDeletion();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003238 return;
3239 case GL_LINK_STATUS:
daniel@transgaming.com716056c2012-07-24 18:38:59 +00003240 *params = programObject->isLinked();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003241 return;
3242 case GL_VALIDATE_STATUS:
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00003243 *params = programObject->isValidated();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003244 return;
3245 case GL_INFO_LOG_LENGTH:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003246 *params = programObject->getInfoLogLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003247 return;
3248 case GL_ATTACHED_SHADERS:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003249 *params = programObject->getAttachedShadersCount();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003250 return;
3251 case GL_ACTIVE_ATTRIBUTES:
daniel@transgaming.com85423182010-04-22 13:35:27 +00003252 *params = programObject->getActiveAttributeCount();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003253 return;
3254 case GL_ACTIVE_ATTRIBUTE_MAX_LENGTH:
daniel@transgaming.com85423182010-04-22 13:35:27 +00003255 *params = programObject->getActiveAttributeMaxLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003256 return;
3257 case GL_ACTIVE_UNIFORMS:
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00003258 *params = programObject->getActiveUniformCount();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003259 return;
3260 case GL_ACTIVE_UNIFORM_MAX_LENGTH:
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00003261 *params = programObject->getActiveUniformMaxLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003262 return;
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00003263 case GL_PROGRAM_BINARY_LENGTH_OES:
apatrick@chromium.org90080e32012-07-09 22:15:33 +00003264 *params = programObject->getProgramBinaryLength();
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00003265 return;
shannonwoods@chromium.orge684b582013-05-30 00:07:42 +00003266 case GL_ACTIVE_UNIFORM_BLOCKS:
3267 *params = programObject->getActiveUniformBlockCount();
3268 return;
3269 case GL_ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH:
3270 *params = programObject->getActiveUniformBlockMaxLength();
3271 break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003272 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003273 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003274 }
3275 }
3276 }
3277 catch(std::bad_alloc&)
3278 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003279 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003280 }
3281}
3282
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00003283void __stdcall glGetProgramInfoLog(GLuint program, GLsizei bufsize, GLsizei* length, GLchar* infolog)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003284{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003285 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 +00003286 program, bufsize, length, infolog);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003287
3288 try
3289 {
3290 if (bufsize < 0)
3291 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003292 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003293 }
3294
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003295 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003296
3297 if (context)
3298 {
3299 gl::Program *programObject = context->getProgram(program);
3300
3301 if (!programObject)
3302 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003303 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003304 }
3305
3306 programObject->getInfoLog(bufsize, length, infolog);
3307 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003308 }
3309 catch(std::bad_alloc&)
3310 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003311 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003312 }
3313}
3314
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003315void __stdcall glGetQueryivEXT(GLenum target, GLenum pname, GLint *params)
3316{
3317 EVENT("GLenum target = 0x%X, GLenum pname = 0x%X, GLint *params = 0x%0.8p)", target, pname, params);
3318
3319 try
3320 {
3321 switch (pname)
3322 {
3323 case GL_CURRENT_QUERY_EXT:
3324 break;
3325 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003326 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003327 }
3328
3329 gl::Context *context = gl::getNonLostContext();
3330
3331 if (context)
3332 {
3333 params[0] = context->getActiveQuery(target);
3334 }
3335 }
3336 catch(std::bad_alloc&)
3337 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003338 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003339 }
3340}
3341
3342void __stdcall glGetQueryObjectuivEXT(GLuint id, GLenum pname, GLuint *params)
3343{
3344 EVENT("(GLuint id = %d, GLenum pname = 0x%X, GLuint *params = 0x%0.8p)", id, pname, params);
3345
3346 try
3347 {
3348 switch (pname)
3349 {
3350 case GL_QUERY_RESULT_EXT:
3351 case GL_QUERY_RESULT_AVAILABLE_EXT:
3352 break;
3353 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003354 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003355 }
3356 gl::Context *context = gl::getNonLostContext();
3357
3358 if (context)
3359 {
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003360 gl::Query *queryObject = context->getQuery(id, false, GL_NONE);
3361
3362 if (!queryObject)
3363 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003364 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003365 }
3366
3367 if (context->getActiveQuery(queryObject->getType()) == id)
3368 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003369 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003370 }
3371
3372 switch(pname)
3373 {
3374 case GL_QUERY_RESULT_EXT:
3375 params[0] = queryObject->getResult();
3376 break;
3377 case GL_QUERY_RESULT_AVAILABLE_EXT:
3378 params[0] = queryObject->isResultAvailable();
3379 break;
3380 default:
3381 ASSERT(false);
3382 }
3383 }
3384 }
3385 catch(std::bad_alloc&)
3386 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003387 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003388 }
3389}
3390
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003391void __stdcall glGetRenderbufferParameteriv(GLenum target, GLenum pname, GLint* params)
3392{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003393 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 +00003394
3395 try
3396 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003397 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003398
3399 if (context)
3400 {
3401 if (target != GL_RENDERBUFFER)
3402 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003403 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003404 }
3405
daniel@transgaming.com428d1582010-05-04 03:35:25 +00003406 if (context->getRenderbufferHandle() == 0)
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003407 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003408 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003409 }
3410
daniel@transgaming.com428d1582010-05-04 03:35:25 +00003411 gl::Renderbuffer *renderbuffer = context->getRenderbuffer(context->getRenderbufferHandle());
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003412
3413 switch (pname)
3414 {
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +00003415 case GL_RENDERBUFFER_WIDTH: *params = renderbuffer->getWidth(); break;
3416 case GL_RENDERBUFFER_HEIGHT: *params = renderbuffer->getHeight(); break;
3417 case GL_RENDERBUFFER_INTERNAL_FORMAT: *params = renderbuffer->getInternalFormat(); break;
3418 case GL_RENDERBUFFER_RED_SIZE: *params = renderbuffer->getRedSize(); break;
3419 case GL_RENDERBUFFER_GREEN_SIZE: *params = renderbuffer->getGreenSize(); break;
3420 case GL_RENDERBUFFER_BLUE_SIZE: *params = renderbuffer->getBlueSize(); break;
3421 case GL_RENDERBUFFER_ALPHA_SIZE: *params = renderbuffer->getAlphaSize(); break;
3422 case GL_RENDERBUFFER_DEPTH_SIZE: *params = renderbuffer->getDepthSize(); break;
3423 case GL_RENDERBUFFER_STENCIL_SIZE: *params = renderbuffer->getStencilSize(); break;
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00003424 case GL_RENDERBUFFER_SAMPLES_ANGLE:
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +00003425 if (context->getMaxSupportedSamples() != 0)
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00003426 {
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +00003427 *params = renderbuffer->getSamples();
3428 }
3429 else
3430 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003431 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00003432 }
3433 break;
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003434 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003435 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003436 }
3437 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003438 }
3439 catch(std::bad_alloc&)
3440 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003441 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003442 }
3443}
3444
3445void __stdcall glGetShaderiv(GLuint shader, GLenum pname, GLint* params)
3446{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003447 EVENT("(GLuint shader = %d, GLenum pname = %d, GLint* params = 0x%0.8p)", shader, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003448
3449 try
3450 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003451 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003452
3453 if (context)
3454 {
3455 gl::Shader *shaderObject = context->getShader(shader);
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00003456
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003457 if (!shaderObject)
3458 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003459 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003460 }
3461
3462 switch (pname)
3463 {
3464 case GL_SHADER_TYPE:
3465 *params = shaderObject->getType();
3466 return;
3467 case GL_DELETE_STATUS:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003468 *params = shaderObject->isFlaggedForDeletion();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003469 return;
3470 case GL_COMPILE_STATUS:
3471 *params = shaderObject->isCompiled() ? GL_TRUE : GL_FALSE;
3472 return;
3473 case GL_INFO_LOG_LENGTH:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003474 *params = shaderObject->getInfoLogLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003475 return;
3476 case GL_SHADER_SOURCE_LENGTH:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003477 *params = shaderObject->getSourceLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003478 return;
zmo@google.coma574f782011-10-03 21:45:23 +00003479 case GL_TRANSLATED_SHADER_SOURCE_LENGTH_ANGLE:
3480 *params = shaderObject->getTranslatedSourceLength();
3481 return;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003482 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003483 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003484 }
3485 }
3486 }
3487 catch(std::bad_alloc&)
3488 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003489 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003490 }
3491}
3492
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00003493void __stdcall glGetShaderInfoLog(GLuint shader, GLsizei bufsize, GLsizei* length, GLchar* infolog)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003494{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003495 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 +00003496 shader, bufsize, length, infolog);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003497
3498 try
3499 {
3500 if (bufsize < 0)
3501 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003502 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003503 }
3504
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003505 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003506
3507 if (context)
3508 {
3509 gl::Shader *shaderObject = context->getShader(shader);
3510
3511 if (!shaderObject)
3512 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003513 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003514 }
3515
3516 shaderObject->getInfoLog(bufsize, length, infolog);
3517 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003518 }
3519 catch(std::bad_alloc&)
3520 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003521 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003522 }
3523}
3524
3525void __stdcall glGetShaderPrecisionFormat(GLenum shadertype, GLenum precisiontype, GLint* range, GLint* precision)
3526{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003527 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 +00003528 shadertype, precisiontype, range, precision);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003529
3530 try
3531 {
daniel@transgaming.com6c785212010-03-30 03:36:17 +00003532 switch (shadertype)
3533 {
3534 case GL_VERTEX_SHADER:
3535 case GL_FRAGMENT_SHADER:
3536 break;
3537 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003538 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com6c785212010-03-30 03:36:17 +00003539 }
3540
3541 switch (precisiontype)
3542 {
3543 case GL_LOW_FLOAT:
3544 case GL_MEDIUM_FLOAT:
3545 case GL_HIGH_FLOAT:
3546 // Assume IEEE 754 precision
3547 range[0] = 127;
3548 range[1] = 127;
daniel@transgaming.comc5c15382010-04-23 18:34:49 +00003549 *precision = 23;
daniel@transgaming.com6c785212010-03-30 03:36:17 +00003550 break;
3551 case GL_LOW_INT:
3552 case GL_MEDIUM_INT:
3553 case GL_HIGH_INT:
3554 // Some (most) hardware only supports single-precision floating-point numbers,
3555 // which can accurately represent integers up to +/-16777216
3556 range[0] = 24;
3557 range[1] = 24;
daniel@transgaming.comc5c15382010-04-23 18:34:49 +00003558 *precision = 0;
daniel@transgaming.com6c785212010-03-30 03:36:17 +00003559 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 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003563 }
3564 catch(std::bad_alloc&)
3565 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003566 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003567 }
3568}
3569
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00003570void __stdcall glGetShaderSource(GLuint shader, GLsizei bufsize, GLsizei* length, GLchar* source)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003571{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003572 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 +00003573 shader, bufsize, length, source);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003574
3575 try
3576 {
3577 if (bufsize < 0)
3578 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003579 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003580 }
3581
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003582 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003583
3584 if (context)
3585 {
3586 gl::Shader *shaderObject = context->getShader(shader);
3587
3588 if (!shaderObject)
3589 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003590 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003591 }
3592
3593 shaderObject->getSource(bufsize, length, source);
3594 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003595 }
3596 catch(std::bad_alloc&)
3597 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003598 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003599 }
3600}
3601
zmo@google.coma574f782011-10-03 21:45:23 +00003602void __stdcall glGetTranslatedShaderSourceANGLE(GLuint shader, GLsizei bufsize, GLsizei* length, GLchar* source)
3603{
3604 EVENT("(GLuint shader = %d, GLsizei bufsize = %d, GLsizei* length = 0x%0.8p, GLchar* source = 0x%0.8p)",
3605 shader, bufsize, length, source);
3606
3607 try
3608 {
3609 if (bufsize < 0)
3610 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003611 return gl::error(GL_INVALID_VALUE);
zmo@google.coma574f782011-10-03 21:45:23 +00003612 }
3613
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003614 gl::Context *context = gl::getNonLostContext();
zmo@google.coma574f782011-10-03 21:45:23 +00003615
3616 if (context)
3617 {
3618 gl::Shader *shaderObject = context->getShader(shader);
3619
3620 if (!shaderObject)
3621 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003622 return gl::error(GL_INVALID_OPERATION);
zmo@google.coma574f782011-10-03 21:45:23 +00003623 }
3624
3625 shaderObject->getTranslatedSource(bufsize, length, source);
3626 }
3627 }
3628 catch(std::bad_alloc&)
3629 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003630 return gl::error(GL_OUT_OF_MEMORY);
zmo@google.coma574f782011-10-03 21:45:23 +00003631 }
3632}
3633
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003634const GLubyte* __stdcall glGetString(GLenum name)
3635{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003636 EVENT("(GLenum name = 0x%X)", name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003637
3638 try
3639 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003640 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com3e4c6002010-05-05 18:50:13 +00003641
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003642 switch (name)
3643 {
3644 case GL_VENDOR:
daniel@transgaming.coma0ce7e62011-01-25 14:47:16 +00003645 return (GLubyte*)"Google Inc.";
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003646 case GL_RENDERER:
daniel@transgaming.comc23ff642011-08-16 20:28:45 +00003647 return (GLubyte*)((context != NULL) ? context->getRendererString() : "ANGLE");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003648 case GL_VERSION:
shannonwoods@chromium.orge2865d02013-05-30 00:06:01 +00003649 if (context->getClientVersion() == 2)
3650 {
3651 return (GLubyte*)"OpenGL ES 2.0 (ANGLE " VERSION_STRING ")";
3652 }
3653 else
3654 {
3655 return (GLubyte*)"OpenGL ES 3.0 (ANGLE " VERSION_STRING ")";
3656 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003657 case GL_SHADING_LANGUAGE_VERSION:
shannonwoods@chromium.orge2865d02013-05-30 00:06:01 +00003658 if (context->getClientVersion() == 2)
3659 {
3660 return (GLubyte*)"OpenGL ES GLSL ES 1.00 (ANGLE " VERSION_STRING ")";
3661 }
3662 else
3663 {
3664 return (GLubyte*)"OpenGL ES GLSL ES 3.00 (ANGLE " VERSION_STRING ")";
3665 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003666 case GL_EXTENSIONS:
shannonwoods@chromium.org302df742013-05-30 00:05:54 +00003667 return (GLubyte*)((context != NULL) ? context->getCombinedExtensionsString() : "");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003668 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003669 return gl::error(GL_INVALID_ENUM, (GLubyte*)NULL);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003670 }
3671 }
3672 catch(std::bad_alloc&)
3673 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003674 return gl::error(GL_OUT_OF_MEMORY, (GLubyte*)NULL);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003675 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003676}
3677
3678void __stdcall glGetTexParameterfv(GLenum target, GLenum pname, GLfloat* params)
3679{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003680 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 +00003681
3682 try
3683 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003684 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003685
3686 if (context)
3687 {
Jamie Madill35d15012013-10-07 10:46:37 -04003688 gl::Texture *texture = GetTargetTexture(context, target);
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003689
Jamie Madillfb8a8302013-07-03 14:24:12 -04003690 if (!texture)
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003691 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003692 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003693 }
3694
3695 switch (pname)
3696 {
3697 case GL_TEXTURE_MAG_FILTER:
3698 *params = (GLfloat)texture->getMagFilter();
3699 break;
3700 case GL_TEXTURE_MIN_FILTER:
3701 *params = (GLfloat)texture->getMinFilter();
3702 break;
3703 case GL_TEXTURE_WRAP_S:
3704 *params = (GLfloat)texture->getWrapS();
3705 break;
3706 case GL_TEXTURE_WRAP_T:
3707 *params = (GLfloat)texture->getWrapT();
3708 break;
shannon.woods%transgaming.com@gtempaccount.com0b3a8df2013-04-13 03:44:51 +00003709 case GL_TEXTURE_WRAP_R:
3710 if (context->getClientVersion() < 3)
3711 {
3712 return gl::error(GL_INVALID_ENUM);
3713 }
3714 *params = (GLfloat)texture->getWrapR();
3715 break;
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00003716 case GL_TEXTURE_IMMUTABLE_FORMAT:
3717 // Exposed to ES2.0 through EXT_texture_storage, no client version validation.
daniel@transgaming.comd30bd0a2011-11-11 04:10:34 +00003718 *params = (GLfloat)(texture->isImmutable() ? GL_TRUE : GL_FALSE);
3719 break;
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00003720 case GL_TEXTURE_IMMUTABLE_LEVELS:
3721 if (context->getClientVersion() < 3)
3722 {
3723 return gl::error(GL_INVALID_ENUM);
3724 }
3725 *params = (GLfloat)(texture->isImmutable() ? texture->levelCount() : 0);
3726 break;
daniel@transgaming.com7d18c172011-11-11 04:18:21 +00003727 case GL_TEXTURE_USAGE_ANGLE:
3728 *params = (GLfloat)texture->getUsage();
3729 break;
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00003730 case GL_TEXTURE_MAX_ANISOTROPY_EXT:
3731 if (!context->supportsTextureFilterAnisotropy())
3732 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003733 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00003734 }
3735 *params = (GLfloat)texture->getMaxAnisotropy();
3736 break;
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003737 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003738 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003739 }
3740 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003741 }
3742 catch(std::bad_alloc&)
3743 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003744 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003745 }
3746}
3747
3748void __stdcall glGetTexParameteriv(GLenum target, GLenum pname, GLint* params)
3749{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003750 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 +00003751
3752 try
3753 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003754 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003755
3756 if (context)
3757 {
Jamie Madill35d15012013-10-07 10:46:37 -04003758 gl::Texture *texture = GetTargetTexture(context, target);
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003759
Jamie Madillfb8a8302013-07-03 14:24:12 -04003760 if (!texture)
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003761 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003762 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003763 }
3764
3765 switch (pname)
3766 {
3767 case GL_TEXTURE_MAG_FILTER:
3768 *params = texture->getMagFilter();
3769 break;
3770 case GL_TEXTURE_MIN_FILTER:
3771 *params = texture->getMinFilter();
3772 break;
3773 case GL_TEXTURE_WRAP_S:
3774 *params = texture->getWrapS();
3775 break;
3776 case GL_TEXTURE_WRAP_T:
3777 *params = texture->getWrapT();
3778 break;
shannon.woods%transgaming.com@gtempaccount.com0b3a8df2013-04-13 03:44:51 +00003779 case GL_TEXTURE_WRAP_R:
3780 if (context->getClientVersion() < 3)
3781 {
3782 return gl::error(GL_INVALID_ENUM);
3783 }
3784 *params = texture->getWrapR();
3785 break;
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00003786 case GL_TEXTURE_IMMUTABLE_FORMAT:
3787 // Exposed to ES2.0 through EXT_texture_storage, no client version validation.
daniel@transgaming.comd30bd0a2011-11-11 04:10:34 +00003788 *params = texture->isImmutable() ? GL_TRUE : GL_FALSE;
3789 break;
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00003790 case GL_TEXTURE_IMMUTABLE_LEVELS:
3791 if (context->getClientVersion() < 3)
3792 {
3793 return gl::error(GL_INVALID_ENUM);
3794 }
3795 *params = texture->isImmutable() ? texture->levelCount() : 0;
3796 break;
daniel@transgaming.com7d18c172011-11-11 04:18:21 +00003797 case GL_TEXTURE_USAGE_ANGLE:
3798 *params = texture->getUsage();
3799 break;
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00003800 case GL_TEXTURE_MAX_ANISOTROPY_EXT:
3801 if (!context->supportsTextureFilterAnisotropy())
3802 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003803 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00003804 }
3805 *params = (GLint)texture->getMaxAnisotropy();
3806 break;
shannonwoods@chromium.orgabf14cc2013-05-30 00:20:58 +00003807
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003808 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003809 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003810 }
3811 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003812 }
3813 catch(std::bad_alloc&)
3814 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003815 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003816 }
3817}
3818
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003819void __stdcall glGetnUniformfvEXT(GLuint program, GLint location, GLsizei bufSize, GLfloat* params)
3820{
3821 EVENT("(GLuint program = %d, GLint location = %d, GLsizei bufSize = %d, GLfloat* params = 0x%0.8p)",
3822 program, location, bufSize, params);
3823
3824 try
3825 {
3826 if (bufSize < 0)
3827 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003828 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003829 }
3830
3831 gl::Context *context = gl::getNonLostContext();
3832
3833 if (context)
3834 {
3835 if (program == 0)
3836 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003837 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003838 }
3839
3840 gl::Program *programObject = context->getProgram(program);
3841
daniel@transgaming.com716056c2012-07-24 18:38:59 +00003842 if (!programObject || !programObject->isLinked())
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003843 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003844 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003845 }
3846
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003847 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
3848 if (!programBinary)
3849 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003850 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003851 }
3852
3853 if (!programBinary->getUniformfv(location, &bufSize, params))
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003854 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003855 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003856 }
3857 }
3858 }
3859 catch(std::bad_alloc&)
3860 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003861 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003862 }
3863}
3864
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003865void __stdcall glGetUniformfv(GLuint program, GLint location, GLfloat* params)
3866{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003867 EVENT("(GLuint program = %d, GLint location = %d, GLfloat* params = 0x%0.8p)", program, location, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003868
3869 try
3870 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003871 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003872
3873 if (context)
3874 {
3875 if (program == 0)
3876 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003877 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003878 }
3879
3880 gl::Program *programObject = context->getProgram(program);
3881
daniel@transgaming.com716056c2012-07-24 18:38:59 +00003882 if (!programObject || !programObject->isLinked())
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003883 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003884 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003885 }
3886
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003887 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
3888 if (!programBinary)
3889 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003890 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003891 }
3892
3893 if (!programBinary->getUniformfv(location, NULL, params))
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003894 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003895 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003896 }
3897 }
3898 }
3899 catch(std::bad_alloc&)
3900 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003901 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003902 }
3903}
3904
3905void __stdcall glGetnUniformivEXT(GLuint program, GLint location, GLsizei bufSize, GLint* params)
3906{
3907 EVENT("(GLuint program = %d, GLint location = %d, GLsizei bufSize = %d, GLint* params = 0x%0.8p)",
3908 program, location, bufSize, params);
3909
3910 try
3911 {
3912 if (bufSize < 0)
3913 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003914 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003915 }
3916
3917 gl::Context *context = gl::getNonLostContext();
3918
3919 if (context)
3920 {
3921 if (program == 0)
3922 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003923 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003924 }
3925
3926 gl::Program *programObject = context->getProgram(program);
3927
daniel@transgaming.com716056c2012-07-24 18:38:59 +00003928 if (!programObject || !programObject->isLinked())
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003929 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003930 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003931 }
3932
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003933 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
3934 if (!programBinary)
3935 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003936 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003937 }
3938
3939 if (!programBinary->getUniformiv(location, &bufSize, params))
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003940 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003941 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003942 }
3943 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003944 }
3945 catch(std::bad_alloc&)
3946 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003947 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003948 }
3949}
3950
3951void __stdcall glGetUniformiv(GLuint program, GLint location, GLint* params)
3952{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003953 EVENT("(GLuint program = %d, GLint location = %d, GLint* params = 0x%0.8p)", program, location, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003954
3955 try
3956 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003957 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003958
3959 if (context)
3960 {
3961 if (program == 0)
3962 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003963 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003964 }
3965
3966 gl::Program *programObject = context->getProgram(program);
3967
daniel@transgaming.com716056c2012-07-24 18:38:59 +00003968 if (!programObject || !programObject->isLinked())
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003969 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003970 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003971 }
3972
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003973 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
3974 if (!programBinary)
3975 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003976 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003977 }
3978
3979 if (!programBinary->getUniformiv(location, NULL, params))
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003980 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003981 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003982 }
3983 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003984 }
3985 catch(std::bad_alloc&)
3986 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003987 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003988 }
3989}
3990
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00003991int __stdcall glGetUniformLocation(GLuint program, const GLchar* name)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003992{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003993 EVENT("(GLuint program = %d, const GLchar* name = 0x%0.8p)", program, name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003994
3995 try
3996 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003997 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003998
3999 if (strstr(name, "gl_") == name)
4000 {
4001 return -1;
4002 }
4003
4004 if (context)
4005 {
4006 gl::Program *programObject = context->getProgram(program);
4007
4008 if (!programObject)
4009 {
daniel@transgaming.comd1abe5b2010-04-13 19:53:33 +00004010 if (context->getShader(program))
4011 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004012 return gl::error(GL_INVALID_OPERATION, -1);
daniel@transgaming.comd1abe5b2010-04-13 19:53:33 +00004013 }
4014 else
4015 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004016 return gl::error(GL_INVALID_VALUE, -1);
daniel@transgaming.comd1abe5b2010-04-13 19:53:33 +00004017 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004018 }
4019
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00004020 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
daniel@transgaming.com716056c2012-07-24 18:38:59 +00004021 if (!programObject->isLinked() || !programBinary)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004022 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004023 return gl::error(GL_INVALID_OPERATION, -1);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004024 }
4025
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00004026 return programBinary->getUniformLocation(name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004027 }
4028 }
4029 catch(std::bad_alloc&)
4030 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004031 return gl::error(GL_OUT_OF_MEMORY, -1);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004032 }
4033
4034 return -1;
4035}
4036
4037void __stdcall glGetVertexAttribfv(GLuint index, GLenum pname, GLfloat* params)
4038{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004039 EVENT("(GLuint index = %d, GLenum pname = 0x%X, GLfloat* params = 0x%0.8p)", index, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004040
4041 try
4042 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004043 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004044
daniel@transgaming.come0078962010-04-15 20:45:08 +00004045 if (context)
4046 {
4047 if (index >= gl::MAX_VERTEX_ATTRIBS)
4048 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004049 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004050 }
4051
daniel@transgaming.com83921382011-01-08 05:46:00 +00004052 const gl::VertexAttribute &attribState = context->getVertexAttribState(index);
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004053
Geoff Lang34dbb6f2013-08-05 15:05:47 -04004054 if (!gl::ValidateGetVertexAttribParameters(pname, context->getClientVersion()))
daniel@transgaming.come0078962010-04-15 20:45:08 +00004055 {
Jamie Madillaff71502013-07-02 11:57:05 -04004056 return;
4057 }
4058
4059 if (pname == GL_CURRENT_VERTEX_ATTRIB)
4060 {
4061 const gl::VertexAttribCurrentValueData &currentValueData = context->getVertexAttribCurrentValue(index);
4062 for (int i = 0; i < 4; ++i)
daniel@transgaming.come0078962010-04-15 20:45:08 +00004063 {
Jamie Madillaff71502013-07-02 11:57:05 -04004064 params[i] = currentValueData.FloatValues[i];
daniel@transgaming.come0078962010-04-15 20:45:08 +00004065 }
Jamie Madillaff71502013-07-02 11:57:05 -04004066 }
4067 else
4068 {
4069 *params = attribState.querySingleParameter<GLfloat>(pname);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004070 }
4071 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004072 }
4073 catch(std::bad_alloc&)
4074 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004075 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004076 }
4077}
4078
4079void __stdcall glGetVertexAttribiv(GLuint index, GLenum pname, GLint* params)
4080{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004081 EVENT("(GLuint index = %d, GLenum pname = 0x%X, GLint* params = 0x%0.8p)", index, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004082
4083 try
4084 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004085 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004086
daniel@transgaming.come0078962010-04-15 20:45:08 +00004087 if (context)
4088 {
4089 if (index >= gl::MAX_VERTEX_ATTRIBS)
4090 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004091 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004092 }
4093
daniel@transgaming.com83921382011-01-08 05:46:00 +00004094 const gl::VertexAttribute &attribState = context->getVertexAttribState(index);
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004095
Geoff Lang34dbb6f2013-08-05 15:05:47 -04004096 if (!gl::ValidateGetVertexAttribParameters(pname, context->getClientVersion()))
daniel@transgaming.come0078962010-04-15 20:45:08 +00004097 {
Jamie Madillaff71502013-07-02 11:57:05 -04004098 return;
4099 }
4100
4101 if (pname == GL_CURRENT_VERTEX_ATTRIB)
4102 {
4103 const gl::VertexAttribCurrentValueData &currentValueData = context->getVertexAttribCurrentValue(index);
4104 for (int i = 0; i < 4; ++i)
daniel@transgaming.come0078962010-04-15 20:45:08 +00004105 {
Jamie Madillaff71502013-07-02 11:57:05 -04004106 float currentValue = currentValueData.FloatValues[i];
Jamie Madillaf496912013-07-19 16:36:54 -04004107 params[i] = gl::iround<GLint>(currentValue);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004108 }
Jamie Madillaff71502013-07-02 11:57:05 -04004109 }
4110 else
4111 {
4112 *params = attribState.querySingleParameter<GLint>(pname);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004113 }
4114 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004115 }
4116 catch(std::bad_alloc&)
4117 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004118 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004119 }
4120}
4121
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00004122void __stdcall glGetVertexAttribPointerv(GLuint index, GLenum pname, GLvoid** pointer)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004123{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004124 EVENT("(GLuint index = %d, GLenum pname = 0x%X, GLvoid** pointer = 0x%0.8p)", index, pname, pointer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004125
4126 try
4127 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004128 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004129
daniel@transgaming.come0078962010-04-15 20:45:08 +00004130 if (context)
4131 {
4132 if (index >= gl::MAX_VERTEX_ATTRIBS)
4133 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004134 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004135 }
4136
4137 if (pname != GL_VERTEX_ATTRIB_ARRAY_POINTER)
4138 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004139 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004140 }
4141
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004142 *pointer = const_cast<GLvoid*>(context->getVertexAttribPointer(index));
daniel@transgaming.come0078962010-04-15 20:45:08 +00004143 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004144 }
4145 catch(std::bad_alloc&)
4146 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004147 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004148 }
4149}
4150
4151void __stdcall glHint(GLenum target, GLenum mode)
4152{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004153 EVENT("(GLenum target = 0x%X, GLenum mode = 0x%X)", target, mode);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004154
4155 try
4156 {
alokp@chromium.orgd303ef92010-09-09 17:30:15 +00004157 switch (mode)
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00004158 {
alokp@chromium.orgd303ef92010-09-09 17:30:15 +00004159 case GL_FASTEST:
4160 case GL_NICEST:
4161 case GL_DONT_CARE:
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00004162 break;
4163 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004164 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00004165 }
4166
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004167 gl::Context *context = gl::getNonLostContext();
alokp@chromium.orgd303ef92010-09-09 17:30:15 +00004168 switch (target)
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00004169 {
alokp@chromium.orgd303ef92010-09-09 17:30:15 +00004170 case GL_GENERATE_MIPMAP_HINT:
4171 if (context) context->setGenerateMipmapHint(mode);
4172 break;
4173 case GL_FRAGMENT_SHADER_DERIVATIVE_HINT_OES:
4174 if (context) context->setFragmentShaderDerivativeHint(mode);
4175 break;
4176 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004177 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00004178 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004179 }
4180 catch(std::bad_alloc&)
4181 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004182 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004183 }
4184}
4185
4186GLboolean __stdcall glIsBuffer(GLuint buffer)
4187{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004188 EVENT("(GLuint buffer = %d)", buffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004189
4190 try
4191 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004192 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004193
4194 if (context && buffer)
4195 {
4196 gl::Buffer *bufferObject = context->getBuffer(buffer);
4197
4198 if (bufferObject)
4199 {
4200 return GL_TRUE;
4201 }
4202 }
4203 }
4204 catch(std::bad_alloc&)
4205 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004206 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004207 }
4208
4209 return GL_FALSE;
4210}
4211
4212GLboolean __stdcall glIsEnabled(GLenum cap)
4213{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004214 EVENT("(GLenum cap = 0x%X)", cap);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004215
4216 try
4217 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004218 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004219
4220 if (context)
4221 {
4222 switch (cap)
4223 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004224 case GL_CULL_FACE: return context->isCullFaceEnabled();
4225 case GL_POLYGON_OFFSET_FILL: return context->isPolygonOffsetFillEnabled();
4226 case GL_SAMPLE_ALPHA_TO_COVERAGE: return context->isSampleAlphaToCoverageEnabled();
4227 case GL_SAMPLE_COVERAGE: return context->isSampleCoverageEnabled();
4228 case GL_SCISSOR_TEST: return context->isScissorTestEnabled();
4229 case GL_STENCIL_TEST: return context->isStencilTestEnabled();
4230 case GL_DEPTH_TEST: return context->isDepthTestEnabled();
4231 case GL_BLEND: return context->isBlendEnabled();
4232 case GL_DITHER: return context->isDitherEnabled();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004233 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004234 return gl::error(GL_INVALID_ENUM, false);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004235 }
4236 }
4237 }
4238 catch(std::bad_alloc&)
4239 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004240 return gl::error(GL_OUT_OF_MEMORY, false);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004241 }
4242
4243 return false;
4244}
4245
daniel@transgaming.comfe208882010-09-01 15:47:57 +00004246GLboolean __stdcall glIsFenceNV(GLuint fence)
4247{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004248 EVENT("(GLuint fence = %d)", fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004249
4250 try
4251 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004252 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004253
4254 if (context)
4255 {
Jamie Madill33dc8432013-07-26 11:55:05 -04004256 gl::FenceNV *fenceObject = context->getFenceNV(fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004257
4258 if (fenceObject == NULL)
4259 {
4260 return GL_FALSE;
4261 }
4262
4263 return fenceObject->isFence();
4264 }
4265 }
4266 catch(std::bad_alloc&)
4267 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004268 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004269 }
4270
4271 return GL_FALSE;
daniel@transgaming.comfe208882010-09-01 15:47:57 +00004272}
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004273
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004274GLboolean __stdcall glIsFramebuffer(GLuint framebuffer)
4275{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004276 EVENT("(GLuint framebuffer = %d)", framebuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004277
4278 try
4279 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004280 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004281
4282 if (context && framebuffer)
4283 {
4284 gl::Framebuffer *framebufferObject = context->getFramebuffer(framebuffer);
4285
4286 if (framebufferObject)
4287 {
4288 return GL_TRUE;
4289 }
4290 }
4291 }
4292 catch(std::bad_alloc&)
4293 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004294 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004295 }
4296
4297 return GL_FALSE;
4298}
4299
4300GLboolean __stdcall glIsProgram(GLuint program)
4301{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004302 EVENT("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004303
4304 try
4305 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004306 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004307
4308 if (context && program)
4309 {
4310 gl::Program *programObject = context->getProgram(program);
4311
4312 if (programObject)
4313 {
4314 return GL_TRUE;
4315 }
4316 }
4317 }
4318 catch(std::bad_alloc&)
4319 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004320 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004321 }
4322
4323 return GL_FALSE;
4324}
4325
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00004326GLboolean __stdcall glIsQueryEXT(GLuint id)
4327{
4328 EVENT("(GLuint id = %d)", id);
4329
4330 try
4331 {
4332 if (id == 0)
4333 {
4334 return GL_FALSE;
4335 }
4336
4337 gl::Context *context = gl::getNonLostContext();
4338
4339 if (context)
4340 {
4341 gl::Query *queryObject = context->getQuery(id, false, GL_NONE);
4342
4343 if (queryObject)
4344 {
4345 return GL_TRUE;
4346 }
4347 }
4348 }
4349 catch(std::bad_alloc&)
4350 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004351 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00004352 }
4353
4354 return GL_FALSE;
4355}
4356
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004357GLboolean __stdcall glIsRenderbuffer(GLuint renderbuffer)
4358{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004359 EVENT("(GLuint renderbuffer = %d)", renderbuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004360
4361 try
4362 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004363 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004364
4365 if (context && renderbuffer)
4366 {
4367 gl::Renderbuffer *renderbufferObject = context->getRenderbuffer(renderbuffer);
4368
4369 if (renderbufferObject)
4370 {
4371 return GL_TRUE;
4372 }
4373 }
4374 }
4375 catch(std::bad_alloc&)
4376 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004377 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004378 }
4379
4380 return GL_FALSE;
4381}
4382
4383GLboolean __stdcall glIsShader(GLuint shader)
4384{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004385 EVENT("(GLuint shader = %d)", shader);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004386
4387 try
4388 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004389 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004390
4391 if (context && shader)
4392 {
4393 gl::Shader *shaderObject = context->getShader(shader);
4394
4395 if (shaderObject)
4396 {
4397 return GL_TRUE;
4398 }
4399 }
4400 }
4401 catch(std::bad_alloc&)
4402 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004403 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004404 }
4405
4406 return GL_FALSE;
4407}
4408
4409GLboolean __stdcall glIsTexture(GLuint texture)
4410{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004411 EVENT("(GLuint texture = %d)", texture);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004412
4413 try
4414 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004415 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004416
4417 if (context && texture)
4418 {
4419 gl::Texture *textureObject = context->getTexture(texture);
4420
4421 if (textureObject)
4422 {
4423 return GL_TRUE;
4424 }
4425 }
4426 }
4427 catch(std::bad_alloc&)
4428 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004429 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004430 }
4431
4432 return GL_FALSE;
4433}
4434
4435void __stdcall glLineWidth(GLfloat width)
4436{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004437 EVENT("(GLfloat width = %f)", width);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004438
4439 try
4440 {
4441 if (width <= 0.0f)
4442 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004443 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004444 }
4445
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004446 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com32e58cd2010-03-24 09:44:10 +00004447
4448 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004449 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004450 context->setLineWidth(width);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004451 }
4452 }
4453 catch(std::bad_alloc&)
4454 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004455 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004456 }
4457}
4458
4459void __stdcall glLinkProgram(GLuint program)
4460{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004461 EVENT("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004462
4463 try
4464 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004465 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004466
4467 if (context)
4468 {
4469 gl::Program *programObject = context->getProgram(program);
4470
4471 if (!programObject)
4472 {
daniel@transgaming.com277b7142010-04-13 03:26:44 +00004473 if (context->getShader(program))
4474 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004475 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com277b7142010-04-13 03:26:44 +00004476 }
4477 else
4478 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004479 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com277b7142010-04-13 03:26:44 +00004480 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004481 }
4482
daniel@transgaming.com95d29422012-07-24 18:36:10 +00004483 context->linkProgram(program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004484 }
4485 }
4486 catch(std::bad_alloc&)
4487 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004488 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004489 }
4490}
4491
4492void __stdcall glPixelStorei(GLenum pname, GLint param)
4493{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004494 EVENT("(GLenum pname = 0x%X, GLint param = %d)", pname, param);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004495
4496 try
4497 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004498 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004499
4500 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004501 {
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004502 switch (pname)
4503 {
4504 case GL_UNPACK_ALIGNMENT:
4505 if (param != 1 && param != 2 && param != 4 && param != 8)
4506 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004507 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004508 }
4509
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004510 context->setUnpackAlignment(param);
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004511 break;
4512
4513 case GL_PACK_ALIGNMENT:
4514 if (param != 1 && param != 2 && param != 4 && param != 8)
4515 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004516 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004517 }
4518
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004519 context->setPackAlignment(param);
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004520 break;
4521
bsalomon@google.com56d46ab2011-11-23 14:53:10 +00004522 case GL_PACK_REVERSE_ROW_ORDER_ANGLE:
4523 context->setPackReverseRowOrder(param != 0);
4524 break;
4525
shannonwoods@chromium.orgabf14cc2013-05-30 00:20:58 +00004526 case GL_UNPACK_IMAGE_HEIGHT:
4527 case GL_UNPACK_SKIP_IMAGES:
4528 case GL_UNPACK_ROW_LENGTH:
4529 case GL_UNPACK_SKIP_ROWS:
4530 case GL_UNPACK_SKIP_PIXELS:
4531 case GL_PACK_ROW_LENGTH:
4532 case GL_PACK_SKIP_ROWS:
4533 case GL_PACK_SKIP_PIXELS:
4534 if (context->getClientVersion() < 3)
4535 {
4536 return gl::error(GL_INVALID_ENUM);
4537 }
4538 UNIMPLEMENTED();
4539 break;
4540
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004541 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004542 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004543 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004544 }
4545 }
4546 catch(std::bad_alloc&)
4547 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004548 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004549 }
4550}
4551
4552void __stdcall glPolygonOffset(GLfloat factor, GLfloat units)
4553{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004554 EVENT("(GLfloat factor = %f, GLfloat units = %f)", factor, units);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004555
4556 try
4557 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004558 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comaede6302010-04-29 03:35:48 +00004559
4560 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004561 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004562 context->setPolygonOffsetParams(factor, units);
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
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00004571void __stdcall glReadnPixelsEXT(GLint x, GLint y, GLsizei width, GLsizei height,
4572 GLenum format, GLenum type, GLsizei bufSize,
4573 GLvoid *data)
4574{
4575 EVENT("(GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d, "
4576 "GLenum format = 0x%X, GLenum type = 0x%X, GLsizei bufSize = 0x%d, GLvoid *data = 0x%0.8p)",
4577 x, y, width, height, format, type, bufSize, data);
4578
4579 try
4580 {
4581 if (width < 0 || height < 0 || bufSize < 0)
4582 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004583 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00004584 }
4585
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00004586 gl::Context *context = gl::getNonLostContext();
4587
4588 if (context)
4589 {
shannonwoods@chromium.org44a4f982013-05-30 00:13:49 +00004590 GLint currentInternalFormat;
daniel@transgaming.com42944b02012-09-27 17:45:57 +00004591 GLenum currentFormat, currentType;
shannonwoods@chromium.org44a4f982013-05-30 00:13:49 +00004592
daniel@transgaming.com42944b02012-09-27 17:45:57 +00004593 // Failure in getCurrentReadFormatType indicates that no color attachment is currently bound,
4594 // and attempting to read back if that's the case is an error. The error will be registered
4595 // by getCurrentReadFormat.
shannonwoods@chromium.org44a4f982013-05-30 00:13:49 +00004596 if (!context->getCurrentReadFormatType(&currentInternalFormat, &currentFormat, &currentType))
daniel@transgaming.com42944b02012-09-27 17:45:57 +00004597 return;
4598
Geoff Lang34dbb6f2013-08-05 15:05:47 -04004599 bool validReadFormat = (context->getClientVersion() < 3) ? gl::ValidES2ReadFormatType(format, type) :
4600 gl::ValidES3ReadFormatType(currentInternalFormat, format, type);
shannonwoods@chromium.org44a4f982013-05-30 00:13:49 +00004601
4602 if (!(currentFormat == format && currentType == type) && !validReadFormat)
daniel@transgaming.com42944b02012-09-27 17:45:57 +00004603 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004604 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com42944b02012-09-27 17:45:57 +00004605 }
4606
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00004607 context->readPixels(x, y, width, height, format, type, &bufSize, data);
4608 }
4609 }
4610 catch(std::bad_alloc&)
4611 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004612 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00004613 }
4614}
4615
4616void __stdcall glReadPixels(GLint x, GLint y, GLsizei width, GLsizei height,
4617 GLenum format, GLenum type, GLvoid* pixels)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004618{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004619 EVENT("(GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00004620 "GLenum format = 0x%X, GLenum type = 0x%X, GLvoid* pixels = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00004621 x, y, width, height, format, type, pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004622
4623 try
4624 {
4625 if (width < 0 || height < 0)
4626 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004627 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004628 }
4629
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004630 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004631
4632 if (context)
4633 {
shannonwoods@chromium.org44a4f982013-05-30 00:13:49 +00004634 GLint currentInternalFormat;
daniel@transgaming.com42944b02012-09-27 17:45:57 +00004635 GLenum currentFormat, currentType;
shannonwoods@chromium.org44a4f982013-05-30 00:13:49 +00004636
daniel@transgaming.com42944b02012-09-27 17:45:57 +00004637 // Failure in getCurrentReadFormatType indicates that no color attachment is currently bound,
4638 // and attempting to read back if that's the case is an error. The error will be registered
4639 // by getCurrentReadFormat.
shannonwoods@chromium.org44a4f982013-05-30 00:13:49 +00004640 if (!context->getCurrentReadFormatType(&currentInternalFormat, &currentFormat, &currentType))
daniel@transgaming.com42944b02012-09-27 17:45:57 +00004641 return;
4642
Geoff Lang34dbb6f2013-08-05 15:05:47 -04004643 bool validReadFormat = (context->getClientVersion() < 3) ? gl::ValidES2ReadFormatType(format, type) :
4644 gl::ValidES3ReadFormatType(currentInternalFormat, format, type);
shannonwoods@chromium.org44a4f982013-05-30 00:13:49 +00004645
4646 if (!(currentFormat == format && currentType == type) && !validReadFormat)
daniel@transgaming.com42944b02012-09-27 17:45:57 +00004647 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004648 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com42944b02012-09-27 17:45:57 +00004649 }
4650
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00004651 context->readPixels(x, y, width, height, format, type, NULL, pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004652 }
4653 }
4654 catch(std::bad_alloc&)
4655 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004656 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004657 }
4658}
4659
4660void __stdcall glReleaseShaderCompiler(void)
4661{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004662 EVENT("()");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004663
4664 try
4665 {
4666 gl::Shader::releaseCompiler();
4667 }
4668 catch(std::bad_alloc&)
4669 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004670 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004671 }
4672}
4673
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00004674void __stdcall glRenderbufferStorageMultisampleANGLE(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004675{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004676 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 +00004677 target, samples, internalformat, width, height);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004678
4679 try
4680 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004681 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004682
4683 if (context)
4684 {
Geoff Lang34dbb6f2013-08-05 15:05:47 -04004685 if (!ValidateRenderbufferStorageParameters(context, target, samples, internalformat,
Geoff Lang2e1dcd52013-05-29 10:34:08 -04004686 width, height, true))
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +00004687 {
Geoff Lang2e1dcd52013-05-29 10:34:08 -04004688 return;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004689 }
shannon.woods%transgaming.com@gtempaccount.com8dce6512013-04-13 03:42:19 +00004690
4691 context->setRenderbufferStorage(width, height, internalformat, samples);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004692 }
4693 }
4694 catch(std::bad_alloc&)
4695 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004696 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004697 }
4698}
4699
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00004700void __stdcall glRenderbufferStorage(GLenum target, GLenum internalformat, GLsizei width, GLsizei height)
4701{
4702 glRenderbufferStorageMultisampleANGLE(target, 0, internalformat, width, height);
4703}
4704
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004705void __stdcall glSampleCoverage(GLclampf value, GLboolean invert)
4706{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00004707 EVENT("(GLclampf value = %f, GLboolean invert = %u)", value, invert);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004708
4709 try
4710 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004711 gl::Context* context = gl::getNonLostContext();
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00004712
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004713 if (context)
4714 {
daniel@transgaming.coma36f98e2010-05-18 18:51:09 +00004715 context->setSampleCoverageParams(gl::clamp01(value), invert == GL_TRUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004716 }
4717 }
4718 catch(std::bad_alloc&)
4719 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004720 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004721 }
4722}
4723
daniel@transgaming.comfe208882010-09-01 15:47:57 +00004724void __stdcall glSetFenceNV(GLuint fence, GLenum condition)
4725{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004726 EVENT("(GLuint fence = %d, GLenum condition = 0x%X)", fence, condition);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004727
4728 try
4729 {
4730 if (condition != GL_ALL_COMPLETED_NV)
4731 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004732 return gl::error(GL_INVALID_ENUM);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004733 }
4734
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004735 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004736
4737 if (context)
4738 {
Jamie Madill33dc8432013-07-26 11:55:05 -04004739 gl::FenceNV *fenceObject = context->getFenceNV(fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004740
4741 if (fenceObject == NULL)
4742 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004743 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004744 }
4745
4746 fenceObject->setFence(condition);
4747 }
4748 }
4749 catch(std::bad_alloc&)
4750 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004751 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004752 }
daniel@transgaming.comfe208882010-09-01 15:47:57 +00004753}
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004754
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004755void __stdcall glScissor(GLint x, GLint y, GLsizei width, GLsizei height)
4756{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004757 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 +00004758
4759 try
4760 {
4761 if (width < 0 || height < 0)
4762 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004763 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004764 }
4765
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004766 gl::Context* context = gl::getNonLostContext();
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00004767
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004768 if (context)
4769 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004770 context->setScissorParams(x, y, width, height);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004771 }
4772 }
4773 catch(std::bad_alloc&)
4774 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004775 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004776 }
4777}
4778
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00004779void __stdcall glShaderBinary(GLsizei n, const GLuint* shaders, GLenum binaryformat, const GLvoid* binary, GLsizei length)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004780{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004781 EVENT("(GLsizei n = %d, const GLuint* shaders = 0x%0.8p, GLenum binaryformat = 0x%X, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00004782 "const GLvoid* binary = 0x%0.8p, GLsizei length = %d)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00004783 n, shaders, binaryformat, binary, length);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004784
4785 try
4786 {
daniel@transgaming.comd1f667f2010-04-29 03:38:52 +00004787 // No binary shader formats are supported.
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004788 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004789 }
4790 catch(std::bad_alloc&)
4791 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004792 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004793 }
4794}
4795
shannon.woods%transgaming.com@gtempaccount.com5f339332013-04-13 03:29:02 +00004796void __stdcall glShaderSource(GLuint shader, GLsizei count, const GLchar* const* string, const GLint* length)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004797{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004798 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 +00004799 shader, count, string, length);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004800
4801 try
4802 {
daniel@transgaming.com8e6a6be2010-04-13 03:26:41 +00004803 if (count < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004804 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004805 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004806 }
4807
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004808 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004809
4810 if (context)
4811 {
4812 gl::Shader *shaderObject = context->getShader(shader);
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00004813
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004814 if (!shaderObject)
4815 {
daniel@transgaming.com8e6a6be2010-04-13 03:26:41 +00004816 if (context->getProgram(shader))
4817 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004818 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com8e6a6be2010-04-13 03:26:41 +00004819 }
4820 else
4821 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004822 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com8e6a6be2010-04-13 03:26:41 +00004823 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004824 }
4825
4826 shaderObject->setSource(count, string, length);
4827 }
4828 }
4829 catch(std::bad_alloc&)
4830 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004831 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004832 }
4833}
4834
4835void __stdcall glStencilFunc(GLenum func, GLint ref, GLuint mask)
4836{
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00004837 glStencilFuncSeparate(GL_FRONT_AND_BACK, func, ref, mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004838}
4839
4840void __stdcall glStencilFuncSeparate(GLenum face, GLenum func, GLint ref, GLuint mask)
4841{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004842 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 +00004843
4844 try
4845 {
4846 switch (face)
4847 {
4848 case GL_FRONT:
4849 case GL_BACK:
4850 case GL_FRONT_AND_BACK:
4851 break;
4852 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004853 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004854 }
4855
4856 switch (func)
4857 {
4858 case GL_NEVER:
4859 case GL_ALWAYS:
4860 case GL_LESS:
4861 case GL_LEQUAL:
4862 case GL_EQUAL:
4863 case GL_GEQUAL:
4864 case GL_GREATER:
4865 case GL_NOTEQUAL:
4866 break;
4867 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004868 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004869 }
4870
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004871 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004872
4873 if (context)
4874 {
4875 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
4876 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004877 context->setStencilParams(func, ref, mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004878 }
4879
4880 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
4881 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004882 context->setStencilBackParams(func, ref, mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004883 }
4884 }
4885 }
4886 catch(std::bad_alloc&)
4887 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004888 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004889 }
4890}
4891
4892void __stdcall glStencilMask(GLuint mask)
4893{
4894 glStencilMaskSeparate(GL_FRONT_AND_BACK, mask);
4895}
4896
4897void __stdcall glStencilMaskSeparate(GLenum face, GLuint mask)
4898{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004899 EVENT("(GLenum face = 0x%X, GLuint mask = %d)", face, mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004900
4901 try
4902 {
4903 switch (face)
4904 {
4905 case GL_FRONT:
4906 case GL_BACK:
4907 case GL_FRONT_AND_BACK:
4908 break;
4909 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004910 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004911 }
4912
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004913 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004914
4915 if (context)
4916 {
4917 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
4918 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004919 context->setStencilWritemask(mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004920 }
4921
4922 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
4923 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004924 context->setStencilBackWritemask(mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004925 }
4926 }
4927 }
4928 catch(std::bad_alloc&)
4929 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004930 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004931 }
4932}
4933
4934void __stdcall glStencilOp(GLenum fail, GLenum zfail, GLenum zpass)
4935{
4936 glStencilOpSeparate(GL_FRONT_AND_BACK, fail, zfail, zpass);
4937}
4938
4939void __stdcall glStencilOpSeparate(GLenum face, GLenum fail, GLenum zfail, GLenum zpass)
4940{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004941 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 +00004942 face, fail, zfail, zpass);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004943
4944 try
4945 {
4946 switch (face)
4947 {
4948 case GL_FRONT:
4949 case GL_BACK:
4950 case GL_FRONT_AND_BACK:
4951 break;
4952 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004953 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004954 }
4955
4956 switch (fail)
4957 {
4958 case GL_ZERO:
4959 case GL_KEEP:
4960 case GL_REPLACE:
4961 case GL_INCR:
4962 case GL_DECR:
4963 case GL_INVERT:
4964 case GL_INCR_WRAP:
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00004965 case GL_DECR_WRAP:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004966 break;
4967 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004968 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004969 }
4970
4971 switch (zfail)
4972 {
4973 case GL_ZERO:
4974 case GL_KEEP:
4975 case GL_REPLACE:
4976 case GL_INCR:
4977 case GL_DECR:
4978 case GL_INVERT:
4979 case GL_INCR_WRAP:
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00004980 case GL_DECR_WRAP:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004981 break;
4982 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004983 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004984 }
4985
4986 switch (zpass)
4987 {
4988 case GL_ZERO:
4989 case GL_KEEP:
4990 case GL_REPLACE:
4991 case GL_INCR:
4992 case GL_DECR:
4993 case GL_INVERT:
4994 case GL_INCR_WRAP:
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00004995 case GL_DECR_WRAP:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004996 break;
4997 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004998 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004999 }
5000
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005001 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005002
5003 if (context)
5004 {
5005 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
5006 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00005007 context->setStencilOperations(fail, zfail, zpass);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005008 }
5009
5010 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
5011 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00005012 context->setStencilBackOperations(fail, zfail, zpass);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005013 }
5014 }
5015 }
5016 catch(std::bad_alloc&)
5017 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005018 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005019 }
5020}
5021
daniel@transgaming.comfe208882010-09-01 15:47:57 +00005022GLboolean __stdcall glTestFenceNV(GLuint fence)
5023{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005024 EVENT("(GLuint fence = %d)", fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005025
5026 try
5027 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005028 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005029
5030 if (context)
5031 {
Jamie Madill33dc8432013-07-26 11:55:05 -04005032 gl::FenceNV *fenceObject = context->getFenceNV(fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005033
5034 if (fenceObject == NULL)
5035 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005036 return gl::error(GL_INVALID_OPERATION, GL_TRUE);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005037 }
5038
Jamie Madillfb9a7402013-07-26 11:55:01 -04005039 if (fenceObject->isFence() != GL_TRUE)
5040 {
5041 return gl::error(GL_INVALID_OPERATION, GL_TRUE);
5042 }
5043
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005044 return fenceObject->testFence();
5045 }
5046 }
5047 catch(std::bad_alloc&)
5048 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005049 gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005050 }
5051
5052 return GL_TRUE;
daniel@transgaming.comfe208882010-09-01 15:47:57 +00005053}
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005054
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00005055void __stdcall glTexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height,
5056 GLint border, GLenum format, GLenum type, const GLvoid* pixels)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005057{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005058 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 +00005059 "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 +00005060 target, level, internalformat, width, height, border, format, type, pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005061
5062 try
5063 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005064 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005065
5066 if (context)
5067 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005068 if (context->getClientVersion() < 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -04005069 !ValidateES2TexImageParameters(context, target, level, internalformat, false, false,
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005070 0, 0, width, height, border, format, type, pixels))
daniel@transgaming.com32b11442011-11-19 02:42:48 +00005071 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005072 return;
5073 }
5074
5075 if (context->getClientVersion() >= 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -04005076 !ValidateES3TexImageParameters(context, target, level, internalformat, false, false,
Jamie Madillefb2a6f2013-09-24 10:22:42 -04005077 0, 0, 0, width, height, 1, border, format, type, pixels))
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005078 {
5079 return;
daniel@transgaming.com32b11442011-11-19 02:42:48 +00005080 }
5081
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00005082 switch (target)
5083 {
5084 case GL_TEXTURE_2D:
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00005085 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005086 gl::Texture2D *texture = context->getTexture2D();
Jamie Madill88f18f42013-09-18 14:36:19 -04005087 texture->setImage(level, width, height, internalformat, format, type, context->getUnpackState(), pixels);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00005088 }
5089 break;
5090 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00005091 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005092 gl::TextureCubeMap *texture = context->getTextureCubeMap();
Jamie Madill88f18f42013-09-18 14:36:19 -04005093 texture->setImagePosX(level, width, height, internalformat, format, type, context->getUnpackState(), pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005094 }
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005095 break;
5096 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
5097 {
5098 gl::TextureCubeMap *texture = context->getTextureCubeMap();
Jamie Madill88f18f42013-09-18 14:36:19 -04005099 texture->setImageNegX(level, width, height, internalformat, format, type, context->getUnpackState(), pixels);
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005100 }
5101 break;
5102 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
5103 {
5104 gl::TextureCubeMap *texture = context->getTextureCubeMap();
Jamie Madill88f18f42013-09-18 14:36:19 -04005105 texture->setImagePosY(level, width, height, internalformat, format, type, context->getUnpackState(), pixels);
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005106 }
5107 break;
5108 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
5109 {
5110 gl::TextureCubeMap *texture = context->getTextureCubeMap();
Jamie Madill88f18f42013-09-18 14:36:19 -04005111 texture->setImageNegY(level, width, height, internalformat, format, type, context->getUnpackState(), pixels);
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005112 }
5113 break;
5114 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
5115 {
5116 gl::TextureCubeMap *texture = context->getTextureCubeMap();
Jamie Madill88f18f42013-09-18 14:36:19 -04005117 texture->setImagePosZ(level, width, height, internalformat, format, type, context->getUnpackState(), pixels);
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005118 }
5119 break;
5120 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
5121 {
5122 gl::TextureCubeMap *texture = context->getTextureCubeMap();
Jamie Madill88f18f42013-09-18 14:36:19 -04005123 texture->setImageNegZ(level, width, height, internalformat, format, type, context->getUnpackState(), pixels);
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005124 }
5125 break;
5126 default: UNREACHABLE();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005127 }
5128 }
5129 }
5130 catch(std::bad_alloc&)
5131 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005132 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005133 }
5134}
5135
5136void __stdcall glTexParameterf(GLenum target, GLenum pname, GLfloat param)
5137{
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005138 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLint param = %f)", target, pname, param);
5139
5140 try
5141 {
5142 gl::Context *context = gl::getNonLostContext();
5143
5144 if (context)
5145 {
Geoff Lang34dbb6f2013-08-05 15:05:47 -04005146 if (!ValidateTexParamParameters(context, pname, static_cast<GLint>(param)))
Jamie Madill478fdb22013-07-19 16:36:59 -04005147 {
5148 return;
5149 }
5150
Jamie Madill35d15012013-10-07 10:46:37 -04005151 gl::Texture *texture = GetTargetTexture(context, target);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005152
Jamie Madillfb8a8302013-07-03 14:24:12 -04005153 if (!texture)
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005154 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005155 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005156 }
5157
5158 switch (pname)
5159 {
Jamie Madill478fdb22013-07-19 16:36:59 -04005160 case GL_TEXTURE_WRAP_S: texture->setWrapS(gl::uiround<GLenum>(param)); break;
5161 case GL_TEXTURE_WRAP_T: texture->setWrapT(gl::uiround<GLenum>(param)); break;
5162 case GL_TEXTURE_WRAP_R: texture->setWrapR(gl::uiround<GLenum>(param)); break;
5163 case GL_TEXTURE_MIN_FILTER: texture->setMinFilter(gl::uiround<GLenum>(param)); break;
5164 case GL_TEXTURE_MAG_FILTER: texture->setMagFilter(gl::uiround<GLenum>(param)); break;
5165 case GL_TEXTURE_USAGE_ANGLE: texture->setUsage(gl::uiround<GLenum>(param)); break;
5166 case GL_TEXTURE_MAX_ANISOTROPY_EXT: texture->setMaxAnisotropy(static_cast<GLfloat>(param), context->getTextureMaxAnisotropy()); break;
5167 case GL_TEXTURE_COMPARE_MODE: texture->setCompareMode(gl::uiround<GLenum>(param)); break;
5168 case GL_TEXTURE_COMPARE_FUNC: texture->setCompareFunc(gl::uiround<GLenum>(param)); break;
shannonwoods@chromium.orgabf14cc2013-05-30 00:20:58 +00005169
Jamie Madill478fdb22013-07-19 16:36:59 -04005170 case GL_TEXTURE_SWIZZLE_R:
5171 case GL_TEXTURE_SWIZZLE_G:
5172 case GL_TEXTURE_SWIZZLE_B:
5173 case GL_TEXTURE_SWIZZLE_A:
5174 case GL_TEXTURE_BASE_LEVEL:
5175 case GL_TEXTURE_MAX_LEVEL:
shannonwoods@chromium.orgabf14cc2013-05-30 00:20:58 +00005176 case GL_TEXTURE_MIN_LOD:
5177 case GL_TEXTURE_MAX_LOD:
shannonwoods@chromium.orgabf14cc2013-05-30 00:20:58 +00005178 UNIMPLEMENTED();
5179 break;
5180
Jamie Madill478fdb22013-07-19 16:36:59 -04005181 default: UNREACHABLE(); break;
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005182 }
5183 }
5184 }
5185 catch(std::bad_alloc&)
5186 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005187 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005188 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005189}
5190
5191void __stdcall glTexParameterfv(GLenum target, GLenum pname, const GLfloat* params)
5192{
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005193 glTexParameterf(target, pname, (GLfloat)*params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005194}
5195
5196void __stdcall glTexParameteri(GLenum target, GLenum pname, GLint param)
5197{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005198 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLint param = %d)", target, pname, param);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005199
5200 try
5201 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005202 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005203
5204 if (context)
5205 {
Geoff Lang34dbb6f2013-08-05 15:05:47 -04005206 if (!ValidateTexParamParameters(context, pname, param))
Jamie Madill478fdb22013-07-19 16:36:59 -04005207 {
5208 return;
5209 }
5210
Jamie Madill35d15012013-10-07 10:46:37 -04005211 gl::Texture *texture = GetTargetTexture(context, target);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005212
Jamie Madillfb8a8302013-07-03 14:24:12 -04005213 if (!texture)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005214 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005215 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005216 }
5217
5218 switch (pname)
5219 {
Jamie Madill478fdb22013-07-19 16:36:59 -04005220 case GL_TEXTURE_WRAP_S: texture->setWrapS((GLenum)param); break;
5221 case GL_TEXTURE_WRAP_T: texture->setWrapT((GLenum)param); break;
5222 case GL_TEXTURE_WRAP_R: texture->setWrapR((GLenum)param); break;
5223 case GL_TEXTURE_MIN_FILTER: texture->setMinFilter((GLenum)param); break;
5224 case GL_TEXTURE_MAG_FILTER: texture->setMagFilter((GLenum)param); break;
5225 case GL_TEXTURE_USAGE_ANGLE: texture->setUsage((GLenum)param); break;
5226 case GL_TEXTURE_MAX_ANISOTROPY_EXT: texture->setMaxAnisotropy((float)param, context->getTextureMaxAnisotropy()); break;
5227 case GL_TEXTURE_COMPARE_MODE: texture->setCompareMode((GLenum)param); break;
5228 case GL_TEXTURE_COMPARE_FUNC: texture->setCompareFunc((GLenum)param); break;
shannonwoods@chromium.orgabf14cc2013-05-30 00:20:58 +00005229
5230 case GL_TEXTURE_SWIZZLE_R:
5231 case GL_TEXTURE_SWIZZLE_G:
5232 case GL_TEXTURE_SWIZZLE_B:
5233 case GL_TEXTURE_SWIZZLE_A:
5234 case GL_TEXTURE_BASE_LEVEL:
5235 case GL_TEXTURE_MAX_LEVEL:
Jamie Madill478fdb22013-07-19 16:36:59 -04005236 case GL_TEXTURE_MIN_LOD:
5237 case GL_TEXTURE_MAX_LOD:
shannonwoods@chromium.orgabf14cc2013-05-30 00:20:58 +00005238 UNIMPLEMENTED();
5239 break;
5240
Jamie Madill478fdb22013-07-19 16:36:59 -04005241 default: UNREACHABLE(); break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005242 }
5243 }
5244 }
5245 catch(std::bad_alloc&)
5246 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005247 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005248 }
5249}
5250
5251void __stdcall glTexParameteriv(GLenum target, GLenum pname, const GLint* params)
5252{
5253 glTexParameteri(target, pname, *params);
5254}
5255
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005256void __stdcall glTexStorage2DEXT(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height)
5257{
5258 EVENT("(GLenum target = 0x%X, GLsizei levels = %d, GLenum internalformat = 0x%X, GLsizei width = %d, GLsizei height = %d)",
5259 target, levels, internalformat, width, height);
5260
5261 try
5262 {
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005263 gl::Context *context = gl::getNonLostContext();
5264
5265 if (context)
5266 {
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00005267 if (context->getClientVersion() < 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -04005268 !ValidateES2TexStorageParameters(context, target, levels, internalformat, width, height))
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +00005269 {
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00005270 return;
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +00005271 }
5272
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00005273 if (context->getClientVersion() >= 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -04005274 !ValidateES3TexStorageParameters(context, target, levels, internalformat, width, height, 1))
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +00005275 {
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00005276 return;
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +00005277 }
5278
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00005279 switch (target)
5280 {
5281 case GL_TEXTURE_2D:
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00005282 {
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00005283 gl::Texture2D *texture2d = context->getTexture2D();
5284 texture2d->storage(levels, internalformat, width, height);
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00005285 }
5286 break;
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00005287
5288 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
5289 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
5290 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
5291 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
5292 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
5293 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00005294 {
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00005295 gl::TextureCubeMap *textureCube = context->getTextureCubeMap();
5296 textureCube->storage(levels, internalformat, width);
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00005297 }
5298 break;
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00005299
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00005300 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005301 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00005302 }
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005303 }
5304 }
5305 catch(std::bad_alloc&)
5306 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005307 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005308 }
5309}
5310
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00005311void __stdcall glTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height,
5312 GLenum format, GLenum type, const GLvoid* pixels)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005313{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005314 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00005315 "GLsizei width = %d, GLsizei height = %d, GLenum format = 0x%X, GLenum type = 0x%X, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00005316 "const GLvoid* pixels = 0x%0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005317 target, level, xoffset, yoffset, width, height, format, type, pixels);
5318
5319 try
5320 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005321 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005322
5323 if (context)
5324 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005325 if (context->getClientVersion() < 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -04005326 !ValidateES2TexImageParameters(context, target, level, GL_NONE, false, true,
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005327 0, 0, width, height, 0, format, type, pixels))
daniel@transgaming.com1d2d3c42012-05-31 01:14:15 +00005328 {
5329 return;
5330 }
5331
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005332 if (context->getClientVersion() >= 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -04005333 !ValidateES3TexImageParameters(context, target, level, GL_NONE, false, true,
Jamie Madillefb2a6f2013-09-24 10:22:42 -04005334 0, 0, 0, width, height, 1, 0, format, type, pixels))
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005335 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005336 return;
5337 }
5338
5339 switch (target)
5340 {
5341 case GL_TEXTURE_2D:
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005342 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005343 gl::Texture2D *texture = context->getTexture2D();
Jamie Madill88f18f42013-09-18 14:36:19 -04005344 texture->subImage(level, xoffset, yoffset, width, height, format, type, context->getUnpackState(), pixels);
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005345 }
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005346 break;
5347
5348 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
5349 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
5350 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
5351 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
5352 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
5353 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005354 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005355 gl::TextureCubeMap *texture = context->getTextureCubeMap();
Jamie Madill88f18f42013-09-18 14:36:19 -04005356 texture->subImage(target, level, xoffset, yoffset, width, height, format, type, context->getUnpackState(), pixels);
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005357 }
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005358 break;
5359
5360 default:
5361 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005362 }
5363 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005364 }
5365 catch(std::bad_alloc&)
5366 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005367 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005368 }
5369}
5370
5371void __stdcall glUniform1f(GLint location, GLfloat x)
5372{
5373 glUniform1fv(location, 1, &x);
5374}
5375
5376void __stdcall glUniform1fv(GLint location, GLsizei count, const GLfloat* v)
5377{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005378 EVENT("(GLint location = %d, GLsizei count = %d, const GLfloat* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005379
5380 try
5381 {
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005382 if (count < 0)
5383 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005384 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005385 }
5386
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005387 if (location == -1)
5388 {
5389 return;
5390 }
5391
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005392 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005393
5394 if (context)
5395 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00005396 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005397 if (!programBinary)
5398 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005399 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005400 }
5401
5402 if (!programBinary->setUniform1fv(location, count, v))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005403 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005404 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005405 }
5406 }
5407 }
5408 catch(std::bad_alloc&)
5409 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005410 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005411 }
5412}
5413
5414void __stdcall glUniform1i(GLint location, GLint x)
5415{
5416 glUniform1iv(location, 1, &x);
5417}
5418
5419void __stdcall glUniform1iv(GLint location, GLsizei count, const GLint* v)
5420{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005421 EVENT("(GLint location = %d, GLsizei count = %d, const GLint* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005422
5423 try
5424 {
5425 if (count < 0)
5426 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005427 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005428 }
5429
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005430 if (location == -1)
5431 {
5432 return;
5433 }
5434
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005435 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005436
5437 if (context)
5438 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00005439 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005440 if (!programBinary)
5441 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005442 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005443 }
5444
5445 if (!programBinary->setUniform1iv(location, count, v))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005446 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005447 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005448 }
5449 }
5450 }
5451 catch(std::bad_alloc&)
5452 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005453 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005454 }
5455}
5456
5457void __stdcall glUniform2f(GLint location, GLfloat x, GLfloat y)
5458{
5459 GLfloat xy[2] = {x, y};
5460
5461 glUniform2fv(location, 1, (GLfloat*)&xy);
5462}
5463
5464void __stdcall glUniform2fv(GLint location, GLsizei count, const GLfloat* v)
5465{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005466 EVENT("(GLint location = %d, GLsizei count = %d, const GLfloat* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005467
5468 try
5469 {
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005470 if (count < 0)
5471 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005472 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005473 }
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005474
5475 if (location == -1)
5476 {
5477 return;
5478 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005479
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005480 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005481
5482 if (context)
5483 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00005484 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005485 if (!programBinary)
5486 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005487 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005488 }
5489
5490 if (!programBinary->setUniform2fv(location, count, v))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005491 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005492 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005493 }
5494 }
5495 }
5496 catch(std::bad_alloc&)
5497 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005498 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005499 }
5500}
5501
5502void __stdcall glUniform2i(GLint location, GLint x, GLint y)
5503{
5504 GLint xy[4] = {x, y};
5505
5506 glUniform2iv(location, 1, (GLint*)&xy);
5507}
5508
5509void __stdcall glUniform2iv(GLint location, GLsizei count, const GLint* v)
5510{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005511 EVENT("(GLint location = %d, GLsizei count = %d, const GLint* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005512
5513 try
5514 {
5515 if (count < 0)
5516 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005517 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005518 }
5519
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005520 if (location == -1)
5521 {
5522 return;
5523 }
5524
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005525 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005526
5527 if (context)
5528 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00005529 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005530 if (!programBinary)
5531 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005532 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005533 }
5534
5535 if (!programBinary->setUniform2iv(location, count, v))
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005536 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005537 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005538 }
5539 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005540 }
5541 catch(std::bad_alloc&)
5542 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005543 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005544 }
5545}
5546
5547void __stdcall glUniform3f(GLint location, GLfloat x, GLfloat y, GLfloat z)
5548{
5549 GLfloat xyz[3] = {x, y, z};
5550
5551 glUniform3fv(location, 1, (GLfloat*)&xyz);
5552}
5553
5554void __stdcall glUniform3fv(GLint location, GLsizei count, const GLfloat* v)
5555{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005556 EVENT("(GLint location = %d, GLsizei count = %d, const GLfloat* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005557
5558 try
5559 {
5560 if (count < 0)
5561 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005562 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005563 }
5564
5565 if (location == -1)
5566 {
5567 return;
5568 }
5569
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005570 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005571
5572 if (context)
5573 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00005574 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005575 if (!programBinary)
5576 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005577 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005578 }
5579
5580 if (!programBinary->setUniform3fv(location, count, v))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005581 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005582 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005583 }
5584 }
5585 }
5586 catch(std::bad_alloc&)
5587 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005588 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005589 }
5590}
5591
5592void __stdcall glUniform3i(GLint location, GLint x, GLint y, GLint z)
5593{
5594 GLint xyz[3] = {x, y, z};
5595
5596 glUniform3iv(location, 1, (GLint*)&xyz);
5597}
5598
5599void __stdcall glUniform3iv(GLint location, GLsizei count, const GLint* v)
5600{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005601 EVENT("(GLint location = %d, GLsizei count = %d, const GLint* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005602
5603 try
5604 {
5605 if (count < 0)
5606 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005607 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005608 }
5609
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005610 if (location == -1)
5611 {
5612 return;
5613 }
5614
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005615 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005616
5617 if (context)
5618 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00005619 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005620 if (!programBinary)
5621 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005622 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005623 }
5624
5625 if (!programBinary->setUniform3iv(location, count, v))
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005626 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005627 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005628 }
5629 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005630 }
5631 catch(std::bad_alloc&)
5632 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005633 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005634 }
5635}
5636
5637void __stdcall glUniform4f(GLint location, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
5638{
5639 GLfloat xyzw[4] = {x, y, z, w};
5640
5641 glUniform4fv(location, 1, (GLfloat*)&xyzw);
5642}
5643
5644void __stdcall glUniform4fv(GLint location, GLsizei count, const GLfloat* v)
5645{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005646 EVENT("(GLint location = %d, GLsizei count = %d, const GLfloat* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005647
5648 try
5649 {
5650 if (count < 0)
5651 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005652 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005653 }
5654
5655 if (location == -1)
5656 {
5657 return;
5658 }
5659
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005660 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005661
5662 if (context)
5663 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00005664 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005665 if (!programBinary)
5666 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005667 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005668 }
5669
5670 if (!programBinary->setUniform4fv(location, count, v))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005671 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005672 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005673 }
5674 }
5675 }
5676 catch(std::bad_alloc&)
5677 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005678 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005679 }
5680}
5681
5682void __stdcall glUniform4i(GLint location, GLint x, GLint y, GLint z, GLint w)
5683{
5684 GLint xyzw[4] = {x, y, z, w};
5685
5686 glUniform4iv(location, 1, (GLint*)&xyzw);
5687}
5688
5689void __stdcall glUniform4iv(GLint location, GLsizei count, const GLint* v)
5690{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005691 EVENT("(GLint location = %d, GLsizei count = %d, const GLint* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005692
5693 try
5694 {
5695 if (count < 0)
5696 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005697 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005698 }
5699
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005700 if (location == -1)
5701 {
5702 return;
5703 }
5704
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005705 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005706
5707 if (context)
5708 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00005709 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005710 if (!programBinary)
5711 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005712 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005713 }
5714
5715 if (!programBinary->setUniform4iv(location, count, v))
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005716 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005717 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005718 }
5719 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005720 }
5721 catch(std::bad_alloc&)
5722 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005723 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005724 }
5725}
5726
5727void __stdcall glUniformMatrix2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
5728{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005729 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00005730 location, count, transpose, value);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005731
5732 try
5733 {
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00005734 if (count < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005735 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005736 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005737 }
5738
5739 if (location == -1)
5740 {
5741 return;
5742 }
5743
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005744 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005745
5746 if (context)
5747 {
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00005748 if (transpose != GL_FALSE && context->getClientVersion() < 3)
5749 {
5750 return gl::error(GL_INVALID_VALUE);
5751 }
5752
daniel@transgaming.com62a28462012-07-24 18:33:59 +00005753 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005754 if (!programBinary)
5755 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005756 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005757 }
5758
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00005759 if (!programBinary->setUniformMatrix2fv(location, count, transpose, value))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005760 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005761 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005762 }
5763 }
5764 }
5765 catch(std::bad_alloc&)
5766 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005767 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005768 }
5769}
5770
5771void __stdcall glUniformMatrix3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
5772{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005773 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00005774 location, count, transpose, value);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005775
5776 try
5777 {
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00005778 if (count < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005779 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005780 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005781 }
5782
5783 if (location == -1)
5784 {
5785 return;
5786 }
5787
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005788 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005789
5790 if (context)
5791 {
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00005792 if (transpose != GL_FALSE && context->getClientVersion() < 3)
5793 {
5794 return gl::error(GL_INVALID_VALUE);
5795 }
5796
daniel@transgaming.com62a28462012-07-24 18:33:59 +00005797 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005798 if (!programBinary)
5799 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005800 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005801 }
5802
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00005803 if (!programBinary->setUniformMatrix3fv(location, count, transpose, value))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005804 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005805 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005806 }
5807 }
5808 }
5809 catch(std::bad_alloc&)
5810 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005811 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005812 }
5813}
5814
5815void __stdcall glUniformMatrix4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
5816{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005817 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00005818 location, count, transpose, value);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005819
5820 try
5821 {
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00005822 if (count < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005823 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005824 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005825 }
5826
5827 if (location == -1)
5828 {
5829 return;
5830 }
5831
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005832 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005833
5834 if (context)
5835 {
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00005836 if (transpose != GL_FALSE && context->getClientVersion() < 3)
5837 {
5838 return gl::error(GL_INVALID_VALUE);
5839 }
5840
daniel@transgaming.com62a28462012-07-24 18:33:59 +00005841 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005842 if (!programBinary)
5843 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005844 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005845 }
5846
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00005847 if (!programBinary->setUniformMatrix4fv(location, count, transpose, value))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005848 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005849 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005850 }
5851 }
5852 }
5853 catch(std::bad_alloc&)
5854 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005855 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005856 }
5857}
5858
5859void __stdcall glUseProgram(GLuint program)
5860{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005861 EVENT("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005862
5863 try
5864 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005865 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005866
5867 if (context)
5868 {
5869 gl::Program *programObject = context->getProgram(program);
5870
daniel@transgaming.comc8478202010-04-13 19:53:35 +00005871 if (!programObject && program != 0)
5872 {
5873 if (context->getShader(program))
5874 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005875 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comc8478202010-04-13 19:53:35 +00005876 }
5877 else
5878 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005879 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comc8478202010-04-13 19:53:35 +00005880 }
5881 }
5882
daniel@transgaming.com716056c2012-07-24 18:38:59 +00005883 if (program != 0 && !programObject->isLinked())
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005884 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005885 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005886 }
5887
5888 context->useProgram(program);
5889 }
5890 }
5891 catch(std::bad_alloc&)
5892 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005893 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005894 }
5895}
5896
5897void __stdcall glValidateProgram(GLuint program)
5898{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005899 EVENT("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005900
5901 try
5902 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005903 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00005904
5905 if (context)
5906 {
5907 gl::Program *programObject = context->getProgram(program);
5908
5909 if (!programObject)
5910 {
5911 if (context->getShader(program))
5912 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005913 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00005914 }
5915 else
5916 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005917 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00005918 }
5919 }
5920
apatrick@chromium.org253b8d22012-06-22 19:27:21 +00005921 programObject->validate();
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00005922 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005923 }
5924 catch(std::bad_alloc&)
5925 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005926 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005927 }
5928}
5929
5930void __stdcall glVertexAttrib1f(GLuint index, GLfloat x)
5931{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005932 EVENT("(GLuint index = %d, GLfloat x = %f)", index, x);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005933
5934 try
5935 {
5936 if (index >= gl::MAX_VERTEX_ATTRIBS)
5937 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005938 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005939 }
5940
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005941 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005942
5943 if (context)
5944 {
5945 GLfloat vals[4] = { x, 0, 0, 1 };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00005946 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005947 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005948 }
5949 catch(std::bad_alloc&)
5950 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005951 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005952 }
5953}
5954
5955void __stdcall glVertexAttrib1fv(GLuint index, const GLfloat* values)
5956{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005957 EVENT("(GLuint index = %d, const GLfloat* values = 0x%0.8p)", index, values);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005958
5959 try
5960 {
5961 if (index >= gl::MAX_VERTEX_ATTRIBS)
5962 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005963 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005964 }
5965
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005966 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005967
5968 if (context)
5969 {
5970 GLfloat vals[4] = { values[0], 0, 0, 1 };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00005971 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005972 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005973 }
5974 catch(std::bad_alloc&)
5975 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005976 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005977 }
5978}
5979
5980void __stdcall glVertexAttrib2f(GLuint index, GLfloat x, GLfloat y)
5981{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005982 EVENT("(GLuint index = %d, GLfloat x = %f, GLfloat y = %f)", index, x, y);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005983
5984 try
5985 {
5986 if (index >= gl::MAX_VERTEX_ATTRIBS)
5987 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005988 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005989 }
5990
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005991 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005992
5993 if (context)
5994 {
5995 GLfloat vals[4] = { x, y, 0, 1 };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00005996 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005997 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005998 }
5999 catch(std::bad_alloc&)
6000 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006001 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006002 }
6003}
6004
6005void __stdcall glVertexAttrib2fv(GLuint index, const GLfloat* values)
6006{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006007 EVENT("(GLuint index = %d, const GLfloat* values = 0x%0.8p)", index, values);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006008
6009 try
6010 {
6011 if (index >= gl::MAX_VERTEX_ATTRIBS)
6012 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006013 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006014 }
6015
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006016 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006017
6018 if (context)
6019 {
6020 GLfloat vals[4] = { values[0], values[1], 0, 1 };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00006021 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006022 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006023 }
6024 catch(std::bad_alloc&)
6025 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006026 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006027 }
6028}
6029
6030void __stdcall glVertexAttrib3f(GLuint index, GLfloat x, GLfloat y, GLfloat z)
6031{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006032 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 +00006033
6034 try
6035 {
6036 if (index >= gl::MAX_VERTEX_ATTRIBS)
6037 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006038 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006039 }
6040
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006041 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006042
6043 if (context)
6044 {
6045 GLfloat vals[4] = { x, y, z, 1 };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00006046 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006047 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006048 }
6049 catch(std::bad_alloc&)
6050 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006051 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006052 }
6053}
6054
6055void __stdcall glVertexAttrib3fv(GLuint index, const GLfloat* values)
6056{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006057 EVENT("(GLuint index = %d, const GLfloat* values = 0x%0.8p)", index, values);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006058
6059 try
6060 {
6061 if (index >= gl::MAX_VERTEX_ATTRIBS)
6062 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006063 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006064 }
6065
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006066 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006067
6068 if (context)
6069 {
6070 GLfloat vals[4] = { values[0], values[1], values[2], 1 };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00006071 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006072 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006073 }
6074 catch(std::bad_alloc&)
6075 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006076 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006077 }
6078}
6079
6080void __stdcall glVertexAttrib4f(GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
6081{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006082 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 +00006083
6084 try
6085 {
6086 if (index >= gl::MAX_VERTEX_ATTRIBS)
6087 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006088 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006089 }
6090
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006091 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006092
6093 if (context)
6094 {
6095 GLfloat vals[4] = { x, y, z, w };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00006096 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006097 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006098 }
6099 catch(std::bad_alloc&)
6100 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006101 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006102 }
6103}
6104
6105void __stdcall glVertexAttrib4fv(GLuint index, const GLfloat* values)
6106{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006107 EVENT("(GLuint index = %d, const GLfloat* values = 0x%0.8p)", index, values);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006108
6109 try
6110 {
6111 if (index >= gl::MAX_VERTEX_ATTRIBS)
6112 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006113 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006114 }
6115
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006116 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006117
6118 if (context)
6119 {
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00006120 context->setVertexAttribf(index, values);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006121 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006122 }
6123 catch(std::bad_alloc&)
6124 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006125 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006126 }
6127}
6128
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00006129void __stdcall glVertexAttribDivisorANGLE(GLuint index, GLuint divisor)
6130{
6131 EVENT("(GLuint index = %d, GLuint divisor = %d)", index, divisor);
6132
6133 try
6134 {
6135 if (index >= gl::MAX_VERTEX_ATTRIBS)
6136 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006137 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00006138 }
6139
6140 gl::Context *context = gl::getNonLostContext();
6141
6142 if (context)
6143 {
6144 context->setVertexAttribDivisor(index, divisor);
6145 }
6146 }
6147 catch(std::bad_alloc&)
6148 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006149 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00006150 }
6151}
6152
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00006153void __stdcall glVertexAttribPointer(GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid* ptr)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006154{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006155 EVENT("(GLuint index = %d, GLint size = %d, GLenum type = 0x%X, "
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006156 "GLboolean normalized = %u, GLsizei stride = %d, const GLvoid* ptr = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00006157 index, size, type, normalized, stride, ptr);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006158
6159 try
6160 {
6161 if (index >= gl::MAX_VERTEX_ATTRIBS)
6162 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006163 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006164 }
6165
6166 if (size < 1 || size > 4)
6167 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006168 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006169 }
6170
shannon.woods%transgaming.com@gtempaccount.com1a4e09a2013-04-13 03:33:30 +00006171 gl::Context *context = gl::getNonLostContext();
6172
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006173 switch (type)
6174 {
6175 case GL_BYTE:
6176 case GL_UNSIGNED_BYTE:
6177 case GL_SHORT:
6178 case GL_UNSIGNED_SHORT:
6179 case GL_FIXED:
6180 case GL_FLOAT:
6181 break;
shannon.woods%transgaming.com@gtempaccount.com1a4e09a2013-04-13 03:33:30 +00006182 case GL_HALF_FLOAT:
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00006183 case GL_INT:
6184 case GL_UNSIGNED_INT:
shannon.woods%transgaming.com@gtempaccount.com1ab57be2013-04-13 03:38:39 +00006185 case GL_INT_2_10_10_10_REV:
6186 case GL_UNSIGNED_INT_2_10_10_10_REV:
shannon.woods%transgaming.com@gtempaccount.com1a4e09a2013-04-13 03:33:30 +00006187 if (context && context->getClientVersion() < 3)
6188 {
6189 return gl::error(GL_INVALID_ENUM);
6190 }
6191 else
6192 {
6193 break;
6194 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006195 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006196 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006197 }
6198
6199 if (stride < 0)
6200 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006201 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006202 }
6203
shannon.woods%transgaming.com@gtempaccount.com1ab57be2013-04-13 03:38:39 +00006204 if ((type == GL_INT_2_10_10_10_REV || type == GL_UNSIGNED_INT_2_10_10_10_REV) && size != 4)
6205 {
6206 return gl::error(GL_INVALID_OPERATION);
6207 }
6208
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006209 if (context)
6210 {
Jamie Madilld8db8662013-07-02 11:57:04 -04006211 // [OpenGL ES 3.0.2] Section 2.8 page 24:
6212 // An INVALID_OPERATION error is generated when a non-zero vertex array object
6213 // is bound, zero is bound to the ARRAY_BUFFER buffer object binding point,
6214 // and the pointer argument is not NULL.
6215 if (context->getVertexArrayHandle() != 0 && context->getArrayBufferHandle() == 0 && ptr != NULL)
6216 {
6217 return gl::error(GL_INVALID_OPERATION);
6218 }
6219
shannon.woods%transgaming.com@gtempaccount.com8de4e6a2013-04-13 03:37:44 +00006220 context->setVertexAttribState(index, context->getArrayBuffer(), size, type,
6221 normalized == GL_TRUE, false, stride, ptr);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006222 }
6223 }
6224 catch(std::bad_alloc&)
6225 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006226 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006227 }
6228}
6229
6230void __stdcall glViewport(GLint x, GLint y, GLsizei width, GLsizei height)
6231{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006232 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 +00006233
6234 try
6235 {
6236 if (width < 0 || height < 0)
6237 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006238 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006239 }
6240
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006241 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006242
6243 if (context)
6244 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00006245 context->setViewportParams(x, y, width, height);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006246 }
6247 }
6248 catch(std::bad_alloc&)
6249 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006250 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006251 }
6252}
6253
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006254// OpenGL ES 3.0 functions
6255
6256void __stdcall glReadBuffer(GLenum mode)
6257{
6258 EVENT("(GLenum mode = 0x%X)", mode);
6259
6260 try
6261 {
6262 gl::Context *context = gl::getNonLostContext();
6263
6264 if (context)
6265 {
6266 if (context->getClientVersion() < 3)
6267 {
6268 return gl::error(GL_INVALID_OPERATION);
6269 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006270
Jamie Madill54133512013-06-21 09:33:07 -04006271 // glReadBuffer
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006272 UNIMPLEMENTED();
6273 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006274 }
6275 catch(std::bad_alloc&)
6276 {
6277 return gl::error(GL_OUT_OF_MEMORY);
6278 }
6279}
6280
6281void __stdcall glDrawRangeElements(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid* indices)
6282{
6283 EVENT("(GLenum mode = 0x%X, GLuint start = %u, GLuint end = %u, GLsizei count = %d, GLenum type = 0x%X, "
6284 "const GLvoid* indices = 0x%0.8p)", mode, start, end, count, type, indices);
6285
6286 try
6287 {
6288 gl::Context *context = gl::getNonLostContext();
6289
6290 if (context)
6291 {
6292 if (context->getClientVersion() < 3)
6293 {
6294 return gl::error(GL_INVALID_OPERATION);
6295 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006296
Jamie Madill54133512013-06-21 09:33:07 -04006297 // glDrawRangeElements
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006298 UNIMPLEMENTED();
6299 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006300 }
6301 catch(std::bad_alloc&)
6302 {
6303 return gl::error(GL_OUT_OF_MEMORY);
6304 }
6305}
6306
6307void __stdcall glTexImage3D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid* pixels)
6308{
6309 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint internalformat = %d, GLsizei width = %d, "
6310 "GLsizei height = %d, GLsizei depth = %d, GLint border = %d, GLenum format = 0x%X, "
6311 "GLenum type = 0x%X, const GLvoid* pixels = 0x%0.8p)",
6312 target, level, internalformat, width, height, depth, border, format, type, pixels);
6313
6314 try
6315 {
6316 gl::Context *context = gl::getNonLostContext();
6317
6318 if (context)
6319 {
6320 if (context->getClientVersion() < 3)
6321 {
6322 return gl::error(GL_INVALID_OPERATION);
6323 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006324
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006325 // validateES3TexImageFormat sets the error code if there is an error
Geoff Lang34dbb6f2013-08-05 15:05:47 -04006326 if (!ValidateES3TexImageParameters(context, target, level, internalformat, false, false,
Jamie Madillefb2a6f2013-09-24 10:22:42 -04006327 0, 0, 0, width, height, depth, border, format, type, pixels))
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006328 {
6329 return;
6330 }
6331
6332 switch(target)
6333 {
6334 case GL_TEXTURE_3D:
6335 {
6336 gl::Texture3D *texture = context->getTexture3D();
Jamie Madill88f18f42013-09-18 14:36:19 -04006337 texture->setImage(level, width, height, depth, internalformat, format, type, context->getUnpackState(), pixels);
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006338 }
6339 break;
6340
6341 case GL_TEXTURE_2D_ARRAY:
shannon.woods%transgaming.com@gtempaccount.com14e8f592013-04-13 03:46:21 +00006342 {
6343 gl::Texture2DArray *texture = context->getTexture2DArray();
Jamie Madill88f18f42013-09-18 14:36:19 -04006344 texture->setImage(level, width, height, depth, internalformat, format, type, context->getUnpackState(), pixels);
shannon.woods%transgaming.com@gtempaccount.com14e8f592013-04-13 03:46:21 +00006345 }
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006346 break;
6347
6348 default:
6349 return gl::error(GL_INVALID_ENUM);
6350 }
6351 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006352 }
6353 catch(std::bad_alloc&)
6354 {
6355 return gl::error(GL_OUT_OF_MEMORY);
6356 }
6357}
6358
6359void __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)
6360{
6361 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
6362 "GLint zoffset = %d, GLsizei width = %d, GLsizei height = %d, GLsizei depth = %d, "
6363 "GLenum format = 0x%X, GLenum type = 0x%X, const GLvoid* pixels = 0x%0.8p)",
6364 target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels);
6365
6366 try
6367 {
6368 gl::Context *context = gl::getNonLostContext();
6369
6370 if (context)
6371 {
6372 if (context->getClientVersion() < 3)
6373 {
6374 return gl::error(GL_INVALID_OPERATION);
6375 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006376
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006377 if (!pixels)
6378 {
6379 return gl::error(GL_INVALID_VALUE);
6380 }
6381
6382 // validateES3TexImageFormat sets the error code if there is an error
Geoff Lang34dbb6f2013-08-05 15:05:47 -04006383 if (!ValidateES3TexImageParameters(context, target, level, GL_NONE, false, true,
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006384 xoffset, yoffset, zoffset, width, height, depth, 0,
Jamie Madillefb2a6f2013-09-24 10:22:42 -04006385 format, type, pixels))
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006386 {
6387 return;
6388 }
6389
6390 switch(target)
6391 {
6392 case GL_TEXTURE_3D:
6393 {
6394 gl::Texture3D *texture = context->getTexture3D();
Jamie Madill88f18f42013-09-18 14:36:19 -04006395 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 +00006396 }
6397 break;
6398
6399 case GL_TEXTURE_2D_ARRAY:
shannon.woods%transgaming.com@gtempaccount.com14e8f592013-04-13 03:46:21 +00006400 {
6401 gl::Texture2DArray *texture = context->getTexture2DArray();
Jamie Madill88f18f42013-09-18 14:36:19 -04006402 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 +00006403 }
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006404 break;
6405
6406 default:
6407 return gl::error(GL_INVALID_ENUM);
6408 }
6409 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006410 }
6411 catch(std::bad_alloc&)
6412 {
6413 return gl::error(GL_OUT_OF_MEMORY);
6414 }
6415}
6416
6417void __stdcall glCopyTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height)
6418{
6419 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
6420 "GLint zoffset = %d, GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d)",
6421 target, level, xoffset, yoffset, zoffset, x, y, width, height);
6422
6423 try
6424 {
6425 gl::Context *context = gl::getNonLostContext();
6426
6427 if (context)
6428 {
6429 if (context->getClientVersion() < 3)
6430 {
6431 return gl::error(GL_INVALID_OPERATION);
6432 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006433
Geoff Lang34dbb6f2013-08-05 15:05:47 -04006434 if (!ValidateES3CopyTexImageParameters(context, target, level, GL_NONE, false, xoffset, yoffset, zoffset,
shannonwoods@chromium.org6cf2b0e2013-05-30 00:13:36 +00006435 x, y, width, height, 0))
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006436 {
6437 return;
6438 }
6439
6440 gl::Framebuffer *framebuffer = context->getReadFramebuffer();
6441 gl::Texture *texture = NULL;
6442 switch (target)
6443 {
6444 case GL_TEXTURE_3D:
6445 texture = context->getTexture3D();
6446 break;
6447
6448 case GL_TEXTURE_2D_ARRAY:
shannon.woods%transgaming.com@gtempaccount.com14e8f592013-04-13 03:46:21 +00006449 texture = context->getTexture2DArray();
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006450 break;
6451
6452 default:
6453 return gl::error(GL_INVALID_ENUM);
6454 }
6455
6456 texture->copySubImage(target, level, xoffset, yoffset, zoffset, x, y, width, height, framebuffer);
6457 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006458 }
6459 catch(std::bad_alloc&)
6460 {
6461 return gl::error(GL_OUT_OF_MEMORY);
6462 }
6463}
6464
6465void __stdcall glCompressedTexImage3D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid* data)
6466{
6467 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint internalformat = %d, GLsizei width = %d, "
6468 "GLsizei height = %d, GLsizei depth = %d, GLint border = %d, GLsizei imageSize = %d, "
6469 "const GLvoid* data = 0x%0.8p)",
6470 target, level, internalformat, width, height, depth, border, imageSize, data);
6471
6472 try
6473 {
6474 gl::Context *context = gl::getNonLostContext();
6475
6476 if (context)
6477 {
6478 if (context->getClientVersion() < 3)
6479 {
6480 return gl::error(GL_INVALID_OPERATION);
6481 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006482
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +00006483 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 +00006484 {
6485 return gl::error(GL_INVALID_VALUE);
6486 }
6487
6488 // validateES3TexImageFormat sets the error code if there is an error
Geoff Lang34dbb6f2013-08-05 15:05:47 -04006489 if (!ValidateES3TexImageParameters(context, target, level, internalformat, true, false,
Jamie Madillefb2a6f2013-09-24 10:22:42 -04006490 0, 0, 0, width, height, depth, border, GL_NONE, GL_NONE, data))
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006491 {
6492 return;
6493 }
6494
6495 switch(target)
6496 {
6497 case GL_TEXTURE_3D:
6498 {
6499 gl::Texture3D *texture = context->getTexture3D();
6500 texture->setCompressedImage(level, internalformat, width, height, depth, imageSize, data);
6501 }
6502 break;
6503
6504 case GL_TEXTURE_2D_ARRAY:
shannon.woods%transgaming.com@gtempaccount.com14e8f592013-04-13 03:46:21 +00006505 {
6506 gl::Texture2DArray *texture = context->getTexture2DArray();
6507 texture->setCompressedImage(level, internalformat, width, height, depth, imageSize, data);
6508 }
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006509 break;
6510
6511 default:
6512 return gl::error(GL_INVALID_ENUM);
6513 }
6514 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006515 }
6516 catch(std::bad_alloc&)
6517 {
6518 return gl::error(GL_OUT_OF_MEMORY);
6519 }
6520}
6521
6522void __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)
6523{
6524 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
6525 "GLint zoffset = %d, GLsizei width = %d, GLsizei height = %d, GLsizei depth = %d, "
6526 "GLenum format = 0x%X, GLsizei imageSize = %d, const GLvoid* data = 0x%0.8p)",
6527 target, level, xoffset, yoffset, zoffset, width, height, depth, format, imageSize, data);
6528
6529 try
6530 {
6531 gl::Context *context = gl::getNonLostContext();
6532
6533 if (context)
6534 {
6535 if (context->getClientVersion() < 3)
6536 {
6537 return gl::error(GL_INVALID_OPERATION);
6538 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006539
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +00006540 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 +00006541 {
6542 return gl::error(GL_INVALID_VALUE);
6543 }
6544
6545 if (!data)
6546 {
6547 return gl::error(GL_INVALID_VALUE);
6548 }
6549
6550 // validateES3TexImageFormat sets the error code if there is an error
Geoff Lang34dbb6f2013-08-05 15:05:47 -04006551 if (!ValidateES3TexImageParameters(context, target, level, GL_NONE, true, true,
Jamie Madillefb2a6f2013-09-24 10:22:42 -04006552 0, 0, 0, width, height, depth, 0, GL_NONE, GL_NONE, data))
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006553 {
6554 return;
6555 }
6556
6557 switch(target)
6558 {
6559 case GL_TEXTURE_3D:
6560 {
6561 gl::Texture3D *texture = context->getTexture3D();
6562 texture->subImageCompressed(level, xoffset, yoffset, zoffset, width, height, depth,
6563 format, imageSize, data);
6564 }
6565 break;
6566
6567 case GL_TEXTURE_2D_ARRAY:
shannon.woods%transgaming.com@gtempaccount.com14e8f592013-04-13 03:46:21 +00006568 {
6569 gl::Texture2DArray *texture = context->getTexture2DArray();
6570 texture->subImageCompressed(level, xoffset, yoffset, zoffset, width, height, depth,
6571 format, imageSize, data);
6572 }
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006573 break;
6574
6575 default:
6576 return gl::error(GL_INVALID_ENUM);
6577 }
6578 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006579 }
6580 catch(std::bad_alloc&)
6581 {
6582 return gl::error(GL_OUT_OF_MEMORY);
6583 }
6584}
6585
6586void __stdcall glGenQueries(GLsizei n, GLuint* ids)
6587{
6588 EVENT("(GLsizei n = %d, GLuint* ids = 0x%0.8p)", n, ids);
6589
6590 try
6591 {
6592 gl::Context *context = gl::getNonLostContext();
6593
6594 if (context)
6595 {
6596 if (context->getClientVersion() < 3)
6597 {
6598 return gl::error(GL_INVALID_OPERATION);
6599 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006600
Jamie Madill3641b4b2013-07-26 12:54:59 -04006601 glGenQueriesEXT(n, ids);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006602 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006603 }
6604 catch(std::bad_alloc&)
6605 {
6606 return gl::error(GL_OUT_OF_MEMORY);
6607 }
6608}
6609
6610void __stdcall glDeleteQueries(GLsizei n, const GLuint* ids)
6611{
6612 EVENT("(GLsizei n = %d, GLuint* ids = 0x%0.8p)", n, ids);
6613
6614 try
6615 {
6616 gl::Context *context = gl::getNonLostContext();
6617
6618 if (context)
6619 {
6620 if (context->getClientVersion() < 3)
6621 {
6622 return gl::error(GL_INVALID_OPERATION);
6623 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006624
Jamie Madill3641b4b2013-07-26 12:54:59 -04006625 glDeleteQueriesEXT(n, ids);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006626 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006627 }
6628 catch(std::bad_alloc&)
6629 {
6630 return gl::error(GL_OUT_OF_MEMORY);
6631 }
6632}
6633
6634GLboolean __stdcall glIsQuery(GLuint id)
6635{
6636 EVENT("(GLuint id = %u)", id);
6637
6638 try
6639 {
6640 gl::Context *context = gl::getNonLostContext();
6641
6642 if (context)
6643 {
6644 if (context->getClientVersion() < 3)
6645 {
6646 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
6647 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006648
Jamie Madill3641b4b2013-07-26 12:54:59 -04006649 // TODO: XFB queries
6650 return glIsQueryEXT(id);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006651 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006652 }
6653 catch(std::bad_alloc&)
6654 {
6655 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
6656 }
6657
6658 return GL_FALSE;
6659}
6660
6661void __stdcall glBeginQuery(GLenum target, GLuint id)
6662{
6663 EVENT("(GLenum target = 0x%X, GLuint id = %u)", target, id);
6664
6665 try
6666 {
6667 gl::Context *context = gl::getNonLostContext();
6668
6669 if (context)
6670 {
6671 if (context->getClientVersion() < 3)
6672 {
6673 return gl::error(GL_INVALID_OPERATION);
6674 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006675
Jamie Madill3641b4b2013-07-26 12:54:59 -04006676 switch (target)
6677 {
6678 case GL_ANY_SAMPLES_PASSED:
6679 case GL_ANY_SAMPLES_PASSED_CONSERVATIVE:
6680 case GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN:
6681 break;
6682 default:
6683 return gl::error(GL_INVALID_ENUM);
6684 }
6685
6686 if (id == 0)
6687 {
6688 return gl::error(GL_INVALID_OPERATION);
6689 }
6690
6691 if (target == GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN)
6692 {
6693 // TODO: XFB queries
6694 UNIMPLEMENTED();
6695 }
6696 else
6697 {
6698 context->beginQuery(target, id);
6699 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006700 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006701 }
6702 catch(std::bad_alloc&)
6703 {
6704 return gl::error(GL_OUT_OF_MEMORY);
6705 }
6706}
6707
6708void __stdcall glEndQuery(GLenum target)
6709{
6710 EVENT("(GLenum target = 0x%X)", target);
6711
6712 try
6713 {
6714 gl::Context *context = gl::getNonLostContext();
6715
6716 if (context)
6717 {
6718 if (context->getClientVersion() < 3)
6719 {
6720 return gl::error(GL_INVALID_OPERATION);
6721 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006722
Jamie Madill3641b4b2013-07-26 12:54:59 -04006723 if (target == GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN)
6724 {
6725 // TODO: XFB queries
6726 UNIMPLEMENTED();
6727 }
6728 else
6729 {
6730 glEndQueryEXT(target);
6731 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006732 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006733 }
6734 catch(std::bad_alloc&)
6735 {
6736 return gl::error(GL_OUT_OF_MEMORY);
6737 }
6738}
6739
6740void __stdcall glGetQueryiv(GLenum target, GLenum pname, GLint* params)
6741{
6742 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLint* params = 0x%0.8p)", target, pname, params);
6743
6744 try
6745 {
6746 gl::Context *context = gl::getNonLostContext();
6747
6748 if (context)
6749 {
6750 if (context->getClientVersion() < 3)
6751 {
6752 return gl::error(GL_INVALID_OPERATION);
6753 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006754
Jamie Madill3641b4b2013-07-26 12:54:59 -04006755 if (target == GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN)
6756 {
6757 // TODO: XFB queries
6758 UNIMPLEMENTED();
6759 }
6760 else
6761 {
6762 glGetQueryivEXT(target, pname, params);
6763 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006764 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006765 }
6766 catch(std::bad_alloc&)
6767 {
6768 return gl::error(GL_OUT_OF_MEMORY);
6769 }
6770}
6771
6772void __stdcall glGetQueryObjectuiv(GLuint id, GLenum pname, GLuint* params)
6773{
6774 EVENT("(GLuint id = %u, GLenum pname = 0x%X, GLint* params = 0x%0.8p)", id, pname, params);
6775
6776 try
6777 {
6778 gl::Context *context = gl::getNonLostContext();
6779
6780 if (context)
6781 {
6782 if (context->getClientVersion() < 3)
6783 {
6784 return gl::error(GL_INVALID_OPERATION);
6785 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006786
Jamie Madill3641b4b2013-07-26 12:54:59 -04006787 // TODO: XFB queries
6788 glGetQueryObjectuivEXT(id, pname, params);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006789 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006790 }
6791 catch(std::bad_alloc&)
6792 {
6793 return gl::error(GL_OUT_OF_MEMORY);
6794 }
6795}
6796
6797GLboolean __stdcall glUnmapBuffer(GLenum target)
6798{
6799 EVENT("(GLenum target = 0x%X)", target);
6800
6801 try
6802 {
6803 gl::Context *context = gl::getNonLostContext();
6804
6805 if (context)
6806 {
6807 if (context->getClientVersion() < 3)
6808 {
6809 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
6810 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006811
Jamie Madill54133512013-06-21 09:33:07 -04006812 // glUnmapBuffer
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006813 UNIMPLEMENTED();
6814 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006815 }
6816 catch(std::bad_alloc&)
6817 {
6818 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
6819 }
6820
6821 return GL_FALSE;
6822}
6823
6824void __stdcall glGetBufferPointerv(GLenum target, GLenum pname, GLvoid** params)
6825{
6826 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLvoid** params = 0x%0.8p)", target, pname, params);
6827
6828 try
6829 {
6830 gl::Context *context = gl::getNonLostContext();
6831
6832 if (context)
6833 {
6834 if (context->getClientVersion() < 3)
6835 {
6836 return gl::error(GL_INVALID_OPERATION);
6837 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006838
Jamie Madill54133512013-06-21 09:33:07 -04006839 // glGetBufferPointerv
shannonwoods@chromium.org2d2190a2013-05-30 00:17:35 +00006840 UNIMPLEMENTED();
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006841 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006842 }
6843 catch(std::bad_alloc&)
6844 {
6845 return gl::error(GL_OUT_OF_MEMORY);
6846 }
6847}
6848
6849void __stdcall glDrawBuffers(GLsizei n, const GLenum* bufs)
6850{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006851 try
6852 {
6853 gl::Context *context = gl::getNonLostContext();
6854
6855 if (context)
6856 {
6857 if (context->getClientVersion() < 3)
6858 {
6859 return gl::error(GL_INVALID_OPERATION);
6860 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006861
shannon.woods%transgaming.com@gtempaccount.com7948c5f2013-04-13 03:38:58 +00006862 glDrawBuffersEXT(n, bufs);
6863 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006864 }
6865 catch(std::bad_alloc&)
6866 {
6867 return gl::error(GL_OUT_OF_MEMORY);
6868 }
6869}
6870
6871void __stdcall glUniformMatrix2x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
6872{
6873 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
6874 location, count, transpose, value);
6875
6876 try
6877 {
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006878 if (count < 0)
6879 {
6880 return gl::error(GL_INVALID_VALUE);
6881 }
6882
6883 if (location == -1)
6884 {
6885 return;
6886 }
6887
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006888 gl::Context *context = gl::getNonLostContext();
6889
6890 if (context)
6891 {
6892 if (context->getClientVersion() < 3)
6893 {
6894 return gl::error(GL_INVALID_OPERATION);
6895 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006896
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006897 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
6898 if (!programBinary)
6899 {
6900 return gl::error(GL_INVALID_OPERATION);
6901 }
6902
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00006903 if (!programBinary->setUniformMatrix2x3fv(location, count, transpose, value))
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006904 {
6905 return gl::error(GL_INVALID_OPERATION);
6906 }
6907 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006908 }
6909 catch(std::bad_alloc&)
6910 {
6911 return gl::error(GL_OUT_OF_MEMORY);
6912 }
6913}
6914
6915void __stdcall glUniformMatrix3x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
6916{
6917 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
6918 location, count, transpose, value);
6919
6920 try
6921 {
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006922 if (count < 0)
6923 {
6924 return gl::error(GL_INVALID_VALUE);
6925 }
6926
6927 if (location == -1)
6928 {
6929 return;
6930 }
6931
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006932 gl::Context *context = gl::getNonLostContext();
6933
6934 if (context)
6935 {
6936 if (context->getClientVersion() < 3)
6937 {
6938 return gl::error(GL_INVALID_OPERATION);
6939 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006940
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006941 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
6942 if (!programBinary)
6943 {
6944 return gl::error(GL_INVALID_OPERATION);
6945 }
6946
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00006947 if (!programBinary->setUniformMatrix3x2fv(location, count, transpose, value))
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006948 {
6949 return gl::error(GL_INVALID_OPERATION);
6950 }
6951 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006952 }
6953 catch(std::bad_alloc&)
6954 {
6955 return gl::error(GL_OUT_OF_MEMORY);
6956 }
6957}
6958
6959void __stdcall glUniformMatrix2x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
6960{
6961 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
6962 location, count, transpose, value);
6963
6964 try
6965 {
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006966 if (count < 0)
6967 {
6968 return gl::error(GL_INVALID_VALUE);
6969 }
6970
6971 if (location == -1)
6972 {
6973 return;
6974 }
6975
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006976 gl::Context *context = gl::getNonLostContext();
6977
6978 if (context)
6979 {
6980 if (context->getClientVersion() < 3)
6981 {
6982 return gl::error(GL_INVALID_OPERATION);
6983 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006984
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006985 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
6986 if (!programBinary)
6987 {
6988 return gl::error(GL_INVALID_OPERATION);
6989 }
6990
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00006991 if (!programBinary->setUniformMatrix2x4fv(location, count, transpose, value))
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006992 {
6993 return gl::error(GL_INVALID_OPERATION);
6994 }
6995 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006996 }
6997 catch(std::bad_alloc&)
6998 {
6999 return gl::error(GL_OUT_OF_MEMORY);
7000 }
7001}
7002
7003void __stdcall glUniformMatrix4x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
7004{
7005 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
7006 location, count, transpose, value);
7007
7008 try
7009 {
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00007010 if (count < 0)
7011 {
7012 return gl::error(GL_INVALID_VALUE);
7013 }
7014
7015 if (location == -1)
7016 {
7017 return;
7018 }
7019
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007020 gl::Context *context = gl::getNonLostContext();
7021
7022 if (context)
7023 {
7024 if (context->getClientVersion() < 3)
7025 {
7026 return gl::error(GL_INVALID_OPERATION);
7027 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007028
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00007029 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
7030 if (!programBinary)
7031 {
7032 return gl::error(GL_INVALID_OPERATION);
7033 }
7034
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00007035 if (!programBinary->setUniformMatrix4x2fv(location, count, transpose, value))
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00007036 {
7037 return gl::error(GL_INVALID_OPERATION);
7038 }
7039 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007040 }
7041 catch(std::bad_alloc&)
7042 {
7043 return gl::error(GL_OUT_OF_MEMORY);
7044 }
7045}
7046
7047void __stdcall glUniformMatrix3x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
7048{
7049 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
7050 location, count, transpose, value);
7051
7052 try
7053 {
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00007054 if (count < 0)
7055 {
7056 return gl::error(GL_INVALID_VALUE);
7057 }
7058
7059 if (location == -1)
7060 {
7061 return;
7062 }
7063
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007064 gl::Context *context = gl::getNonLostContext();
7065
7066 if (context)
7067 {
7068 if (context->getClientVersion() < 3)
7069 {
7070 return gl::error(GL_INVALID_OPERATION);
7071 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007072
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00007073 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
7074 if (!programBinary)
7075 {
7076 return gl::error(GL_INVALID_OPERATION);
7077 }
7078
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00007079 if (!programBinary->setUniformMatrix3x4fv(location, count, transpose, value))
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00007080 {
7081 return gl::error(GL_INVALID_OPERATION);
7082 }
7083 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007084 }
7085 catch(std::bad_alloc&)
7086 {
7087 return gl::error(GL_OUT_OF_MEMORY);
7088 }
7089}
7090
7091void __stdcall glUniformMatrix4x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
7092{
7093 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
7094 location, count, transpose, value);
7095
7096 try
7097 {
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00007098 if (count < 0)
7099 {
7100 return gl::error(GL_INVALID_VALUE);
7101 }
7102
7103 if (location == -1)
7104 {
7105 return;
7106 }
7107
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007108 gl::Context *context = gl::getNonLostContext();
7109
7110 if (context)
7111 {
7112 if (context->getClientVersion() < 3)
7113 {
7114 return gl::error(GL_INVALID_OPERATION);
7115 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007116
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00007117 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
7118 if (!programBinary)
7119 {
7120 return gl::error(GL_INVALID_OPERATION);
7121 }
7122
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00007123 if (!programBinary->setUniformMatrix4x3fv(location, count, transpose, value))
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00007124 {
7125 return gl::error(GL_INVALID_OPERATION);
7126 }
7127 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007128 }
7129 catch(std::bad_alloc&)
7130 {
7131 return gl::error(GL_OUT_OF_MEMORY);
7132 }
7133}
7134
7135void __stdcall glBlitFramebuffer(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter)
7136{
7137 EVENT("(GLint srcX0 = %d, GLint srcY0 = %d, GLint srcX1 = %d, GLint srcY1 = %d, GLint dstX0 = %d, "
7138 "GLint dstY0 = %d, GLint dstX1 = %d, GLint dstY1 = %d, GLbitfield mask = 0x%X, GLenum filter = 0x%X)",
7139 srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter);
7140
7141 try
7142 {
7143 gl::Context *context = gl::getNonLostContext();
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007144 if (context)
7145 {
7146 if (context->getClientVersion() < 3)
7147 {
7148 return gl::error(GL_INVALID_OPERATION);
7149 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007150
Geoff Lang34dbb6f2013-08-05 15:05:47 -04007151 if (!ValidateBlitFramebufferParameters(context, srcX0, srcY0, srcX1, srcY1,
Geoff Lang758d5b22013-06-11 11:42:50 -04007152 dstX0, dstY0, dstX1, dstY1, mask, filter,
7153 false))
7154 {
7155 return;
7156 }
7157
7158 context->blitFramebuffer(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1,
7159 mask, filter);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007160 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007161 }
7162 catch(std::bad_alloc&)
7163 {
7164 return gl::error(GL_OUT_OF_MEMORY);
7165 }
7166}
7167
7168void __stdcall glRenderbufferStorageMultisample(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height)
7169{
7170 EVENT("(GLenum target = 0x%X, GLsizei samples = %d, GLenum internalformat = 0x%X, GLsizei width = %d, GLsizei height = %d)",
7171 target, samples, internalformat, width, height);
7172
7173 try
7174 {
7175 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
Geoff Lang34dbb6f2013-08-05 15:05:47 -04007184 if (!ValidateRenderbufferStorageParameters(context, target, samples, internalformat,
Geoff Lang2e1dcd52013-05-29 10:34:08 -04007185 width, height, false))
7186 {
7187 return;
7188 }
7189
7190 context->setRenderbufferStorage(width, height, internalformat, samples);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007191 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007192 }
7193 catch(std::bad_alloc&)
7194 {
7195 return gl::error(GL_OUT_OF_MEMORY);
7196 }
7197}
7198
7199void __stdcall glFramebufferTextureLayer(GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer)
7200{
7201 EVENT("(GLenum target = 0x%X, GLenum attachment = 0x%X, GLuint texture = %u, GLint level = %d, GLint layer = %d)",
7202 target, attachment, texture, level, layer);
7203
7204 try
7205 {
7206 gl::Context *context = gl::getNonLostContext();
7207
7208 if (context)
7209 {
7210 if (context->getClientVersion() < 3)
7211 {
7212 return gl::error(GL_INVALID_OPERATION);
7213 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007214
Geoff Lang34dbb6f2013-08-05 15:05:47 -04007215 if (!ValidateES3FramebufferTextureParameters(context, target, attachment, GL_NONE, texture, level, layer, true))
Geoff Lang3ed0c482013-07-25 17:03:18 -04007216 {
7217 return;
7218 }
7219
7220 gl::Framebuffer *framebuffer = NULL;
7221 if (target == GL_READ_FRAMEBUFFER)
7222 {
7223 framebuffer = context->getReadFramebuffer();
7224 }
7225 else
7226 {
7227 framebuffer = context->getDrawFramebuffer();
7228 }
7229
7230 gl::Texture *textureObject = context->getTexture(texture);
7231 GLenum textarget = textureObject ? textureObject->getTarget() : GL_NONE;
7232
7233 if (attachment >= GL_COLOR_ATTACHMENT0_EXT && attachment <= GL_COLOR_ATTACHMENT15_EXT)
7234 {
7235 const unsigned int colorAttachment = (attachment - GL_COLOR_ATTACHMENT0_EXT);
7236 framebuffer->setColorbuffer(colorAttachment, textarget, texture, level, layer);
7237 }
7238 else
7239 {
7240 switch (attachment)
7241 {
7242 case GL_DEPTH_ATTACHMENT: framebuffer->setDepthbuffer(textarget, texture, level, layer); break;
7243 case GL_STENCIL_ATTACHMENT: framebuffer->setStencilbuffer(textarget, texture, level, layer); break;
7244 case GL_DEPTH_STENCIL_ATTACHMENT: framebuffer->setDepthStencilBuffer(textarget, texture, level, layer); break;
7245 }
7246 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007247 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007248 }
7249 catch(std::bad_alloc&)
7250 {
7251 return gl::error(GL_OUT_OF_MEMORY);
7252 }
7253}
7254
7255GLvoid* __stdcall glMapBufferRange(GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access)
7256{
7257 EVENT("(GLenum target = 0x%X, GLintptr offset = %d, GLsizeiptr length = %d, GLbitfield access = 0x%X)",
7258 target, offset, length, access);
7259
7260 try
7261 {
7262 gl::Context *context = gl::getNonLostContext();
7263
7264 if (context)
7265 {
7266 if (context->getClientVersion() < 3)
7267 {
7268 return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLvoid*>(NULL));
7269 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007270
Jamie Madill54133512013-06-21 09:33:07 -04007271 // glMapBufferRange
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007272 UNIMPLEMENTED();
7273 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007274 }
7275 catch(std::bad_alloc&)
7276 {
7277 return gl::error(GL_OUT_OF_MEMORY, reinterpret_cast<GLvoid*>(NULL));
7278 }
7279
7280 return NULL;
7281}
7282
7283void __stdcall glFlushMappedBufferRange(GLenum target, GLintptr offset, GLsizeiptr length)
7284{
7285 EVENT("(GLenum target = 0x%X, GLintptr offset = %d, GLsizeiptr length = %d)", target, offset, length);
7286
7287 try
7288 {
7289 gl::Context *context = gl::getNonLostContext();
7290
7291 if (context)
7292 {
7293 if (context->getClientVersion() < 3)
7294 {
7295 return gl::error(GL_INVALID_OPERATION);
7296 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007297
Jamie Madill54133512013-06-21 09:33:07 -04007298 // glFlushMappedBufferRange
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007299 UNIMPLEMENTED();
7300 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007301 }
7302 catch(std::bad_alloc&)
7303 {
7304 return gl::error(GL_OUT_OF_MEMORY);
7305 }
7306}
7307
7308void __stdcall glBindVertexArray(GLuint array)
7309{
7310 EVENT("(GLuint array = %u)", array);
7311
7312 try
7313 {
7314 gl::Context *context = gl::getNonLostContext();
7315
7316 if (context)
7317 {
7318 if (context->getClientVersion() < 3)
7319 {
7320 return gl::error(GL_INVALID_OPERATION);
7321 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007322
Jamie Madilld1028542013-07-02 11:57:04 -04007323 gl::VertexArray *vao = context->getVertexArray(array);
7324
7325 if (!vao)
7326 {
7327 // The default VAO should always exist
7328 ASSERT(array != 0);
7329 return gl::error(GL_INVALID_OPERATION);
7330 }
7331
7332 context->bindVertexArray(array);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007333 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007334 }
7335 catch(std::bad_alloc&)
7336 {
7337 return gl::error(GL_OUT_OF_MEMORY);
7338 }
7339}
7340
7341void __stdcall glDeleteVertexArrays(GLsizei n, const GLuint* arrays)
7342{
7343 EVENT("(GLsizei n = %d, const GLuint* arrays = 0x%0.8p)", n, arrays);
7344
7345 try
7346 {
7347 gl::Context *context = gl::getNonLostContext();
7348
7349 if (context)
7350 {
7351 if (context->getClientVersion() < 3)
7352 {
7353 return gl::error(GL_INVALID_OPERATION);
7354 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007355
Jamie Madilld1028542013-07-02 11:57:04 -04007356 if (n < 0)
7357 {
7358 return gl::error(GL_INVALID_VALUE);
7359 }
7360
7361 for (int arrayIndex = 0; arrayIndex < n; arrayIndex++)
7362 {
7363 if (arrays[arrayIndex] != 0)
7364 {
7365 context->deleteVertexArray(arrays[arrayIndex]);
7366 }
7367 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007368 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007369 }
7370 catch(std::bad_alloc&)
7371 {
7372 return gl::error(GL_OUT_OF_MEMORY);
7373 }
7374}
7375
7376void __stdcall glGenVertexArrays(GLsizei n, GLuint* arrays)
7377{
7378 EVENT("(GLsizei n = %d, GLuint* arrays = 0x%0.8p)", n, arrays);
7379
7380 try
7381 {
7382 gl::Context *context = gl::getNonLostContext();
7383
7384 if (context)
7385 {
7386 if (context->getClientVersion() < 3)
7387 {
7388 return gl::error(GL_INVALID_OPERATION);
7389 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007390
Jamie Madilld1028542013-07-02 11:57:04 -04007391 if (n < 0)
7392 {
7393 return gl::error(GL_INVALID_VALUE);
7394 }
7395
7396 for (int arrayIndex = 0; arrayIndex < n; arrayIndex++)
7397 {
7398 arrays[arrayIndex] = context->createVertexArray();
7399 }
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
7408GLboolean __stdcall glIsVertexArray(GLuint array)
7409{
7410 EVENT("(GLuint array = %u)", array);
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, GL_FALSE);
7421 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007422
Jamie Madilld1028542013-07-02 11:57:04 -04007423 if (array == 0)
7424 {
7425 return GL_FALSE;
7426 }
7427
7428 gl::VertexArray *vao = context->getVertexArray(array);
7429
7430 return (vao != NULL ? GL_TRUE : GL_FALSE);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007431 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007432 }
7433 catch(std::bad_alloc&)
7434 {
7435 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
7436 }
7437
7438 return GL_FALSE;
7439}
7440
7441void __stdcall glGetIntegeri_v(GLenum target, GLuint index, GLint* data)
7442{
7443 EVENT("(GLenum target = 0x%X, GLuint index = %u, GLint* data = 0x%0.8p)",
7444 target, index, data);
7445
7446 try
7447 {
7448 gl::Context *context = gl::getNonLostContext();
7449
7450 if (context)
7451 {
7452 if (context->getClientVersion() < 3)
7453 {
7454 return gl::error(GL_INVALID_OPERATION);
7455 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007456
Shannon Woods15934d52013-08-19 14:28:49 -04007457 switch (target)
7458 {
7459 case GL_TRANSFORM_FEEDBACK_BUFFER_START:
7460 case GL_TRANSFORM_FEEDBACK_BUFFER_SIZE:
7461 case GL_TRANSFORM_FEEDBACK_BUFFER_BINDING:
7462 if (index >= context->getMaxTransformFeedbackBufferBindings())
7463 return gl::error(GL_INVALID_VALUE);
7464 break;
7465 case GL_UNIFORM_BUFFER_START:
7466 case GL_UNIFORM_BUFFER_SIZE:
7467 case GL_UNIFORM_BUFFER_BINDING:
7468 if (index >= context->getMaximumCombinedUniformBufferBindings())
7469 return gl::error(GL_INVALID_VALUE);
7470 break;
7471 default:
7472 return gl::error(GL_INVALID_ENUM);
7473 }
7474
7475 if (!(context->getIndexedIntegerv(target, index, data)))
7476 {
7477 GLenum nativeType;
7478 unsigned int numParams = 0;
7479 if (!context->getIndexedQueryParameterInfo(target, &nativeType, &numParams))
7480 return gl::error(GL_INVALID_ENUM);
7481
7482 if (numParams == 0)
7483 return; // it is known that pname is valid, but there are no parameters to return
7484
7485 if (nativeType == GL_INT_64_ANGLEX)
7486 {
7487 GLint64 minIntValue = static_cast<GLint64>(std::numeric_limits<int>::min());
7488 GLint64 maxIntValue = static_cast<GLint64>(std::numeric_limits<int>::max());
7489 GLint64 *int64Params = new GLint64[numParams];
7490
7491 context->getIndexedInteger64v(target, index, int64Params);
7492
7493 for (unsigned int i = 0; i < numParams; ++i)
7494 {
7495 GLint64 clampedValue = std::max(std::min(int64Params[i], maxIntValue), minIntValue);
7496 data[i] = static_cast<GLint>(clampedValue);
7497 }
7498
7499 delete [] int64Params;
7500 }
7501 else
7502 {
7503 UNREACHABLE();
7504 }
7505 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007506 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007507 }
7508 catch(std::bad_alloc&)
7509 {
7510 return gl::error(GL_OUT_OF_MEMORY);
7511 }
7512}
7513
7514void __stdcall glBeginTransformFeedback(GLenum primitiveMode)
7515{
7516 EVENT("(GLenum primitiveMode = 0x%X)", primitiveMode);
7517
7518 try
7519 {
7520 gl::Context *context = gl::getNonLostContext();
7521
7522 if (context)
7523 {
7524 if (context->getClientVersion() < 3)
7525 {
7526 return gl::error(GL_INVALID_OPERATION);
7527 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007528
Jamie Madill54133512013-06-21 09:33:07 -04007529 // glBeginTransformFeedback
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007530 UNIMPLEMENTED();
7531 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007532 }
7533 catch(std::bad_alloc&)
7534 {
7535 return gl::error(GL_OUT_OF_MEMORY);
7536 }
7537}
7538
7539void __stdcall glEndTransformFeedback(void)
7540{
7541 EVENT("(void)");
7542
7543 try
7544 {
7545 gl::Context *context = gl::getNonLostContext();
7546
7547 if (context)
7548 {
7549 if (context->getClientVersion() < 3)
7550 {
7551 return gl::error(GL_INVALID_OPERATION);
7552 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007553
Jamie Madill54133512013-06-21 09:33:07 -04007554 // glEndTransformFeedback
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007555 UNIMPLEMENTED();
7556 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007557 }
7558 catch(std::bad_alloc&)
7559 {
7560 return gl::error(GL_OUT_OF_MEMORY);
7561 }
7562}
7563
7564void __stdcall glBindBufferRange(GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size)
7565{
7566 EVENT("(GLenum target = 0x%X, GLuint index = %u, GLuint buffer = %u, GLintptr offset = %d, GLsizeiptr size = %d)",
7567 target, index, buffer, offset, size);
7568
7569 try
7570 {
7571 gl::Context *context = gl::getNonLostContext();
7572
7573 if (context)
7574 {
7575 if (context->getClientVersion() < 3)
7576 {
7577 return gl::error(GL_INVALID_OPERATION);
7578 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007579
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007580 switch (target)
7581 {
7582 case GL_TRANSFORM_FEEDBACK_BUFFER:
shannonwoods@chromium.orgd11158f2013-05-30 00:06:19 +00007583 if (index >= context->getMaxTransformFeedbackBufferBindings())
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007584 {
7585 return gl::error(GL_INVALID_VALUE);
7586 }
7587 break;
7588
7589 case GL_UNIFORM_BUFFER:
7590 if (index >= context->getMaximumCombinedUniformBufferBindings())
7591 {
7592 return gl::error(GL_INVALID_VALUE);
7593 }
7594 break;
7595
7596 default:
7597 return gl::error(GL_INVALID_ENUM);
7598 }
7599
shannonwoods@chromium.orge6e00792013-05-30 00:06:07 +00007600 if (buffer != 0 && size <= 0)
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007601 {
7602 return gl::error(GL_INVALID_VALUE);
7603 }
7604
7605 switch (target)
7606 {
7607 case GL_TRANSFORM_FEEDBACK_BUFFER:
shannonwoods@chromium.orga26aeaf2013-05-30 00:06:13 +00007608
7609 // size and offset must be a multiple of 4
7610 if (buffer != 0 && ((offset % 4) != 0 || (size % 4) != 0))
7611 {
7612 return gl::error(GL_INVALID_VALUE);
7613 }
7614
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +00007615 context->bindIndexedTransformFeedbackBuffer(buffer, index, offset, size);
7616 context->bindGenericTransformFeedbackBuffer(buffer);
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007617 break;
7618
7619 case GL_UNIFORM_BUFFER:
shannonwoods@chromium.org97c3d502013-05-30 00:04:34 +00007620
7621 // it is an error to bind an offset not a multiple of the alignment
7622 if (buffer != 0 && (offset % context->getUniformBufferOffsetAlignment()) != 0)
7623 {
7624 return gl::error(GL_INVALID_VALUE);
7625 }
7626
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +00007627 context->bindIndexedUniformBuffer(buffer, index, offset, size);
7628 context->bindGenericUniformBuffer(buffer);
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007629 break;
7630
7631 default:
7632 UNREACHABLE();
7633 }
7634 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007635 }
7636 catch(std::bad_alloc&)
7637 {
7638 return gl::error(GL_OUT_OF_MEMORY);
7639 }
7640}
7641
7642void __stdcall glBindBufferBase(GLenum target, GLuint index, GLuint buffer)
7643{
7644 EVENT("(GLenum target = 0x%X, GLuint index = %u, GLuint buffer = %u)",
7645 target, index, buffer);
7646
7647 try
7648 {
7649 gl::Context *context = gl::getNonLostContext();
7650
7651 if (context)
7652 {
7653 if (context->getClientVersion() < 3)
7654 {
7655 return gl::error(GL_INVALID_OPERATION);
7656 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007657
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007658 switch (target)
7659 {
7660 case GL_TRANSFORM_FEEDBACK_BUFFER:
shannonwoods@chromium.orgd11158f2013-05-30 00:06:19 +00007661 if (index >= context->getMaxTransformFeedbackBufferBindings())
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007662 {
7663 return gl::error(GL_INVALID_VALUE);
7664 }
7665 break;
7666
7667 case GL_UNIFORM_BUFFER:
shannonwoods@chromium.orgd11158f2013-05-30 00:06:19 +00007668 if (index >= context->getMaximumCombinedUniformBufferBindings())
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007669 {
7670 return gl::error(GL_INVALID_VALUE);
7671 }
7672 break;
7673
7674 default:
7675 return gl::error(GL_INVALID_ENUM);
7676 }
7677
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007678 switch (target)
7679 {
7680 case GL_TRANSFORM_FEEDBACK_BUFFER:
shannonwoods@chromium.org3eeca1e2013-05-30 00:04:28 +00007681 context->bindIndexedTransformFeedbackBuffer(buffer, index, 0, 0);
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +00007682 context->bindGenericTransformFeedbackBuffer(buffer);
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007683 break;
7684
7685 case GL_UNIFORM_BUFFER:
shannonwoods@chromium.org3eeca1e2013-05-30 00:04:28 +00007686 context->bindIndexedUniformBuffer(buffer, index, 0, 0);
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +00007687 context->bindGenericUniformBuffer(buffer);
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007688 break;
7689
7690 default:
7691 UNREACHABLE();
7692 }
7693 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007694 }
7695 catch(std::bad_alloc&)
7696 {
7697 return gl::error(GL_OUT_OF_MEMORY);
7698 }
7699}
7700
7701void __stdcall glTransformFeedbackVaryings(GLuint program, GLsizei count, const GLchar* const* varyings, GLenum bufferMode)
7702{
7703 EVENT("(GLuint program = %u, GLsizei count = %d, const GLchar* const* varyings = 0x%0.8p, GLenum bufferMode = 0x%X)",
7704 program, count, varyings, bufferMode);
7705
7706 try
7707 {
7708 gl::Context *context = gl::getNonLostContext();
7709
7710 if (context)
7711 {
7712 if (context->getClientVersion() < 3)
7713 {
7714 return gl::error(GL_INVALID_OPERATION);
7715 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007716
Jamie Madill54133512013-06-21 09:33:07 -04007717 // glTransformFeedbackVaryings
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007718 UNIMPLEMENTED();
7719 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007720 }
7721 catch(std::bad_alloc&)
7722 {
7723 return gl::error(GL_OUT_OF_MEMORY);
7724 }
7725}
7726
7727void __stdcall glGetTransformFeedbackVarying(GLuint program, GLuint index, GLsizei bufSize, GLsizei* length, GLsizei* size, GLenum* type, GLchar* name)
7728{
7729 EVENT("(GLuint program = %u, GLuint index = %u, GLsizei bufSize = %d, GLsizei* length = 0x%0.8p, "
7730 "GLsizei* size = 0x%0.8p, GLenum* type = 0x%0.8p, GLchar* name = 0x%0.8p)",
7731 program, index, bufSize, length, size, type, name);
7732
7733 try
7734 {
7735 gl::Context *context = gl::getNonLostContext();
7736
7737 if (context)
7738 {
7739 if (context->getClientVersion() < 3)
7740 {
7741 return gl::error(GL_INVALID_OPERATION);
7742 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007743
Jamie Madill54133512013-06-21 09:33:07 -04007744 // glGetTransformFeedbackVarying
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007745 UNIMPLEMENTED();
7746 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007747 }
7748 catch(std::bad_alloc&)
7749 {
7750 return gl::error(GL_OUT_OF_MEMORY);
7751 }
7752}
7753
7754void __stdcall glVertexAttribIPointer(GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid* pointer)
7755{
7756 EVENT("(GLuint index = %u, GLint size = %d, GLenum type = 0x%X, GLsizei stride = %d, const GLvoid* pointer = 0x%0.8p)",
7757 index, size, type, stride, pointer);
7758
7759 try
7760 {
7761 gl::Context *context = gl::getNonLostContext();
7762
7763 if (context)
7764 {
7765 if (context->getClientVersion() < 3)
7766 {
7767 return gl::error(GL_INVALID_OPERATION);
7768 }
7769 }
7770
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007771 if (index >= gl::MAX_VERTEX_ATTRIBS)
7772 {
7773 return gl::error(GL_INVALID_VALUE);
7774 }
7775
7776 if (size < 1 || size > 4)
7777 {
7778 return gl::error(GL_INVALID_VALUE);
7779 }
7780
7781 switch (type)
7782 {
7783 case GL_BYTE:
7784 case GL_UNSIGNED_BYTE:
7785 case GL_SHORT:
7786 case GL_UNSIGNED_SHORT:
7787 case GL_INT:
7788 case GL_UNSIGNED_INT:
shannon.woods%transgaming.com@gtempaccount.com1ab57be2013-04-13 03:38:39 +00007789 case GL_INT_2_10_10_10_REV:
7790 case GL_UNSIGNED_INT_2_10_10_10_REV:
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007791 break;
7792 default:
7793 return gl::error(GL_INVALID_ENUM);
7794 }
7795
7796 if (stride < 0)
7797 {
7798 return gl::error(GL_INVALID_VALUE);
7799 }
7800
shannon.woods%transgaming.com@gtempaccount.com1ab57be2013-04-13 03:38:39 +00007801 if ((type == GL_INT_2_10_10_10_REV || type == GL_UNSIGNED_INT_2_10_10_10_REV) && size != 4)
7802 {
7803 return gl::error(GL_INVALID_OPERATION);
7804 }
7805
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007806 if (context)
7807 {
Jamie Madilld8db8662013-07-02 11:57:04 -04007808 // [OpenGL ES 3.0.2] Section 2.8 page 24:
7809 // An INVALID_OPERATION error is generated when a non-zero vertex array object
7810 // is bound, zero is bound to the ARRAY_BUFFER buffer object binding point,
7811 // and the pointer argument is not NULL.
7812 if (context->getVertexArrayHandle() != 0 && context->getArrayBufferHandle() == 0 && pointer != NULL)
7813 {
7814 return gl::error(GL_INVALID_OPERATION);
7815 }
7816
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007817 context->setVertexAttribState(index, context->getArrayBuffer(), size, type, false, true,
7818 stride, pointer);
7819 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007820 }
7821 catch(std::bad_alloc&)
7822 {
7823 return gl::error(GL_OUT_OF_MEMORY);
7824 }
7825}
7826
7827void __stdcall glGetVertexAttribIiv(GLuint index, GLenum pname, GLint* params)
7828{
7829 EVENT("(GLuint index = %u, GLenum pname = 0x%X, GLint* params = 0x%0.8p)",
7830 index, pname, params);
7831
7832 try
7833 {
7834 gl::Context *context = gl::getNonLostContext();
7835
7836 if (context)
7837 {
7838 if (context->getClientVersion() < 3)
7839 {
7840 return gl::error(GL_INVALID_OPERATION);
7841 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007842
Jamie Madilla7d05862013-07-02 11:57:06 -04007843 if (index >= gl::MAX_VERTEX_ATTRIBS)
7844 {
7845 return gl::error(GL_INVALID_VALUE);
7846 }
7847
7848 const gl::VertexAttribute &attribState = context->getVertexAttribState(index);
7849
Geoff Lang34dbb6f2013-08-05 15:05:47 -04007850 if (!gl::ValidateGetVertexAttribParameters(pname, context->getClientVersion()))
Jamie Madilla7d05862013-07-02 11:57:06 -04007851 {
7852 return;
7853 }
7854
7855 if (pname == GL_CURRENT_VERTEX_ATTRIB)
7856 {
7857 const gl::VertexAttribCurrentValueData &currentValueData = context->getVertexAttribCurrentValue(index);
7858 for (int i = 0; i < 4; ++i)
7859 {
7860 params[i] = currentValueData.IntValues[i];
7861 }
7862 }
7863 else
7864 {
7865 *params = attribState.querySingleParameter<GLint>(pname);
7866 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007867 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007868 }
7869 catch(std::bad_alloc&)
7870 {
7871 return gl::error(GL_OUT_OF_MEMORY);
7872 }
7873}
7874
7875void __stdcall glGetVertexAttribIuiv(GLuint index, GLenum pname, GLuint* params)
7876{
7877 EVENT("(GLuint index = %u, GLenum pname = 0x%X, GLuint* params = 0x%0.8p)",
7878 index, pname, params);
7879
7880 try
7881 {
7882 gl::Context *context = gl::getNonLostContext();
7883
7884 if (context)
7885 {
7886 if (context->getClientVersion() < 3)
7887 {
7888 return gl::error(GL_INVALID_OPERATION);
7889 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007890
Jamie Madilla7d05862013-07-02 11:57:06 -04007891 if (index >= gl::MAX_VERTEX_ATTRIBS)
7892 {
7893 return gl::error(GL_INVALID_VALUE);
7894 }
7895
7896 const gl::VertexAttribute &attribState = context->getVertexAttribState(index);
7897
Geoff Lang34dbb6f2013-08-05 15:05:47 -04007898 if (!gl::ValidateGetVertexAttribParameters(pname, context->getClientVersion()))
Jamie Madilla7d05862013-07-02 11:57:06 -04007899 {
7900 return;
7901 }
7902
7903 if (pname == GL_CURRENT_VERTEX_ATTRIB)
7904 {
7905 const gl::VertexAttribCurrentValueData &currentValueData = context->getVertexAttribCurrentValue(index);
7906 for (int i = 0; i < 4; ++i)
7907 {
7908 params[i] = currentValueData.UnsignedIntValues[i];
7909 }
7910 }
7911 else
7912 {
7913 *params = attribState.querySingleParameter<GLuint>(pname);
7914 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007915 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007916 }
7917 catch(std::bad_alloc&)
7918 {
7919 return gl::error(GL_OUT_OF_MEMORY);
7920 }
7921}
7922
7923void __stdcall glVertexAttribI4i(GLuint index, GLint x, GLint y, GLint z, GLint w)
7924{
7925 EVENT("(GLuint index = %u, GLint x = %d, GLint y = %d, GLint z = %d, GLint w = %d)",
7926 index, x, y, z, w);
7927
7928 try
7929 {
7930 gl::Context *context = gl::getNonLostContext();
7931
7932 if (context)
7933 {
7934 if (context->getClientVersion() < 3)
7935 {
7936 return gl::error(GL_INVALID_OPERATION);
7937 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007938
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007939 if (index >= gl::MAX_VERTEX_ATTRIBS)
7940 {
7941 return gl::error(GL_INVALID_VALUE);
7942 }
7943
7944 GLint vals[4] = { x, y, z, w };
7945 context->setVertexAttribi(index, vals);
7946 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007947 }
7948 catch(std::bad_alloc&)
7949 {
7950 return gl::error(GL_OUT_OF_MEMORY);
7951 }
7952}
7953
7954void __stdcall glVertexAttribI4ui(GLuint index, GLuint x, GLuint y, GLuint z, GLuint w)
7955{
7956 EVENT("(GLuint index = %u, GLuint x = %u, GLuint y = %u, GLuint z = %u, GLuint w = %u)",
7957 index, x, y, z, w);
7958
7959 try
7960 {
7961 gl::Context *context = gl::getNonLostContext();
7962
7963 if (context)
7964 {
7965 if (context->getClientVersion() < 3)
7966 {
7967 return gl::error(GL_INVALID_OPERATION);
7968 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007969
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007970 if (index >= gl::MAX_VERTEX_ATTRIBS)
7971 {
7972 return gl::error(GL_INVALID_VALUE);
7973 }
7974
7975 GLuint vals[4] = { x, y, z, w };
7976 context->setVertexAttribu(index, vals);
7977 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007978 }
7979 catch(std::bad_alloc&)
7980 {
7981 return gl::error(GL_OUT_OF_MEMORY);
7982 }
7983}
7984
7985void __stdcall glVertexAttribI4iv(GLuint index, const GLint* v)
7986{
7987 EVENT("(GLuint index = %u, const GLint* v = 0x%0.8p)", index, v);
7988
7989 try
7990 {
7991 gl::Context *context = gl::getNonLostContext();
7992
7993 if (context)
7994 {
7995 if (context->getClientVersion() < 3)
7996 {
7997 return gl::error(GL_INVALID_OPERATION);
7998 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007999
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00008000 if (index >= gl::MAX_VERTEX_ATTRIBS)
8001 {
8002 return gl::error(GL_INVALID_VALUE);
8003 }
8004
8005 context->setVertexAttribi(index, v);
8006 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008007 }
8008 catch(std::bad_alloc&)
8009 {
8010 return gl::error(GL_OUT_OF_MEMORY);
8011 }
8012}
8013
8014void __stdcall glVertexAttribI4uiv(GLuint index, const GLuint* v)
8015{
8016 EVENT("(GLuint index = %u, const GLuint* v = 0x%0.8p)", index, v);
8017
8018 try
8019 {
8020 gl::Context *context = gl::getNonLostContext();
8021
8022 if (context)
8023 {
8024 if (context->getClientVersion() < 3)
8025 {
8026 return gl::error(GL_INVALID_OPERATION);
8027 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008028
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00008029 if (index >= gl::MAX_VERTEX_ATTRIBS)
8030 {
8031 return gl::error(GL_INVALID_VALUE);
8032 }
8033
8034 context->setVertexAttribu(index, v);
8035 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008036 }
8037 catch(std::bad_alloc&)
8038 {
8039 return gl::error(GL_OUT_OF_MEMORY);
8040 }
8041}
8042
8043void __stdcall glGetUniformuiv(GLuint program, GLint location, GLuint* params)
8044{
8045 EVENT("(GLuint program = %u, GLint location = %d, GLuint* params = 0x%0.8p)",
8046 program, location, params);
8047
8048 try
8049 {
8050 gl::Context *context = gl::getNonLostContext();
8051
8052 if (context)
8053 {
8054 if (context->getClientVersion() < 3)
8055 {
8056 return gl::error(GL_INVALID_OPERATION);
8057 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008058
shannon.woods%transgaming.com@gtempaccount.come2290122013-04-13 03:41:07 +00008059 if (program == 0)
8060 {
8061 return gl::error(GL_INVALID_VALUE);
8062 }
8063
8064 gl::Program *programObject = context->getProgram(program);
8065
8066 if (!programObject || !programObject->isLinked())
8067 {
8068 return gl::error(GL_INVALID_OPERATION);
8069 }
8070
8071 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
8072 if (!programBinary)
8073 {
8074 return gl::error(GL_INVALID_OPERATION);
8075 }
8076
8077 if (!programBinary->getUniformuiv(location, NULL, params))
8078 {
8079 return gl::error(GL_INVALID_OPERATION);
8080 }
8081 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008082 }
8083 catch(std::bad_alloc&)
8084 {
8085 return gl::error(GL_OUT_OF_MEMORY);
8086 }
8087}
8088
8089GLint __stdcall glGetFragDataLocation(GLuint program, const GLchar *name)
8090{
8091 EVENT("(GLuint program = %u, const GLchar *name = 0x%0.8p)",
8092 program, name);
8093
8094 try
8095 {
8096 gl::Context *context = gl::getNonLostContext();
8097
8098 if (context)
8099 {
8100 if (context->getClientVersion() < 3)
8101 {
Jamie Madilld1e78c92013-06-20 11:55:50 -04008102 return gl::error(GL_INVALID_OPERATION, -1);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008103 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008104
Jamie Madilld1e78c92013-06-20 11:55:50 -04008105 if (program == 0)
8106 {
8107 return gl::error(GL_INVALID_VALUE, -1);
8108 }
8109
8110 gl::Program *programObject = context->getProgram(program);
8111
8112 if (!programObject || !programObject->isLinked())
8113 {
8114 return gl::error(GL_INVALID_OPERATION, -1);
8115 }
8116
8117 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
8118 if (!programBinary)
8119 {
8120 return gl::error(GL_INVALID_OPERATION, -1);
8121 }
8122
8123 return programBinary->getFragDataLocation(name);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008124 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008125 }
8126 catch(std::bad_alloc&)
8127 {
8128 return gl::error(GL_OUT_OF_MEMORY, 0);
8129 }
8130
8131 return 0;
8132}
8133
8134void __stdcall glUniform1ui(GLint location, GLuint v0)
8135{
shannon.woods%transgaming.com@gtempaccount.com8431b9c2013-04-13 03:40:17 +00008136 glUniform1uiv(location, 1, &v0);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008137}
8138
8139void __stdcall glUniform2ui(GLint location, GLuint v0, GLuint v1)
8140{
shannon.woods%transgaming.com@gtempaccount.com8431b9c2013-04-13 03:40:17 +00008141 const GLuint xy[] = { v0, v1 };
8142 glUniform2uiv(location, 1, xy);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008143}
8144
8145void __stdcall glUniform3ui(GLint location, GLuint v0, GLuint v1, GLuint v2)
8146{
shannon.woods%transgaming.com@gtempaccount.com8431b9c2013-04-13 03:40:17 +00008147 const GLuint xyz[] = { v0, v1, v2 };
8148 glUniform3uiv(location, 1, xyz);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008149}
8150
8151void __stdcall glUniform4ui(GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3)
8152{
shannon.woods%transgaming.com@gtempaccount.com8431b9c2013-04-13 03:40:17 +00008153 const GLuint xyzw[] = { v0, v1, v2, v3 };
8154 glUniform4uiv(location, 1, xyzw);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008155}
8156
8157void __stdcall glUniform1uiv(GLint location, GLsizei count, const GLuint* value)
8158{
8159 EVENT("(GLint location = %d, GLsizei count = %d, const GLuint* value = 0x%0.8p)",
8160 location, count, value);
8161
8162 try
8163 {
8164 gl::Context *context = gl::getNonLostContext();
8165
8166 if (context)
8167 {
8168 if (context->getClientVersion() < 3)
8169 {
8170 return gl::error(GL_INVALID_OPERATION);
8171 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008172
shannon.woods%transgaming.com@gtempaccount.com50ea4ab2013-04-13 03:40:36 +00008173 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
8174 if (!programBinary)
8175 {
8176 return gl::error(GL_INVALID_OPERATION);
8177 }
8178
8179 if (!programBinary->setUniform1uiv(location, count, value))
8180 {
8181 return gl::error(GL_INVALID_OPERATION);
8182 }
8183 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008184 }
8185 catch(std::bad_alloc&)
8186 {
8187 return gl::error(GL_OUT_OF_MEMORY);
8188 }
8189}
8190
8191void __stdcall glUniform2uiv(GLint location, GLsizei count, const GLuint* value)
8192{
8193 EVENT("(GLint location = %d, GLsizei count = %d, const GLuint* value = 0x%0.8p)",
8194 location, count, value);
8195
8196 try
8197 {
8198 gl::Context *context = gl::getNonLostContext();
8199
8200 if (context)
8201 {
8202 if (context->getClientVersion() < 3)
8203 {
8204 return gl::error(GL_INVALID_OPERATION);
8205 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008206
shannon.woods%transgaming.com@gtempaccount.com50ea4ab2013-04-13 03:40:36 +00008207 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
8208 if (!programBinary)
8209 {
8210 return gl::error(GL_INVALID_OPERATION);
8211 }
8212
8213 if (!programBinary->setUniform2uiv(location, count, value))
8214 {
8215 return gl::error(GL_INVALID_OPERATION);
8216 }
8217 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008218 }
8219 catch(std::bad_alloc&)
8220 {
8221 return gl::error(GL_OUT_OF_MEMORY);
8222 }
8223}
8224
8225void __stdcall glUniform3uiv(GLint location, GLsizei count, const GLuint* value)
8226{
8227 EVENT("(GLint location = %d, GLsizei count = %d, const GLuint* value)",
8228 location, count, value);
8229
8230 try
8231 {
8232 gl::Context *context = gl::getNonLostContext();
8233
8234 if (context)
8235 {
8236 if (context->getClientVersion() < 3)
8237 {
8238 return gl::error(GL_INVALID_OPERATION);
8239 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008240
shannon.woods%transgaming.com@gtempaccount.com50ea4ab2013-04-13 03:40:36 +00008241 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
8242 if (!programBinary)
8243 {
8244 return gl::error(GL_INVALID_OPERATION);
8245 }
8246
8247 if (!programBinary->setUniform3uiv(location, count, value))
8248 {
8249 return gl::error(GL_INVALID_OPERATION);
8250 }
8251 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008252 }
8253 catch(std::bad_alloc&)
8254 {
8255 return gl::error(GL_OUT_OF_MEMORY);
8256 }
8257}
8258
8259void __stdcall glUniform4uiv(GLint location, GLsizei count, const GLuint* value)
8260{
8261 EVENT("(GLint location = %d, GLsizei count = %d, const GLuint* value = 0x%0.8p)",
8262 location, count, value);
8263
8264 try
8265 {
8266 gl::Context *context = gl::getNonLostContext();
8267
8268 if (context)
8269 {
8270 if (context->getClientVersion() < 3)
8271 {
8272 return gl::error(GL_INVALID_OPERATION);
8273 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008274
shannon.woods%transgaming.com@gtempaccount.com50ea4ab2013-04-13 03:40:36 +00008275 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
8276 if (!programBinary)
8277 {
8278 return gl::error(GL_INVALID_OPERATION);
8279 }
8280
8281 if (!programBinary->setUniform4uiv(location, count, value))
8282 {
8283 return gl::error(GL_INVALID_OPERATION);
8284 }
8285 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008286 }
8287 catch(std::bad_alloc&)
8288 {
8289 return gl::error(GL_OUT_OF_MEMORY);
8290 }
8291}
8292
8293void __stdcall glClearBufferiv(GLenum buffer, GLint drawbuffer, const GLint* value)
8294{
8295 EVENT("(GLenum buffer = 0x%X, GLint drawbuffer = %d, const GLint* value = 0x%0.8p)",
8296 buffer, drawbuffer, value);
8297
8298 try
8299 {
8300 gl::Context *context = gl::getNonLostContext();
8301
8302 if (context)
8303 {
8304 if (context->getClientVersion() < 3)
8305 {
8306 return gl::error(GL_INVALID_OPERATION);
8307 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008308
Geoff Lang42359ca2013-08-21 13:25:17 -04008309 switch (buffer)
8310 {
8311 case GL_COLOR:
8312 if (drawbuffer < 0 || drawbuffer >= static_cast<GLint>(context->getMaximumRenderTargets()))
8313 {
8314 return gl::error(GL_INVALID_VALUE);
8315 }
8316 break;
8317 case GL_STENCIL:
8318 if (drawbuffer != 0)
8319 {
8320 return gl::error(GL_INVALID_VALUE);
8321 }
8322 default:
8323 return gl::error(GL_INVALID_ENUM);
8324 }
8325
8326 context->clearBufferiv(buffer, drawbuffer, value);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008327 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008328 }
8329 catch(std::bad_alloc&)
8330 {
8331 return gl::error(GL_OUT_OF_MEMORY);
8332 }
8333}
8334
8335void __stdcall glClearBufferuiv(GLenum buffer, GLint drawbuffer, const GLuint* value)
8336{
8337 EVENT("(GLenum buffer = 0x%X, GLint drawbuffer = %d, const GLuint* value = 0x%0.8p)",
8338 buffer, drawbuffer, value);
8339
8340 try
8341 {
8342 gl::Context *context = gl::getNonLostContext();
8343
8344 if (context)
8345 {
8346 if (context->getClientVersion() < 3)
8347 {
8348 return gl::error(GL_INVALID_OPERATION);
8349 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008350
Geoff Lang42359ca2013-08-21 13:25:17 -04008351 switch (buffer)
8352 {
8353 case GL_COLOR:
8354 if (drawbuffer < 0 || drawbuffer >= static_cast<GLint>(context->getMaximumRenderTargets()))
8355 {
8356 return gl::error(GL_INVALID_VALUE);
8357 }
8358 break;
8359 default:
8360 return gl::error(GL_INVALID_ENUM);
8361 }
8362
8363 context->clearBufferuiv(buffer, drawbuffer, value);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008364 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008365 }
8366 catch(std::bad_alloc&)
8367 {
8368 return gl::error(GL_OUT_OF_MEMORY);
8369 }
8370}
8371
8372void __stdcall glClearBufferfv(GLenum buffer, GLint drawbuffer, const GLfloat* value)
8373{
8374 EVENT("(GLenum buffer = 0x%X, GLint drawbuffer = %d, const GLfloat* value = 0x%0.8p)",
8375 buffer, drawbuffer, value);
8376
8377 try
8378 {
8379 gl::Context *context = gl::getNonLostContext();
8380
8381 if (context)
8382 {
8383 if (context->getClientVersion() < 3)
8384 {
8385 return gl::error(GL_INVALID_OPERATION);
8386 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008387
Geoff Lang42359ca2013-08-21 13:25:17 -04008388 switch (buffer)
8389 {
8390 case GL_COLOR:
8391 if (drawbuffer < 0 || drawbuffer >= static_cast<GLint>(context->getMaximumRenderTargets()))
8392 {
8393 return gl::error(GL_INVALID_VALUE);
8394 }
8395 break;
8396 case GL_DEPTH:
8397 if (drawbuffer != 0)
8398 {
8399 return gl::error(GL_INVALID_VALUE);
8400 }
8401 break;
8402 default:
8403 return gl::error(GL_INVALID_ENUM);
8404 }
8405
8406 context->clearBufferfv(buffer, drawbuffer, value);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008407 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008408 }
8409 catch(std::bad_alloc&)
8410 {
8411 return gl::error(GL_OUT_OF_MEMORY);
8412 }
8413}
8414
8415void __stdcall glClearBufferfi(GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil)
8416{
8417 EVENT("(GLenum buffer = 0x%X, GLint drawbuffer = %d, GLfloat depth, GLint stencil = %d)",
8418 buffer, drawbuffer, depth, stencil);
8419
8420 try
8421 {
8422 gl::Context *context = gl::getNonLostContext();
8423
8424 if (context)
8425 {
8426 if (context->getClientVersion() < 3)
8427 {
8428 return gl::error(GL_INVALID_OPERATION);
8429 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008430
Geoff Lang42359ca2013-08-21 13:25:17 -04008431 switch (buffer)
8432 {
8433 case GL_DEPTH_STENCIL:
8434 if (drawbuffer != 0)
8435 {
8436 return gl::error(GL_INVALID_VALUE);
8437 }
8438 break;
8439 default:
8440 return gl::error(GL_INVALID_ENUM);
8441 }
8442
8443 context->clearBufferfi(buffer, drawbuffer, depth, stencil);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008444 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008445 }
8446 catch(std::bad_alloc&)
8447 {
8448 return gl::error(GL_OUT_OF_MEMORY);
8449 }
8450}
8451
8452const GLubyte* __stdcall glGetStringi(GLenum name, GLuint index)
8453{
8454 EVENT("(GLenum name = 0x%X, GLuint index = %u)", name, index);
8455
8456 try
8457 {
8458 gl::Context *context = gl::getNonLostContext();
8459
8460 if (context)
8461 {
8462 if (context->getClientVersion() < 3)
8463 {
8464 return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLubyte*>(NULL));
8465 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008466
shannonwoods@chromium.org302df742013-05-30 00:05:54 +00008467 if (name != GL_EXTENSIONS)
8468 {
8469 return gl::error(GL_INVALID_ENUM, reinterpret_cast<GLubyte*>(NULL));
8470 }
8471
8472 if (index >= context->getNumExtensions())
8473 {
8474 return gl::error(GL_INVALID_VALUE, reinterpret_cast<GLubyte*>(NULL));
8475 }
8476
8477 return reinterpret_cast<const GLubyte*>(context->getExtensionString(index));
8478 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008479 }
8480 catch(std::bad_alloc&)
8481 {
8482 return gl::error(GL_OUT_OF_MEMORY, reinterpret_cast<GLubyte*>(NULL));
8483 }
8484
8485 return NULL;
8486}
8487
8488void __stdcall glCopyBufferSubData(GLenum readTarget, GLenum writeTarget, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size)
8489{
8490 EVENT("(GLenum readTarget = 0x%X, GLenum writeTarget = 0x%X, GLintptr readOffset = %d, GLintptr writeOffset = %d, GLsizeiptr size = %d)",
8491 readTarget, writeTarget, readOffset, writeOffset, size);
8492
8493 try
8494 {
8495 gl::Context *context = gl::getNonLostContext();
8496
8497 if (context)
8498 {
8499 if (context->getClientVersion() < 3)
8500 {
8501 return gl::error(GL_INVALID_OPERATION);
8502 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008503
shannon.woods%transgaming.com@gtempaccount.com296c3f22013-04-13 03:39:39 +00008504 gl::Buffer *readBuffer = NULL;
8505 switch (readTarget)
8506 {
8507 case GL_ARRAY_BUFFER:
8508 readBuffer = context->getArrayBuffer();
8509 break;
8510 case GL_COPY_READ_BUFFER:
8511 readBuffer = context->getCopyReadBuffer();
8512 break;
8513 case GL_COPY_WRITE_BUFFER:
8514 readBuffer = context->getCopyWriteBuffer();
8515 break;
8516 case GL_ELEMENT_ARRAY_BUFFER:
8517 readBuffer = context->getElementArrayBuffer();
8518 break;
8519 case GL_PIXEL_PACK_BUFFER:
8520 readBuffer = context->getPixelPackBuffer();
8521 break;
8522 case GL_PIXEL_UNPACK_BUFFER:
8523 readBuffer = context->getPixelUnpackBuffer();
8524 break;
8525 case GL_TRANSFORM_FEEDBACK_BUFFER:
8526 readBuffer = context->getGenericTransformFeedbackBuffer();
8527 break;
8528 case GL_UNIFORM_BUFFER:
8529 readBuffer = context->getGenericUniformBuffer();
8530 break;
8531 default:
8532 return gl::error(GL_INVALID_ENUM);
8533 }
8534
8535 gl::Buffer *writeBuffer = NULL;
8536 switch (writeTarget)
8537 {
8538 case GL_ARRAY_BUFFER:
8539 writeBuffer = context->getArrayBuffer();
8540 break;
8541 case GL_COPY_READ_BUFFER:
8542 writeBuffer = context->getCopyReadBuffer();
8543 break;
8544 case GL_COPY_WRITE_BUFFER:
8545 writeBuffer = context->getCopyWriteBuffer();
8546 break;
8547 case GL_ELEMENT_ARRAY_BUFFER:
8548 writeBuffer = context->getElementArrayBuffer();
8549 break;
8550 case GL_PIXEL_PACK_BUFFER:
8551 writeBuffer = context->getPixelPackBuffer();
8552 break;
8553 case GL_PIXEL_UNPACK_BUFFER:
8554 writeBuffer = context->getPixelUnpackBuffer();
8555 break;
8556 case GL_TRANSFORM_FEEDBACK_BUFFER:
8557 writeBuffer = context->getGenericTransformFeedbackBuffer();
8558 break;
8559 case GL_UNIFORM_BUFFER:
8560 writeBuffer = context->getGenericUniformBuffer();
8561 break;
8562 default:
8563 return gl::error(GL_INVALID_ENUM);
8564 }
8565
8566 if (!readBuffer || !writeBuffer)
8567 {
8568 return gl::error(GL_INVALID_OPERATION);
8569 }
8570
8571 if (readOffset < 0 || writeOffset < 0 || size < 0 ||
8572 static_cast<unsigned int>(readOffset + size) > readBuffer->size() ||
8573 static_cast<unsigned int>(writeOffset + size) > writeBuffer->size())
8574 {
8575 return gl::error(GL_INVALID_VALUE);
8576 }
8577
8578 if (readBuffer == writeBuffer && abs(readOffset - writeOffset) < size)
8579 {
8580 return gl::error(GL_INVALID_VALUE);
8581 }
8582
8583 // TODO: Verify that readBuffer and writeBuffer are not currently mapped (GL_INVALID_OPERATION)
8584
shannon.woods%transgaming.com@gtempaccount.comc53376a2013-04-13 03:41:23 +00008585 // if size is zero, the copy is a successful no-op
8586 if (size > 0)
8587 {
8588 writeBuffer->copyBufferSubData(readBuffer, readOffset, writeOffset, size);
8589 }
shannon.woods%transgaming.com@gtempaccount.com296c3f22013-04-13 03:39:39 +00008590 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008591 }
8592 catch(std::bad_alloc&)
8593 {
8594 return gl::error(GL_OUT_OF_MEMORY);
8595 }
8596}
8597
8598void __stdcall glGetUniformIndices(GLuint program, GLsizei uniformCount, const GLchar* const* uniformNames, GLuint* uniformIndices)
8599{
8600 EVENT("(GLuint program = %u, GLsizei uniformCount = %d, const GLchar* const* uniformNames = 0x%0.8p, GLuint* uniformIndices = 0x%0.8p)",
8601 program, uniformCount, uniformNames, uniformIndices);
8602
8603 try
8604 {
8605 gl::Context *context = gl::getNonLostContext();
8606
8607 if (context)
8608 {
8609 if (context->getClientVersion() < 3)
8610 {
8611 return gl::error(GL_INVALID_OPERATION);
8612 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008613
shannonwoods@chromium.orgc2ed9912013-05-30 00:05:33 +00008614 if (uniformCount < 0)
8615 {
8616 return gl::error(GL_INVALID_VALUE);
8617 }
8618
8619 gl::Program *programObject = context->getProgram(program);
8620
8621 if (!programObject)
8622 {
8623 if (context->getShader(program))
8624 {
8625 return gl::error(GL_INVALID_OPERATION);
8626 }
8627 else
8628 {
8629 return gl::error(GL_INVALID_VALUE);
8630 }
8631 }
8632
8633 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
8634 if (!programObject->isLinked() || !programBinary)
8635 {
8636 for (int uniformId = 0; uniformId < uniformCount; uniformId++)
8637 {
8638 uniformIndices[uniformId] = GL_INVALID_INDEX;
8639 }
8640 }
8641 else
8642 {
8643 for (int uniformId = 0; uniformId < uniformCount; uniformId++)
8644 {
8645 uniformIndices[uniformId] = programBinary->getUniformIndex(uniformNames[uniformId]);
8646 }
8647 }
8648 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008649 }
8650 catch(std::bad_alloc&)
8651 {
8652 return gl::error(GL_OUT_OF_MEMORY);
8653 }
8654}
8655
8656void __stdcall glGetActiveUniformsiv(GLuint program, GLsizei uniformCount, const GLuint* uniformIndices, GLenum pname, GLint* params)
8657{
8658 EVENT("(GLuint program = %u, GLsizei uniformCount = %d, const GLuint* uniformIndices = 0x%0.8p, GLenum pname = 0x%X, GLint* params = 0x%0.8p)",
8659 program, uniformCount, uniformIndices, pname, params);
8660
8661 try
8662 {
8663 gl::Context *context = gl::getNonLostContext();
8664
8665 if (context)
8666 {
8667 if (context->getClientVersion() < 3)
8668 {
8669 return gl::error(GL_INVALID_OPERATION);
8670 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008671
shannonwoods@chromium.org2a9a9d22013-05-30 00:05:40 +00008672 if (uniformCount < 0)
8673 {
8674 return gl::error(GL_INVALID_VALUE);
8675 }
8676
8677 gl::Program *programObject = context->getProgram(program);
8678
8679 if (!programObject)
8680 {
8681 if (context->getShader(program))
8682 {
8683 return gl::error(GL_INVALID_OPERATION);
8684 }
8685 else
8686 {
8687 return gl::error(GL_INVALID_VALUE);
8688 }
8689 }
8690
8691 switch (pname)
8692 {
8693 case GL_UNIFORM_TYPE:
8694 case GL_UNIFORM_SIZE:
8695 case GL_UNIFORM_NAME_LENGTH:
8696 case GL_UNIFORM_BLOCK_INDEX:
8697 case GL_UNIFORM_OFFSET:
8698 case GL_UNIFORM_ARRAY_STRIDE:
8699 case GL_UNIFORM_MATRIX_STRIDE:
8700 case GL_UNIFORM_IS_ROW_MAJOR:
8701 break;
8702 default:
8703 return gl::error(GL_INVALID_ENUM);
8704 }
8705
8706 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
8707
8708 if (!programBinary && uniformCount > 0)
8709 {
8710 return gl::error(GL_INVALID_VALUE);
8711 }
8712
8713 for (int uniformId = 0; uniformId < uniformCount; uniformId++)
8714 {
8715 const GLuint index = uniformIndices[uniformId];
8716
8717 if (index >= (GLuint)programBinary->getActiveUniformCount())
8718 {
8719 return gl::error(GL_INVALID_VALUE);
8720 }
8721 }
8722
8723 for (int uniformId = 0; uniformId < uniformCount; uniformId++)
8724 {
8725 const GLuint index = uniformIndices[uniformId];
8726 params[uniformId] = programBinary->getActiveUniformi(index, pname);
8727 }
8728 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008729 }
8730 catch(std::bad_alloc&)
8731 {
8732 return gl::error(GL_OUT_OF_MEMORY);
8733 }
8734}
8735
8736GLuint __stdcall glGetUniformBlockIndex(GLuint program, const GLchar* uniformBlockName)
8737{
8738 EVENT("(GLuint program = %u, const GLchar* uniformBlockName = 0x%0.8p)", program, uniformBlockName);
8739
8740 try
8741 {
8742 gl::Context *context = gl::getNonLostContext();
8743
8744 if (context)
8745 {
8746 if (context->getClientVersion() < 3)
8747 {
shannonwoods@chromium.org42766252013-05-30 00:07:12 +00008748 return gl::error(GL_INVALID_OPERATION, GL_INVALID_INDEX);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008749 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008750
shannonwoods@chromium.org42766252013-05-30 00:07:12 +00008751 gl::Program *programObject = context->getProgram(program);
8752
8753 if (!programObject)
8754 {
8755 if (context->getShader(program))
8756 {
8757 return gl::error(GL_INVALID_OPERATION, GL_INVALID_INDEX);
8758 }
8759 else
8760 {
8761 return gl::error(GL_INVALID_VALUE, GL_INVALID_INDEX);
8762 }
8763 }
8764
8765 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
8766 if (!programBinary)
8767 {
8768 return GL_INVALID_INDEX;
8769 }
8770
8771 return programBinary->getUniformBlockIndex(uniformBlockName);
8772 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008773 }
8774 catch(std::bad_alloc&)
8775 {
8776 return gl::error(GL_OUT_OF_MEMORY, 0);
8777 }
8778
8779 return 0;
8780}
8781
8782void __stdcall glGetActiveUniformBlockiv(GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint* params)
8783{
8784 EVENT("(GLuint program = %u, GLuint uniformBlockIndex = %u, GLenum pname = 0x%X, GLint* params = 0x%0.8p)",
8785 program, uniformBlockIndex, pname, params);
8786
8787 try
8788 {
8789 gl::Context *context = gl::getNonLostContext();
8790
8791 if (context)
8792 {
8793 if (context->getClientVersion() < 3)
8794 {
8795 return gl::error(GL_INVALID_OPERATION);
8796 }
shannonwoods@chromium.orge7317ca2013-05-30 00:07:35 +00008797 gl::Program *programObject = context->getProgram(program);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008798
shannonwoods@chromium.orge7317ca2013-05-30 00:07:35 +00008799 if (!programObject)
8800 {
8801 if (context->getShader(program))
8802 {
8803 return gl::error(GL_INVALID_OPERATION);
8804 }
8805 else
8806 {
8807 return gl::error(GL_INVALID_VALUE);
8808 }
8809 }
8810
8811 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
8812
8813 if (!programBinary || uniformBlockIndex >= programBinary->getActiveUniformBlockCount())
8814 {
8815 return gl::error(GL_INVALID_VALUE);
8816 }
8817
8818 switch (pname)
8819 {
8820 case GL_UNIFORM_BLOCK_BINDING:
8821 *params = static_cast<GLint>(programObject->getUniformBlockBinding(uniformBlockIndex));
8822 break;
8823
8824 case GL_UNIFORM_BLOCK_DATA_SIZE:
8825 case GL_UNIFORM_BLOCK_NAME_LENGTH:
8826 case GL_UNIFORM_BLOCK_ACTIVE_UNIFORMS:
8827 case GL_UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES:
8828 case GL_UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER:
8829 case GL_UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER:
8830 programBinary->getActiveUniformBlockiv(uniformBlockIndex, pname, params);
8831 break;
8832
8833 default:
8834 return gl::error(GL_INVALID_ENUM);
8835 }
8836 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008837 }
8838 catch(std::bad_alloc&)
8839 {
8840 return gl::error(GL_OUT_OF_MEMORY);
8841 }
8842}
8843
8844void __stdcall glGetActiveUniformBlockName(GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei* length, GLchar* uniformBlockName)
8845{
8846 EVENT("(GLuint program = %u, GLuint uniformBlockIndex = %u, GLsizei bufSize = %d, GLsizei* length = 0x%0.8p, GLchar* uniformBlockName = 0x%0.8p)",
8847 program, uniformBlockIndex, bufSize, length, uniformBlockName);
8848
8849 try
8850 {
8851 gl::Context *context = gl::getNonLostContext();
8852
8853 if (context)
8854 {
8855 if (context->getClientVersion() < 3)
8856 {
8857 return gl::error(GL_INVALID_OPERATION);
8858 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008859
shannonwoods@chromium.orgbeb02782013-05-30 00:07:28 +00008860 gl::Program *programObject = context->getProgram(program);
8861
8862 if (!programObject)
8863 {
8864 if (context->getShader(program))
8865 {
8866 return gl::error(GL_INVALID_OPERATION);
8867 }
8868 else
8869 {
8870 return gl::error(GL_INVALID_VALUE);
8871 }
8872 }
8873
8874 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
8875
8876 if (!programBinary || uniformBlockIndex >= programBinary->getActiveUniformBlockCount())
8877 {
8878 return gl::error(GL_INVALID_VALUE);
8879 }
8880
8881 programBinary->getActiveUniformBlockName(uniformBlockIndex, bufSize, length, uniformBlockName);
8882 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008883 }
8884 catch(std::bad_alloc&)
8885 {
8886 return gl::error(GL_OUT_OF_MEMORY);
8887 }
8888}
8889
8890void __stdcall glUniformBlockBinding(GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding)
8891{
8892 EVENT("(GLuint program = %u, GLuint uniformBlockIndex = %u, GLuint uniformBlockBinding = %u)",
8893 program, uniformBlockIndex, uniformBlockBinding);
8894
8895 try
8896 {
8897 gl::Context *context = gl::getNonLostContext();
8898
8899 if (context)
8900 {
8901 if (context->getClientVersion() < 3)
8902 {
8903 return gl::error(GL_INVALID_OPERATION);
8904 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008905
shannonwoods@chromium.org70eb1ea2013-05-30 00:07:20 +00008906 if (uniformBlockBinding >= context->getMaximumCombinedUniformBufferBindings())
8907 {
8908 return gl::error(GL_INVALID_VALUE);
8909 }
8910
8911 gl::Program *programObject = context->getProgram(program);
8912
8913 if (!programObject)
8914 {
8915 if (context->getShader(program))
8916 {
8917 return gl::error(GL_INVALID_OPERATION);
8918 }
8919 else
8920 {
8921 return gl::error(GL_INVALID_VALUE);
8922 }
8923 }
8924
8925 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
8926
8927 // if never linked, there won't be any uniform blocks
8928 if (!programBinary || uniformBlockIndex >= programBinary->getActiveUniformBlockCount())
8929 {
8930 return gl::error(GL_INVALID_VALUE);
8931 }
8932
8933 programObject->bindUniformBlock(uniformBlockIndex, uniformBlockBinding);
8934 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008935 }
8936 catch(std::bad_alloc&)
8937 {
8938 return gl::error(GL_OUT_OF_MEMORY);
8939 }
8940}
8941
8942void __stdcall glDrawArraysInstanced(GLenum mode, GLint first, GLsizei count, GLsizei instanceCount)
8943{
8944 EVENT("(GLenum mode = 0x%X, GLint first = %d, GLsizei count = %d, GLsizei instanceCount = %d)",
8945 mode, first, count, instanceCount);
8946
8947 try
8948 {
8949 gl::Context *context = gl::getNonLostContext();
8950
8951 if (context)
8952 {
8953 if (context->getClientVersion() < 3)
8954 {
8955 return gl::error(GL_INVALID_OPERATION);
8956 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008957
Jamie Madill54133512013-06-21 09:33:07 -04008958 // glDrawArraysInstanced
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008959 UNIMPLEMENTED();
8960 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008961 }
8962 catch(std::bad_alloc&)
8963 {
8964 return gl::error(GL_OUT_OF_MEMORY);
8965 }
8966}
8967
8968void __stdcall glDrawElementsInstanced(GLenum mode, GLsizei count, GLenum type, const GLvoid* indices, GLsizei instanceCount)
8969{
8970 EVENT("(GLenum mode = 0x%X, GLsizei count = %d, GLenum type = 0x%X, const GLvoid* indices = 0x%0.8p, GLsizei instanceCount = %d)",
8971 mode, count, type, indices, instanceCount);
8972
8973 try
8974 {
8975 gl::Context *context = gl::getNonLostContext();
8976
8977 if (context)
8978 {
8979 if (context->getClientVersion() < 3)
8980 {
8981 return gl::error(GL_INVALID_OPERATION);
8982 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008983
Jamie Madill54133512013-06-21 09:33:07 -04008984 // glDrawElementsInstanced
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008985 UNIMPLEMENTED();
8986 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008987 }
8988 catch(std::bad_alloc&)
8989 {
8990 return gl::error(GL_OUT_OF_MEMORY);
8991 }
8992}
8993
8994GLsync __stdcall glFenceSync(GLenum condition, GLbitfield flags)
8995{
8996 EVENT("(GLenum condition = 0x%X, GLbitfield flags = 0x%X)", condition, flags);
8997
8998 try
8999 {
9000 gl::Context *context = gl::getNonLostContext();
9001
9002 if (context)
9003 {
9004 if (context->getClientVersion() < 3)
9005 {
Jamie Madill5215e1a2013-07-26 11:55:19 -04009006 return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLsync>(0));
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009007 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009008
Jamie Madill5215e1a2013-07-26 11:55:19 -04009009 if (condition != GL_SYNC_GPU_COMMANDS_COMPLETE)
9010 {
9011 return gl::error(GL_INVALID_ENUM, reinterpret_cast<GLsync>(0));
9012 }
9013
9014 if (flags != 0)
9015 {
9016 return gl::error(GL_INVALID_VALUE, reinterpret_cast<GLsync>(0));
9017 }
9018
9019 return context->createFenceSync(condition);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009020 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009021 }
9022 catch(std::bad_alloc&)
9023 {
9024 return gl::error(GL_OUT_OF_MEMORY, reinterpret_cast<GLsync>(NULL));
9025 }
9026
9027 return NULL;
9028}
9029
9030GLboolean __stdcall glIsSync(GLsync sync)
9031{
9032 EVENT("(GLsync sync = 0x%0.8p)", sync);
9033
9034 try
9035 {
9036 gl::Context *context = gl::getNonLostContext();
9037
9038 if (context)
9039 {
9040 if (context->getClientVersion() < 3)
9041 {
9042 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
9043 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009044
Jamie Madill5215e1a2013-07-26 11:55:19 -04009045 return (context->getFenceSync(sync) != NULL);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009046 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009047 }
9048 catch(std::bad_alloc&)
9049 {
9050 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
9051 }
9052
9053 return GL_FALSE;
9054}
9055
9056void __stdcall glDeleteSync(GLsync sync)
9057{
9058 EVENT("(GLsync sync = 0x%0.8p)", sync);
9059
9060 try
9061 {
9062 gl::Context *context = gl::getNonLostContext();
9063
9064 if (context)
9065 {
9066 if (context->getClientVersion() < 3)
9067 {
9068 return gl::error(GL_INVALID_OPERATION);
9069 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009070
Jamie Madill5215e1a2013-07-26 11:55:19 -04009071 if (sync != static_cast<GLsync>(0) && !context->getFenceSync(sync))
9072 {
9073 return gl::error(GL_INVALID_VALUE);
9074 }
9075
9076 context->deleteFenceSync(sync);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009077 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009078 }
9079 catch(std::bad_alloc&)
9080 {
9081 return gl::error(GL_OUT_OF_MEMORY);
9082 }
9083}
9084
9085GLenum __stdcall glClientWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout)
9086{
9087 EVENT("(GLsync sync = 0x%0.8p, GLbitfield flags = 0x%X, GLuint64 timeout = %llu)",
9088 sync, flags, timeout);
9089
9090 try
9091 {
9092 gl::Context *context = gl::getNonLostContext();
9093
9094 if (context)
9095 {
9096 if (context->getClientVersion() < 3)
9097 {
Jamie Madill5215e1a2013-07-26 11:55:19 -04009098 return gl::error(GL_INVALID_OPERATION, GL_WAIT_FAILED);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009099 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009100
Jamie Madill5215e1a2013-07-26 11:55:19 -04009101 if ((flags & ~(GL_SYNC_FLUSH_COMMANDS_BIT)) != 0)
9102 {
9103 return gl::error(GL_INVALID_VALUE, GL_WAIT_FAILED);
9104 }
9105
9106 gl::FenceSync *fenceSync = context->getFenceSync(sync);
9107
9108 if (!fenceSync)
9109 {
9110 return gl::error(GL_INVALID_VALUE, GL_WAIT_FAILED);
9111 }
9112
9113 return fenceSync->clientWait(flags, timeout);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009114 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009115 }
9116 catch(std::bad_alloc&)
9117 {
9118 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
9119 }
9120
9121 return GL_FALSE;
9122}
9123
9124void __stdcall glWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout)
9125{
9126 EVENT("(GLsync sync = 0x%0.8p, GLbitfield flags = 0x%X, GLuint64 timeout = %llu)",
9127 sync, flags, timeout);
9128
9129 try
9130 {
9131 gl::Context *context = gl::getNonLostContext();
9132
9133 if (context)
9134 {
9135 if (context->getClientVersion() < 3)
9136 {
9137 return gl::error(GL_INVALID_OPERATION);
9138 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009139
Jamie Madill5215e1a2013-07-26 11:55:19 -04009140 if (flags != 0)
9141 {
9142 return gl::error(GL_INVALID_VALUE);
9143 }
9144
9145 if (timeout != GL_TIMEOUT_IGNORED)
9146 {
9147 return gl::error(GL_INVALID_VALUE);
9148 }
9149
9150 gl::FenceSync *fenceSync = context->getFenceSync(sync);
9151
9152 if (!fenceSync)
9153 {
9154 return gl::error(GL_INVALID_VALUE);
9155 }
9156
9157 fenceSync->serverWait();
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009158 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009159 }
9160 catch(std::bad_alloc&)
9161 {
9162 return gl::error(GL_OUT_OF_MEMORY);
9163 }
9164}
9165
9166void __stdcall glGetInteger64v(GLenum pname, GLint64* params)
9167{
9168 EVENT("(GLenum pname = 0x%X, GLint64* params = 0x%0.8p)",
9169 pname, params);
9170
9171 try
9172 {
9173 gl::Context *context = gl::getNonLostContext();
9174
9175 if (context)
9176 {
9177 if (context->getClientVersion() < 3)
9178 {
9179 return gl::error(GL_INVALID_OPERATION);
9180 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009181
Jamie Madill71fbd602013-07-19 16:36:55 -04009182 if (!(context->getInteger64v(pname, params)))
9183 {
9184 GLenum nativeType;
9185 unsigned int numParams = 0;
9186 if (!context->getQueryParameterInfo(pname, &nativeType, &numParams))
9187 return gl::error(GL_INVALID_ENUM);
9188
9189 if (numParams == 0)
9190 return; // it is known that the pname is valid, but that there are no parameters to return.
9191
9192 if (nativeType == GL_BOOL)
9193 {
9194 GLboolean *boolParams = NULL;
9195 boolParams = new GLboolean[numParams];
9196
9197 context->getBooleanv(pname, boolParams);
9198
9199 for (unsigned int i = 0; i < numParams; ++i)
9200 {
9201 if (boolParams[i] == GL_FALSE)
9202 params[i] = 0;
9203 else
9204 params[i] = 1;
9205 }
9206
9207 delete [] boolParams;
9208 }
9209 else if (nativeType == GL_INT)
9210 {
9211 GLint *intParams = NULL;
9212 intParams = new GLint[numParams];
9213
9214 context->getIntegerv(pname, intParams);
9215
9216 for (unsigned int i = 0; i < numParams; ++i)
9217 {
9218 params[i] = static_cast<GLint64>(intParams[i]);
9219 }
9220
9221 delete [] intParams;
9222 }
9223 else if (nativeType == GL_FLOAT)
9224 {
9225 GLfloat *floatParams = NULL;
9226 floatParams = new GLfloat[numParams];
9227
9228 context->getFloatv(pname, floatParams);
9229
9230 for (unsigned int i = 0; i < numParams; ++i)
9231 {
9232 // RGBA color values and DepthRangeF values are converted to integer using Equation 2.4 from Table 4.5
9233 if (pname == GL_DEPTH_RANGE || pname == GL_COLOR_CLEAR_VALUE || pname == GL_DEPTH_CLEAR_VALUE || pname == GL_BLEND_COLOR)
9234 {
9235 params[i] = static_cast<GLint64>((static_cast<GLfloat>(0xFFFFFFFF) * floatParams[i] - 1.0f) / 2.0f);
9236 }
9237 else
9238 {
9239 params[i] = gl::iround<GLint64>(floatParams[i]);
9240 }
9241 }
9242
9243 delete [] floatParams;
9244 }
9245 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009246 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009247 }
9248 catch(std::bad_alloc&)
9249 {
9250 return gl::error(GL_OUT_OF_MEMORY);
9251 }
9252}
9253
9254void __stdcall glGetSynciv(GLsync sync, GLenum pname, GLsizei bufSize, GLsizei* length, GLint* values)
9255{
9256 EVENT("(GLsync sync = 0x%0.8p, GLenum pname = 0x%X, GLsizei bufSize = %d, GLsizei* length = 0x%0.8p, GLint* values = 0x%0.8p)",
9257 sync, pname, bufSize, length, values);
9258
9259 try
9260 {
9261 gl::Context *context = gl::getNonLostContext();
9262
9263 if (context)
9264 {
9265 if (context->getClientVersion() < 3)
9266 {
9267 return gl::error(GL_INVALID_OPERATION);
9268 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009269
Jamie Madill5215e1a2013-07-26 11:55:19 -04009270 if (bufSize < 0)
9271 {
9272 return gl::error(GL_INVALID_VALUE);
9273 }
9274
9275 gl::FenceSync *fenceSync = context->getFenceSync(sync);
9276
9277 if (!fenceSync)
9278 {
9279 return gl::error(GL_INVALID_VALUE);
9280 }
9281
9282 switch (pname)
9283 {
9284 case GL_OBJECT_TYPE: values[0] = static_cast<GLint>(GL_SYNC_FENCE); break;
9285 case GL_SYNC_STATUS: values[0] = static_cast<GLint>(fenceSync->getStatus()); break;
9286 case GL_SYNC_CONDITION: values[0] = static_cast<GLint>(fenceSync->getCondition()); break;
9287 case GL_SYNC_FLAGS: values[0] = 0; break;
9288
9289 default:
9290 return gl::error(GL_INVALID_ENUM);
9291 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009292 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009293 }
9294 catch(std::bad_alloc&)
9295 {
9296 return gl::error(GL_OUT_OF_MEMORY);
9297 }
9298}
9299
9300void __stdcall glGetInteger64i_v(GLenum target, GLuint index, GLint64* data)
9301{
9302 EVENT("(GLenum target = 0x%X, GLuint index = %u, GLint64* data = 0x%0.8p)",
9303 target, index, data);
9304
9305 try
9306 {
9307 gl::Context *context = gl::getNonLostContext();
9308
9309 if (context)
9310 {
9311 if (context->getClientVersion() < 3)
9312 {
9313 return gl::error(GL_INVALID_OPERATION);
9314 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009315
Shannon Woods15934d52013-08-19 14:28:49 -04009316 switch (target)
9317 {
9318 case GL_TRANSFORM_FEEDBACK_BUFFER_START:
9319 case GL_TRANSFORM_FEEDBACK_BUFFER_SIZE:
9320 case GL_TRANSFORM_FEEDBACK_BUFFER_BINDING:
9321 if (index >= context->getMaxTransformFeedbackBufferBindings())
9322 return gl::error(GL_INVALID_VALUE);
9323 break;
9324 case GL_UNIFORM_BUFFER_START:
9325 case GL_UNIFORM_BUFFER_SIZE:
9326 case GL_UNIFORM_BUFFER_BINDING:
9327 if (index >= context->getMaximumCombinedUniformBufferBindings())
9328 return gl::error(GL_INVALID_VALUE);
9329 break;
9330 default:
9331 return gl::error(GL_INVALID_ENUM);
9332 }
9333
9334 if (!(context->getIndexedInteger64v(target, index, data)))
9335 {
9336 GLenum nativeType;
9337 unsigned int numParams = 0;
9338 if (!context->getIndexedQueryParameterInfo(target, &nativeType, &numParams))
9339 return gl::error(GL_INVALID_ENUM);
9340
9341 if (numParams == 0)
9342 return; // it is known that pname is valid, but there are no parameters to return
9343
9344 if (nativeType == GL_INT)
9345 {
9346 GLint *intParams = new GLint[numParams];
9347
9348 context->getIndexedIntegerv(target, index, intParams);
9349
9350 for (unsigned int i = 0; i < numParams; ++i)
9351 {
9352 data[i] = static_cast<GLint64>(intParams[i]);
9353 }
9354
9355 delete [] intParams;
9356 }
9357 else
9358 {
9359 UNREACHABLE();
9360 }
9361 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009362 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009363 }
9364 catch(std::bad_alloc&)
9365 {
9366 return gl::error(GL_OUT_OF_MEMORY);
9367 }
9368}
9369
9370void __stdcall glGetBufferParameteri64v(GLenum target, GLenum pname, GLint64* params)
9371{
9372 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLint64* params = 0x%0.8p)",
9373 target, pname, params);
9374
9375 try
9376 {
9377 gl::Context *context = gl::getNonLostContext();
9378
9379 if (context)
9380 {
9381 if (context->getClientVersion() < 3)
9382 {
9383 return gl::error(GL_INVALID_OPERATION);
9384 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009385
Jamie Madill54133512013-06-21 09:33:07 -04009386 // glGetBufferParameteri64v
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009387 UNIMPLEMENTED();
9388 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009389 }
9390 catch(std::bad_alloc&)
9391 {
9392 return gl::error(GL_OUT_OF_MEMORY);
9393 }
9394}
9395
9396void __stdcall glGenSamplers(GLsizei count, GLuint* samplers)
9397{
9398 EVENT("(GLsizei count = %d, GLuint* samplers = 0x%0.8p)", count, samplers);
9399
9400 try
9401 {
9402 gl::Context *context = gl::getNonLostContext();
9403
9404 if (context)
9405 {
9406 if (context->getClientVersion() < 3)
9407 {
9408 return gl::error(GL_INVALID_OPERATION);
9409 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009410
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009411 if (count < 0)
9412 {
9413 return gl::error(GL_INVALID_VALUE);
9414 }
9415
9416 for (int i = 0; i < count; i++)
9417 {
9418 samplers[i] = context->createSampler();
9419 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009420 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009421 }
9422 catch(std::bad_alloc&)
9423 {
9424 return gl::error(GL_OUT_OF_MEMORY);
9425 }
9426}
9427
9428void __stdcall glDeleteSamplers(GLsizei count, const GLuint* samplers)
9429{
9430 EVENT("(GLsizei count = %d, const GLuint* samplers = 0x%0.8p)", count, samplers);
9431
9432 try
9433 {
9434 gl::Context *context = gl::getNonLostContext();
9435
9436 if (context)
9437 {
9438 if (context->getClientVersion() < 3)
9439 {
9440 return gl::error(GL_INVALID_OPERATION);
9441 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009442
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009443 if (count < 0)
9444 {
9445 return gl::error(GL_INVALID_VALUE);
9446 }
9447
9448 for (int i = 0; i < count; i++)
9449 {
9450 context->deleteSampler(samplers[i]);
9451 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009452 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009453 }
9454 catch(std::bad_alloc&)
9455 {
9456 return gl::error(GL_OUT_OF_MEMORY);
9457 }
9458}
9459
9460GLboolean __stdcall glIsSampler(GLuint sampler)
9461{
9462 EVENT("(GLuint sampler = %u)", sampler);
9463
9464 try
9465 {
9466 gl::Context *context = gl::getNonLostContext();
9467
9468 if (context)
9469 {
9470 if (context->getClientVersion() < 3)
9471 {
9472 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
9473 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009474
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009475 return context->isSampler(sampler);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009476 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009477 }
9478 catch(std::bad_alloc&)
9479 {
9480 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
9481 }
9482
9483 return GL_FALSE;
9484}
9485
9486void __stdcall glBindSampler(GLuint unit, GLuint sampler)
9487{
9488 EVENT("(GLuint unit = %u, GLuint sampler = %u)", unit, sampler);
9489
9490 try
9491 {
9492 gl::Context *context = gl::getNonLostContext();
9493
9494 if (context)
9495 {
9496 if (context->getClientVersion() < 3)
9497 {
9498 return gl::error(GL_INVALID_OPERATION);
9499 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009500
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009501 if (sampler != 0 && !context->isSampler(sampler))
9502 {
9503 return gl::error(GL_INVALID_OPERATION);
9504 }
9505
9506 if (unit >= context->getMaximumCombinedTextureImageUnits())
9507 {
9508 return gl::error(GL_INVALID_VALUE);
9509 }
9510
9511 context->bindSampler(unit, sampler);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009512 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009513 }
9514 catch(std::bad_alloc&)
9515 {
9516 return gl::error(GL_OUT_OF_MEMORY);
9517 }
9518}
9519
9520void __stdcall glSamplerParameteri(GLuint sampler, GLenum pname, GLint param)
9521{
9522 EVENT("(GLuint sampler = %u, GLenum pname = 0x%X, GLint param = %d)", sampler, pname, param);
9523
9524 try
9525 {
9526 gl::Context *context = gl::getNonLostContext();
9527
9528 if (context)
9529 {
9530 if (context->getClientVersion() < 3)
9531 {
9532 return gl::error(GL_INVALID_OPERATION);
9533 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009534
Geoff Lang34dbb6f2013-08-05 15:05:47 -04009535 if (!gl::ValidateSamplerObjectParameter(pname))
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009536 {
9537 return;
9538 }
9539
Geoff Lang34dbb6f2013-08-05 15:05:47 -04009540 if (!gl::ValidateTexParamParameters(context, pname, param))
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009541 {
9542 return;
9543 }
9544
9545 if (!context->isSampler(sampler))
9546 {
9547 return gl::error(GL_INVALID_OPERATION);
9548 }
9549
9550 context->samplerParameteri(sampler, pname, param);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009551 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009552 }
9553 catch(std::bad_alloc&)
9554 {
9555 return gl::error(GL_OUT_OF_MEMORY);
9556 }
9557}
9558
9559void __stdcall glSamplerParameteriv(GLuint sampler, GLenum pname, const GLint* param)
9560{
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009561 glSamplerParameteri(sampler, pname, *param);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009562}
9563
9564void __stdcall glSamplerParameterf(GLuint sampler, GLenum pname, GLfloat param)
9565{
9566 EVENT("(GLuint sampler = %u, GLenum pname = 0x%X, GLfloat param = %g)", sampler, pname, param);
9567
9568 try
9569 {
9570 gl::Context *context = gl::getNonLostContext();
9571
9572 if (context)
9573 {
9574 if (context->getClientVersion() < 3)
9575 {
9576 return gl::error(GL_INVALID_OPERATION);
9577 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009578
Geoff Lang34dbb6f2013-08-05 15:05:47 -04009579 if (!gl::ValidateSamplerObjectParameter(pname))
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009580 {
9581 return;
9582 }
9583
Geoff Lang34dbb6f2013-08-05 15:05:47 -04009584 if (!gl::ValidateTexParamParameters(context, pname, static_cast<GLint>(param)))
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009585 {
9586 return;
9587 }
9588
9589 if (!context->isSampler(sampler))
9590 {
9591 return gl::error(GL_INVALID_OPERATION);
9592 }
9593
9594 context->samplerParameterf(sampler, pname, param);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009595 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009596 }
9597 catch(std::bad_alloc&)
9598 {
9599 return gl::error(GL_OUT_OF_MEMORY);
9600 }
9601}
9602
9603void __stdcall glSamplerParameterfv(GLuint sampler, GLenum pname, const GLfloat* param)
9604{
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009605 glSamplerParameterf(sampler, pname, *param);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009606}
9607
9608void __stdcall glGetSamplerParameteriv(GLuint sampler, GLenum pname, GLint* params)
9609{
9610 EVENT("(GLuint sampler = %u, GLenum pname = 0x%X, GLint* params = 0x%0.8p)", sampler, pname, params);
9611
9612 try
9613 {
9614 gl::Context *context = gl::getNonLostContext();
9615
9616 if (context)
9617 {
9618 if (context->getClientVersion() < 3)
9619 {
9620 return gl::error(GL_INVALID_OPERATION);
9621 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009622
Geoff Lang34dbb6f2013-08-05 15:05:47 -04009623 if (!gl::ValidateSamplerObjectParameter(pname))
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009624 {
9625 return;
9626 }
9627
9628 if (!context->isSampler(sampler))
9629 {
9630 return gl::error(GL_INVALID_OPERATION);
9631 }
9632
9633 *params = context->getSamplerParameteri(sampler, pname);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009634 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009635 }
9636 catch(std::bad_alloc&)
9637 {
9638 return gl::error(GL_OUT_OF_MEMORY);
9639 }
9640}
9641
9642void __stdcall glGetSamplerParameterfv(GLuint sampler, GLenum pname, GLfloat* params)
9643{
9644 EVENT("(GLuint sample = %ur, GLenum pname = 0x%X, GLfloat* params = 0x%0.8p)", sampler, pname, params);
9645
9646 try
9647 {
9648 gl::Context *context = gl::getNonLostContext();
9649
9650 if (context)
9651 {
9652 if (context->getClientVersion() < 3)
9653 {
9654 return gl::error(GL_INVALID_OPERATION);
9655 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009656
Geoff Lang34dbb6f2013-08-05 15:05:47 -04009657 if (!gl::ValidateSamplerObjectParameter(pname))
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009658 {
9659 return;
9660 }
9661
9662 if (!context->isSampler(sampler))
9663 {
9664 return gl::error(GL_INVALID_OPERATION);
9665 }
9666
9667 *params = context->getSamplerParameterf(sampler, pname);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009668 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009669 }
9670 catch(std::bad_alloc&)
9671 {
9672 return gl::error(GL_OUT_OF_MEMORY);
9673 }
9674}
9675
9676void __stdcall glVertexAttribDivisor(GLuint index, GLuint divisor)
9677{
9678 EVENT("(GLuint index = %u, GLuint divisor = %u)", index, divisor);
9679
9680 try
9681 {
shannon.woods%transgaming.com@gtempaccount.com8736bd62013-04-13 03:35:41 +00009682 if (index >= gl::MAX_VERTEX_ATTRIBS)
9683 {
9684 return gl::error(GL_INVALID_VALUE);
9685 }
9686
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009687 gl::Context *context = gl::getNonLostContext();
9688
9689 if (context)
9690 {
9691 if (context->getClientVersion() < 3)
9692 {
9693 return gl::error(GL_INVALID_OPERATION);
9694 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009695
shannon.woods%transgaming.com@gtempaccount.com8736bd62013-04-13 03:35:41 +00009696 context->setVertexAttribDivisor(index, divisor);
9697 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009698 }
9699 catch(std::bad_alloc&)
9700 {
9701 return gl::error(GL_OUT_OF_MEMORY);
9702 }
9703}
9704
9705void __stdcall glBindTransformFeedback(GLenum target, GLuint id)
9706{
9707 EVENT("(GLenum target = 0x%X, GLuint id = %u)", target, id);
9708
9709 try
9710 {
9711 gl::Context *context = gl::getNonLostContext();
9712
9713 if (context)
9714 {
9715 if (context->getClientVersion() < 3)
9716 {
9717 return gl::error(GL_INVALID_OPERATION);
9718 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009719
Jamie Madill54133512013-06-21 09:33:07 -04009720 // glBindTransformFeedback
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009721 UNIMPLEMENTED();
9722 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009723 }
9724 catch(std::bad_alloc&)
9725 {
9726 return gl::error(GL_OUT_OF_MEMORY);
9727 }
9728}
9729
9730void __stdcall glDeleteTransformFeedbacks(GLsizei n, const GLuint* ids)
9731{
9732 EVENT("(GLsizei n = %d, const GLuint* ids = 0x%0.8p)", n, ids);
9733
9734 try
9735 {
9736 gl::Context *context = gl::getNonLostContext();
9737
9738 if (context)
9739 {
9740 if (context->getClientVersion() < 3)
9741 {
9742 return gl::error(GL_INVALID_OPERATION);
9743 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009744
Jamie Madill54133512013-06-21 09:33:07 -04009745 // glDeleteTransformFeedbacks
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009746 UNIMPLEMENTED();
9747 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009748 }
9749 catch(std::bad_alloc&)
9750 {
9751 return gl::error(GL_OUT_OF_MEMORY);
9752 }
9753}
9754
9755void __stdcall glGenTransformFeedbacks(GLsizei n, GLuint* ids)
9756{
9757 EVENT("(GLsizei n = %d, GLuint* ids = 0x%0.8p)", n, ids);
9758
9759 try
9760 {
9761 gl::Context *context = gl::getNonLostContext();
9762
9763 if (context)
9764 {
9765 if (context->getClientVersion() < 3)
9766 {
9767 return gl::error(GL_INVALID_OPERATION);
9768 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009769
Jamie Madill54133512013-06-21 09:33:07 -04009770 // glGenTransformFeedbacks
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009771 UNIMPLEMENTED();
9772 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009773 }
9774 catch(std::bad_alloc&)
9775 {
9776 return gl::error(GL_OUT_OF_MEMORY);
9777 }
9778}
9779
9780GLboolean __stdcall glIsTransformFeedback(GLuint id)
9781{
9782 EVENT("(GLuint id = %u)", id);
9783
9784 try
9785 {
9786 gl::Context *context = gl::getNonLostContext();
9787
9788 if (context)
9789 {
9790 if (context->getClientVersion() < 3)
9791 {
9792 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
9793 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009794
Jamie Madill54133512013-06-21 09:33:07 -04009795 // glIsTransformFeedback
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009796 UNIMPLEMENTED();
9797 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009798 }
9799 catch(std::bad_alloc&)
9800 {
9801 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
9802 }
9803
9804 return GL_FALSE;
9805}
9806
9807void __stdcall glPauseTransformFeedback(void)
9808{
9809 EVENT("(void)");
9810
9811 try
9812 {
9813 gl::Context *context = gl::getNonLostContext();
9814
9815 if (context)
9816 {
9817 if (context->getClientVersion() < 3)
9818 {
9819 return gl::error(GL_INVALID_OPERATION);
9820 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009821
Jamie Madill54133512013-06-21 09:33:07 -04009822 // glPauseTransformFeedback
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009823 UNIMPLEMENTED();
9824 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009825 }
9826 catch(std::bad_alloc&)
9827 {
9828 return gl::error(GL_OUT_OF_MEMORY);
9829 }
9830}
9831
9832void __stdcall glResumeTransformFeedback(void)
9833{
9834 EVENT("(void)");
9835
9836 try
9837 {
9838 gl::Context *context = gl::getNonLostContext();
9839
9840 if (context)
9841 {
9842 if (context->getClientVersion() < 3)
9843 {
9844 return gl::error(GL_INVALID_OPERATION);
9845 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009846
Jamie Madill54133512013-06-21 09:33:07 -04009847 // glResumeTransformFeedback
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009848 UNIMPLEMENTED();
9849 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009850 }
9851 catch(std::bad_alloc&)
9852 {
9853 return gl::error(GL_OUT_OF_MEMORY);
9854 }
9855}
9856
9857void __stdcall glGetProgramBinary(GLuint program, GLsizei bufSize, GLsizei* length, GLenum* binaryFormat, GLvoid* binary)
9858{
9859 EVENT("(GLuint program = %u, GLsizei bufSize = %d, GLsizei* length = 0x%0.8p, GLenum* binaryFormat = 0x%0.8p, GLvoid* binary = 0x%0.8p)",
9860 program, bufSize, length, binaryFormat, binary);
9861
9862 try
9863 {
9864 gl::Context *context = gl::getNonLostContext();
9865
9866 if (context)
9867 {
9868 if (context->getClientVersion() < 3)
9869 {
9870 return gl::error(GL_INVALID_OPERATION);
9871 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009872
Jamie Madill54133512013-06-21 09:33:07 -04009873 // glGetProgramBinary
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009874 UNIMPLEMENTED();
9875 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009876 }
9877 catch(std::bad_alloc&)
9878 {
9879 return gl::error(GL_OUT_OF_MEMORY);
9880 }
9881}
9882
9883void __stdcall glProgramBinary(GLuint program, GLenum binaryFormat, const GLvoid* binary, GLsizei length)
9884{
9885 EVENT("(GLuint program = %u, GLenum binaryFormat = 0x%X, const GLvoid* binary = 0x%0.8p, GLsizei length = %d)",
9886 program, binaryFormat, binary, length);
9887
9888 try
9889 {
9890 gl::Context *context = gl::getNonLostContext();
9891
9892 if (context)
9893 {
9894 if (context->getClientVersion() < 3)
9895 {
9896 return gl::error(GL_INVALID_OPERATION);
9897 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009898
Jamie Madill54133512013-06-21 09:33:07 -04009899 // glProgramBinary
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009900 UNIMPLEMENTED();
9901 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009902 }
9903 catch(std::bad_alloc&)
9904 {
9905 return gl::error(GL_OUT_OF_MEMORY);
9906 }
9907}
9908
9909void __stdcall glProgramParameteri(GLuint program, GLenum pname, GLint value)
9910{
9911 EVENT("(GLuint program = %u, GLenum pname = 0x%X, GLint value = %d)",
9912 program, pname, value);
9913
9914 try
9915 {
9916 gl::Context *context = gl::getNonLostContext();
9917
9918 if (context)
9919 {
9920 if (context->getClientVersion() < 3)
9921 {
9922 return gl::error(GL_INVALID_OPERATION);
9923 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009924
Jamie Madill54133512013-06-21 09:33:07 -04009925 // glProgramParameteri
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009926 UNIMPLEMENTED();
9927 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009928 }
9929 catch(std::bad_alloc&)
9930 {
9931 return gl::error(GL_OUT_OF_MEMORY);
9932 }
9933}
9934
9935void __stdcall glInvalidateFramebuffer(GLenum target, GLsizei numAttachments, const GLenum* attachments)
9936{
9937 EVENT("(GLenum target = 0x%X, GLsizei numAttachments = %d, const GLenum* attachments = 0x%0.8p)",
9938 target, numAttachments, attachments);
9939
9940 try
9941 {
9942 gl::Context *context = gl::getNonLostContext();
9943
9944 if (context)
9945 {
9946 if (context->getClientVersion() < 3)
9947 {
9948 return gl::error(GL_INVALID_OPERATION);
9949 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009950
Geoff Lang34dbb6f2013-08-05 15:05:47 -04009951 if (!ValidateInvalidateFramebufferParameters(context, target, numAttachments, attachments))
shannonwoods@chromium.orgd63ef892013-05-30 00:10:56 +00009952 {
9953 return;
9954 }
9955
9956 int maxDimension = context->getMaximumRenderbufferDimension();
9957 context->invalidateFrameBuffer(target, numAttachments, attachments, 0, 0, maxDimension, maxDimension);
9958 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009959 }
9960 catch(std::bad_alloc&)
9961 {
9962 return gl::error(GL_OUT_OF_MEMORY);
9963 }
9964}
9965
9966void __stdcall glInvalidateSubFramebuffer(GLenum target, GLsizei numAttachments, const GLenum* attachments, GLint x, GLint y, GLsizei width, GLsizei height)
9967{
9968 EVENT("(GLenum target = 0x%X, GLsizei numAttachments = %d, const GLenum* attachments = 0x%0.8p, GLint x = %d, "
9969 "GLint y = %d, GLsizei width = %d, GLsizei height = %d)",
9970 target, numAttachments, attachments, x, y, width, height);
9971
9972 try
9973 {
9974 gl::Context *context = gl::getNonLostContext();
9975
9976 if (context)
9977 {
9978 if (context->getClientVersion() < 3)
9979 {
9980 return gl::error(GL_INVALID_OPERATION);
9981 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009982
Geoff Lang34dbb6f2013-08-05 15:05:47 -04009983 if (!ValidateInvalidateFramebufferParameters(context, target, numAttachments, attachments))
shannonwoods@chromium.orgd63ef892013-05-30 00:10:56 +00009984 {
9985 return;
9986 }
9987
9988 context->invalidateFrameBuffer(target, numAttachments, attachments, x, y, width, height);
9989 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009990 }
9991 catch(std::bad_alloc&)
9992 {
9993 return gl::error(GL_OUT_OF_MEMORY);
9994 }
9995}
9996
9997void __stdcall glTexStorage2D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height)
9998{
9999 EVENT("(GLenum target = 0x%X, GLsizei levels = %d, GLenum internalformat = 0x%X, GLsizei width = %d, GLsizei height = %d)",
10000 target, levels, internalformat, width, height);
10001
10002 try
10003 {
10004 gl::Context *context = gl::getNonLostContext();
10005
10006 if (context)
10007 {
10008 if (context->getClientVersion() < 3)
10009 {
10010 return gl::error(GL_INVALID_OPERATION);
10011 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +000010012
Geoff Lang34dbb6f2013-08-05 15:05:47 -040010013 if (!ValidateES3TexStorageParameters(context, target, levels, internalformat, width, height, 1))
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +000010014 {
10015 return;
10016 }
10017
10018 switch (target)
10019 {
10020 case GL_TEXTURE_2D:
10021 {
10022 gl::Texture2D *texture2d = context->getTexture2D();
10023 texture2d->storage(levels, internalformat, width, height);
10024 }
10025 break;
10026
10027 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
10028 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
10029 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
10030 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
10031 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
10032 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
10033 {
10034 gl::TextureCubeMap *textureCube = context->getTextureCubeMap();
10035 textureCube->storage(levels, internalformat, width);
10036 }
10037 break;
10038
10039 default:
10040 return gl::error(GL_INVALID_ENUM);
10041 }
10042 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +000010043 }
10044 catch(std::bad_alloc&)
10045 {
10046 return gl::error(GL_OUT_OF_MEMORY);
10047 }
10048}
10049
10050void __stdcall glTexStorage3D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth)
10051{
10052 EVENT("(GLenum target = 0x%X, GLsizei levels = %d, GLenum internalformat = 0x%X, GLsizei width = %d, "
10053 "GLsizei height = %d, GLsizei depth = %d)",
10054 target, levels, internalformat, width, height, depth);
10055
10056 try
10057 {
10058 gl::Context *context = gl::getNonLostContext();
10059
10060 if (context)
10061 {
10062 if (context->getClientVersion() < 3)
10063 {
10064 return gl::error(GL_INVALID_OPERATION);
10065 }
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +000010066
Geoff Lang34dbb6f2013-08-05 15:05:47 -040010067 if (!ValidateES3TexStorageParameters(context, target, levels, internalformat, width, height, depth))
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +000010068 {
10069 return;
10070 }
10071
10072 switch (target)
10073 {
10074 case GL_TEXTURE_3D:
10075 {
10076 gl::Texture3D *texture3d = context->getTexture3D();
10077 texture3d->storage(levels, internalformat, width, height, depth);
10078 }
10079 break;
10080
10081 case GL_TEXTURE_2D_ARRAY:
10082 {
10083 gl::Texture2DArray *texture2darray = context->getTexture2DArray();
10084 texture2darray->storage(levels, internalformat, width, height, depth);
10085 }
10086 break;
10087
10088 default:
10089 return gl::error(GL_INVALID_ENUM);
10090 }
shannon.woods%transgaming.com@gtempaccount.com14eb55e2013-04-13 03:35:06 +000010091 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +000010092 }
10093 catch(std::bad_alloc&)
10094 {
10095 return gl::error(GL_OUT_OF_MEMORY);
10096 }
10097}
10098
10099void __stdcall glGetInternalformativ(GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize, GLint* params)
10100{
10101 EVENT("(GLenum target = 0x%X, GLenum internalformat = 0x%X, GLenum pname = 0x%X, GLsizei bufSize = %d, "
10102 "GLint* params = 0x%0.8p)",
10103 target, internalformat, pname, bufSize, params);
10104
10105 try
10106 {
10107 gl::Context *context = gl::getNonLostContext();
10108
10109 if (context)
10110 {
10111 if (context->getClientVersion() < 3)
10112 {
10113 return gl::error(GL_INVALID_OPERATION);
10114 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +000010115
Shannon Woods809d2502013-07-08 10:32:18 -040010116 if (!gl::IsColorRenderingSupported(internalformat, context) &&
10117 !gl::IsDepthRenderingSupported(internalformat, context) &&
10118 !gl::IsStencilRenderingSupported(internalformat, context))
10119 {
10120 return gl::error(GL_INVALID_ENUM);
10121 }
10122
10123 if (target != GL_RENDERBUFFER)
10124 {
10125 return gl::error(GL_INVALID_ENUM);
10126 }
10127
10128 if (bufSize < 0)
10129 {
10130 return gl::error(GL_INVALID_VALUE);
10131 }
10132
10133 switch (pname)
10134 {
10135 case GL_NUM_SAMPLE_COUNTS:
10136 if (bufSize != 0)
10137 *params = context->getNumSampleCounts(internalformat);
10138 break;
10139 case GL_SAMPLES:
10140 context->getSampleCounts(internalformat, bufSize, params);
10141 break;
10142 default:
10143 return gl::error(GL_INVALID_ENUM);
10144 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +000010145 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +000010146 }
10147 catch(std::bad_alloc&)
10148 {
10149 return gl::error(GL_OUT_OF_MEMORY);
10150 }
10151}
10152
10153// Extension functions
10154
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +000010155void __stdcall glBlitFramebufferANGLE(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1,
10156 GLbitfield mask, GLenum filter)
10157{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +000010158 EVENT("(GLint srcX0 = %d, GLint srcY0 = %d, GLint srcX1 = %d, GLint srcY1 = %d, "
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +000010159 "GLint dstX0 = %d, GLint dstY0 = %d, GLint dstX1 = %d, GLint dstY1 = %d, "
10160 "GLbitfield mask = 0x%X, GLenum filter = 0x%X)",
10161 srcX0, srcY0, srcX1, srcX1, dstX0, dstY0, dstX1, dstY1, mask, filter);
10162
10163 try
10164 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +000010165 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +000010166
10167 if (context)
10168 {
Geoff Lang34dbb6f2013-08-05 15:05:47 -040010169 if (!ValidateBlitFramebufferParameters(context, srcX0, srcY0, srcX1, srcY1,
Geoff Lang758d5b22013-06-11 11:42:50 -040010170 dstX0, dstY0, dstX1, dstY1, mask, filter,
10171 true))
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +000010172 {
Geoff Lang758d5b22013-06-11 11:42:50 -040010173 return;
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +000010174 }
10175
Geoff Lang758d5b22013-06-11 11:42:50 -040010176 context->blitFramebuffer(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1,
10177 mask, filter);
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +000010178 }
10179 }
10180 catch(std::bad_alloc&)
10181 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010182 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +000010183 }
10184}
10185
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +000010186void __stdcall glTexImage3DOES(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth,
10187 GLint border, GLenum format, GLenum type, const GLvoid* pixels)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000010188{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +000010189 EVENT("(GLenum target = 0x%X, GLint level = %d, GLenum internalformat = 0x%X, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +000010190 "GLsizei width = %d, GLsizei height = %d, GLsizei depth = %d, GLint border = %d, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +000010191 "GLenum format = 0x%X, GLenum type = 0x%x, const GLvoid* pixels = 0x%0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000010192 target, level, internalformat, width, height, depth, border, format, type, pixels);
10193
10194 try
10195 {
10196 UNIMPLEMENTED(); // FIXME
10197 }
10198 catch(std::bad_alloc&)
10199 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010200 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000010201 }
10202}
daniel@transgaming.comce3d0f22010-05-04 03:35:14 +000010203
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010204void __stdcall glGetProgramBinaryOES(GLuint program, GLsizei bufSize, GLsizei *length,
10205 GLenum *binaryFormat, void *binary)
10206{
apatrick@chromium.org90080e32012-07-09 22:15:33 +000010207 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 +000010208 program, bufSize, length, binaryFormat, binary);
10209
10210 try
10211 {
10212 gl::Context *context = gl::getNonLostContext();
10213
10214 if (context)
10215 {
10216 gl::Program *programObject = context->getProgram(program);
10217
daniel@transgaming.com716056c2012-07-24 18:38:59 +000010218 if (!programObject || !programObject->isLinked())
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010219 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010220 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010221 }
10222
10223 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
10224
10225 if (!programBinary)
10226 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010227 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010228 }
10229
apatrick@chromium.org90080e32012-07-09 22:15:33 +000010230 if (!programBinary->save(binary, bufSize, length))
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010231 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010232 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010233 }
apatrick@chromium.org90080e32012-07-09 22:15:33 +000010234
10235 *binaryFormat = GL_PROGRAM_BINARY_ANGLE;
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010236 }
10237 }
10238 catch(std::bad_alloc&)
10239 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010240 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010241 }
10242}
10243
10244void __stdcall glProgramBinaryOES(GLuint program, GLenum binaryFormat,
10245 const void *binary, GLint length)
10246{
10247 EVENT("(GLenum program = 0x%X, binaryFormat = 0x%x, binary = 0x%0.8p, length = %d)",
10248 program, binaryFormat, binary, length);
10249
10250 try
10251 {
10252 gl::Context *context = gl::getNonLostContext();
10253
10254 if (context)
10255 {
10256 if (binaryFormat != GL_PROGRAM_BINARY_ANGLE)
10257 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010258 return gl::error(GL_INVALID_ENUM);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010259 }
10260
10261 gl::Program *programObject = context->getProgram(program);
10262
10263 if (!programObject)
10264 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010265 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010266 }
10267
daniel@transgaming.com95d29422012-07-24 18:36:10 +000010268 context->setProgramBinary(program, binary, length);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010269 }
10270 }
10271 catch(std::bad_alloc&)
10272 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010273 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010274 }
10275}
10276
shannon.woods%transgaming.com@gtempaccount.com4059a382013-04-13 03:31:16 +000010277void __stdcall glDrawBuffersEXT(GLsizei n, const GLenum *bufs)
10278{
10279 EVENT("(GLenum n = %d, bufs = 0x%0.8p)", n, bufs);
10280
10281 try
10282 {
10283 gl::Context *context = gl::getNonLostContext();
10284
10285 if (context)
10286 {
10287 if (n < 0 || (unsigned int)n > context->getMaximumRenderTargets())
10288 {
10289 return gl::error(GL_INVALID_VALUE);
10290 }
10291
10292 if (context->getDrawFramebufferHandle() == 0)
10293 {
shannon.woods%transgaming.com@gtempaccount.com2fa73c52013-04-13 03:37:20 +000010294 if (n != 1)
shannon.woods%transgaming.com@gtempaccount.com4059a382013-04-13 03:31:16 +000010295 {
10296 return gl::error(GL_INVALID_OPERATION);
10297 }
10298
shannon.woods%transgaming.com@gtempaccount.com2fa73c52013-04-13 03:37:20 +000010299 if (bufs[0] != GL_NONE && bufs[0] != GL_BACK)
shannon.woods%transgaming.com@gtempaccount.com4059a382013-04-13 03:31:16 +000010300 {
shannon.woods%transgaming.com@gtempaccount.com2fa73c52013-04-13 03:37:20 +000010301 return gl::error(GL_INVALID_OPERATION);
shannon.woods%transgaming.com@gtempaccount.com4059a382013-04-13 03:31:16 +000010302 }
10303 }
10304 else
10305 {
10306 for (int colorAttachment = 0; colorAttachment < n; colorAttachment++)
10307 {
10308 const GLenum attachment = GL_COLOR_ATTACHMENT0_EXT + colorAttachment;
10309 if (bufs[colorAttachment] != GL_NONE && bufs[colorAttachment] != attachment)
10310 {
10311 return gl::error(GL_INVALID_OPERATION);
10312 }
10313 }
10314 }
10315
10316 gl::Framebuffer *framebuffer = context->getDrawFramebuffer();
10317
10318 for (int colorAttachment = 0; colorAttachment < n; colorAttachment++)
10319 {
10320 framebuffer->setDrawBufferState(colorAttachment, bufs[colorAttachment]);
10321 }
shannon.woods%transgaming.com@gtempaccount.com2fa73c52013-04-13 03:37:20 +000010322
10323 for (int colorAttachment = n; colorAttachment < (int)context->getMaximumRenderTargets(); colorAttachment++)
10324 {
10325 framebuffer->setDrawBufferState(colorAttachment, GL_NONE);
10326 }
shannon.woods%transgaming.com@gtempaccount.com4059a382013-04-13 03:31:16 +000010327 }
10328 }
10329 catch (std::bad_alloc&)
10330 {
10331 return gl::error(GL_OUT_OF_MEMORY);
10332 }
10333}
10334
daniel@transgaming.comce3d0f22010-05-04 03:35:14 +000010335__eglMustCastToProperFunctionPointerType __stdcall glGetProcAddress(const char *procname)
10336{
10337 struct Extension
10338 {
10339 const char *name;
10340 __eglMustCastToProperFunctionPointerType address;
10341 };
10342
10343 static const Extension glExtensions[] =
10344 {
10345 {"glTexImage3DOES", (__eglMustCastToProperFunctionPointerType)glTexImage3DOES},
daniel@transgaming.com01868132010-08-24 19:21:17 +000010346 {"glBlitFramebufferANGLE", (__eglMustCastToProperFunctionPointerType)glBlitFramebufferANGLE},
daniel@transgaming.com1fe96c92011-01-14 15:08:44 +000010347 {"glRenderbufferStorageMultisampleANGLE", (__eglMustCastToProperFunctionPointerType)glRenderbufferStorageMultisampleANGLE},
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +000010348 {"glDeleteFencesNV", (__eglMustCastToProperFunctionPointerType)glDeleteFencesNV},
10349 {"glGenFencesNV", (__eglMustCastToProperFunctionPointerType)glGenFencesNV},
10350 {"glIsFenceNV", (__eglMustCastToProperFunctionPointerType)glIsFenceNV},
10351 {"glTestFenceNV", (__eglMustCastToProperFunctionPointerType)glTestFenceNV},
10352 {"glGetFenceivNV", (__eglMustCastToProperFunctionPointerType)glGetFenceivNV},
10353 {"glFinishFenceNV", (__eglMustCastToProperFunctionPointerType)glFinishFenceNV},
10354 {"glSetFenceNV", (__eglMustCastToProperFunctionPointerType)glSetFenceNV},
zmo@google.coma574f782011-10-03 21:45:23 +000010355 {"glGetTranslatedShaderSourceANGLE", (__eglMustCastToProperFunctionPointerType)glGetTranslatedShaderSourceANGLE},
daniel@transgaming.com0bd1f2f2011-11-11 04:19:03 +000010356 {"glTexStorage2DEXT", (__eglMustCastToProperFunctionPointerType)glTexStorage2DEXT},
daniel@transgaming.com709ed112011-11-12 03:18:10 +000010357 {"glGetGraphicsResetStatusEXT", (__eglMustCastToProperFunctionPointerType)glGetGraphicsResetStatusEXT},
10358 {"glReadnPixelsEXT", (__eglMustCastToProperFunctionPointerType)glReadnPixelsEXT},
10359 {"glGetnUniformfvEXT", (__eglMustCastToProperFunctionPointerType)glGetnUniformfvEXT},
10360 {"glGetnUniformivEXT", (__eglMustCastToProperFunctionPointerType)glGetnUniformivEXT},
daniel@transgaming.com86bdb822012-01-20 18:24:39 +000010361 {"glGenQueriesEXT", (__eglMustCastToProperFunctionPointerType)glGenQueriesEXT},
10362 {"glDeleteQueriesEXT", (__eglMustCastToProperFunctionPointerType)glDeleteQueriesEXT},
10363 {"glIsQueryEXT", (__eglMustCastToProperFunctionPointerType)glIsQueryEXT},
10364 {"glBeginQueryEXT", (__eglMustCastToProperFunctionPointerType)glBeginQueryEXT},
10365 {"glEndQueryEXT", (__eglMustCastToProperFunctionPointerType)glEndQueryEXT},
10366 {"glGetQueryivEXT", (__eglMustCastToProperFunctionPointerType)glGetQueryivEXT},
10367 {"glGetQueryObjectuivEXT", (__eglMustCastToProperFunctionPointerType)glGetQueryObjectuivEXT},
shannon.woods%transgaming.com@gtempaccount.com77d94722013-04-13 03:34:22 +000010368 {"glDrawBuffersEXT", (__eglMustCastToProperFunctionPointerType)glDrawBuffersEXT},
daniel@transgaming.comdce02fd2012-01-27 15:39:51 +000010369 {"glVertexAttribDivisorANGLE", (__eglMustCastToProperFunctionPointerType)glVertexAttribDivisorANGLE},
10370 {"glDrawArraysInstancedANGLE", (__eglMustCastToProperFunctionPointerType)glDrawArraysInstancedANGLE},
10371 {"glDrawElementsInstancedANGLE", (__eglMustCastToProperFunctionPointerType)glDrawElementsInstancedANGLE},
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010372 {"glGetProgramBinaryOES", (__eglMustCastToProperFunctionPointerType)glGetProgramBinaryOES},
10373 {"glProgramBinaryOES", (__eglMustCastToProperFunctionPointerType)glProgramBinaryOES}, };
daniel@transgaming.comce3d0f22010-05-04 03:35:14 +000010374
shannon.woods@transgaming.comd438fd42013-02-28 23:17:45 +000010375 for (unsigned int ext = 0; ext < ArraySize(glExtensions); ext++)
daniel@transgaming.comce3d0f22010-05-04 03:35:14 +000010376 {
10377 if (strcmp(procname, glExtensions[ext].name) == 0)
10378 {
10379 return (__eglMustCastToProperFunctionPointerType)glExtensions[ext].address;
10380 }
10381 }
10382
10383 return NULL;
10384}
10385
daniel@transgaming.com17f548c2011-11-09 17:47:02 +000010386// Non-public functions used by EGL
10387
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +000010388bool __stdcall glBindTexImage(egl::Surface *surface)
jbauman@chromium.orgae345802011-03-30 22:04:25 +000010389{
10390 EVENT("(egl::Surface* surface = 0x%0.8p)",
10391 surface);
10392
10393 try
10394 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +000010395 gl::Context *context = gl::getNonLostContext();
jbauman@chromium.orgae345802011-03-30 22:04:25 +000010396
10397 if (context)
10398 {
10399 gl::Texture2D *textureObject = context->getTexture2D();
10400
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +000010401 if (textureObject->isImmutable())
10402 {
10403 return false;
10404 }
10405
jbauman@chromium.orgae345802011-03-30 22:04:25 +000010406 if (textureObject)
10407 {
10408 textureObject->bindTexImage(surface);
10409 }
10410 }
10411 }
10412 catch(std::bad_alloc&)
10413 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010414 return gl::error(GL_OUT_OF_MEMORY, false);
jbauman@chromium.orgae345802011-03-30 22:04:25 +000010415 }
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +000010416
10417 return true;
jbauman@chromium.orgae345802011-03-30 22:04:25 +000010418}
10419
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000010420}