blob: e1820333e68b2a7997f98a6293dbba933438bb79 [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
Jamie Madillc1f8b162013-10-07 10:46:38 -04002226 // Non-power of 2 ES2 check
2227 if (!context->supportsNonPower2Texture() && (!gl::isPow2(texture->getBaseLevelWidth()) || !gl::isPow2(texture->getBaseLevelHeight())))
2228 {
2229 ASSERT(context->getClientVersion() <= 2 && (target == GL_TEXTURE_2D || target == GL_TEXTURE_CUBE_MAP));
2230 return gl::error(GL_INVALID_OPERATION);
2231 }
2232
2233 // Cube completeness check
2234 if (target == GL_TEXTURE_CUBE_MAP)
2235 {
2236 gl::TextureCubeMap *textureCube = static_cast<gl::TextureCubeMap *>(texture);
2237 if (!textureCube->isCubeComplete())
2238 {
2239 return gl::error(GL_INVALID_OPERATION);
2240 }
2241 }
2242
Geoff Langae4852a2013-06-05 15:00:34 -04002243 texture->generateMipmaps();
daniel@transgaming.com8fd99e22010-04-20 18:52:00 +00002244 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002245 }
2246 catch(std::bad_alloc&)
2247 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002248 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002249 }
2250}
2251
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002252void __stdcall glGenFencesNV(GLsizei n, GLuint* fences)
2253{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002254 EVENT("(GLsizei n = %d, GLuint* fences = 0x%0.8p)", n, fences);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002255
2256 try
2257 {
2258 if (n < 0)
2259 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002260 return gl::error(GL_INVALID_VALUE);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002261 }
2262
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002263 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002264
2265 if (context)
2266 {
2267 for (int i = 0; i < n; i++)
2268 {
Jamie Madill33dc8432013-07-26 11:55:05 -04002269 fences[i] = context->createFenceNV();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002270 }
2271 }
2272 }
2273 catch(std::bad_alloc&)
2274 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002275 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002276 }
2277}
2278
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002279void __stdcall glGenFramebuffers(GLsizei n, GLuint* framebuffers)
2280{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002281 EVENT("(GLsizei n = %d, GLuint* framebuffers = 0x%0.8p)", n, framebuffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002282
2283 try
2284 {
2285 if (n < 0)
2286 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002287 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002288 }
2289
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002290 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002291
2292 if (context)
2293 {
2294 for (int i = 0; i < n; i++)
2295 {
2296 framebuffers[i] = context->createFramebuffer();
2297 }
2298 }
2299 }
2300 catch(std::bad_alloc&)
2301 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002302 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002303 }
2304}
2305
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00002306void __stdcall glGenQueriesEXT(GLsizei n, GLuint* ids)
2307{
2308 EVENT("(GLsizei n = %d, GLuint* ids = 0x%0.8p)", n, ids);
2309
2310 try
2311 {
2312 if (n < 0)
2313 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002314 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00002315 }
2316
2317 gl::Context *context = gl::getNonLostContext();
2318
2319 if (context)
2320 {
2321 for (int i = 0; i < n; i++)
2322 {
2323 ids[i] = context->createQuery();
2324 }
2325 }
2326 }
2327 catch(std::bad_alloc&)
2328 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002329 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00002330 }
2331}
2332
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002333void __stdcall glGenRenderbuffers(GLsizei n, GLuint* renderbuffers)
2334{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002335 EVENT("(GLsizei n = %d, GLuint* renderbuffers = 0x%0.8p)", n, renderbuffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002336
2337 try
2338 {
2339 if (n < 0)
2340 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002341 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002342 }
2343
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002344 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002345
2346 if (context)
2347 {
2348 for (int i = 0; i < n; i++)
2349 {
2350 renderbuffers[i] = context->createRenderbuffer();
2351 }
2352 }
2353 }
2354 catch(std::bad_alloc&)
2355 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002356 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002357 }
2358}
2359
2360void __stdcall glGenTextures(GLsizei n, GLuint* textures)
2361{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002362 EVENT("(GLsizei n = %d, GLuint* textures = 0x%0.8p)", n, textures);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002363
2364 try
2365 {
2366 if (n < 0)
2367 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002368 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002369 }
2370
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002371 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002372
2373 if (context)
2374 {
2375 for (int i = 0; i < n; i++)
2376 {
2377 textures[i] = context->createTexture();
2378 }
2379 }
2380 }
2381 catch(std::bad_alloc&)
2382 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002383 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002384 }
2385}
2386
daniel@transgaming.com85423182010-04-22 13:35:27 +00002387void __stdcall glGetActiveAttrib(GLuint program, GLuint index, GLsizei bufsize, GLsizei *length, GLint *size, GLenum *type, GLchar *name)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002388{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002389 EVENT("(GLuint program = %d, GLuint index = %d, GLsizei bufsize = %d, GLsizei *length = 0x%0.8p, "
daniel@transgaming.com85423182010-04-22 13:35:27 +00002390 "GLint *size = 0x%0.8p, GLenum *type = %0.8p, GLchar *name = %0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002391 program, index, bufsize, length, size, type, name);
2392
2393 try
2394 {
2395 if (bufsize < 0)
2396 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002397 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002398 }
2399
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002400 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com85423182010-04-22 13:35:27 +00002401
2402 if (context)
2403 {
2404 gl::Program *programObject = context->getProgram(program);
2405
2406 if (!programObject)
2407 {
2408 if (context->getShader(program))
2409 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002410 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com85423182010-04-22 13:35:27 +00002411 }
2412 else
2413 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002414 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com85423182010-04-22 13:35:27 +00002415 }
2416 }
2417
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00002418 if (index >= (GLuint)programObject->getActiveAttributeCount())
daniel@transgaming.com85423182010-04-22 13:35:27 +00002419 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002420 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com85423182010-04-22 13:35:27 +00002421 }
2422
2423 programObject->getActiveAttribute(index, bufsize, length, size, type, name);
2424 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002425 }
2426 catch(std::bad_alloc&)
2427 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002428 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002429 }
2430}
2431
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00002432void __stdcall glGetActiveUniform(GLuint program, GLuint index, GLsizei bufsize, GLsizei* length, GLint* size, GLenum* type, GLchar* name)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002433{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002434 EVENT("(GLuint program = %d, GLuint index = %d, GLsizei bufsize = %d, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00002435 "GLsizei* length = 0x%0.8p, GLint* size = 0x%0.8p, GLenum* type = 0x%0.8p, GLchar* name = 0x%0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002436 program, index, bufsize, length, size, type, name);
2437
2438 try
2439 {
2440 if (bufsize < 0)
2441 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002442 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002443 }
2444
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002445 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00002446
2447 if (context)
2448 {
2449 gl::Program *programObject = context->getProgram(program);
2450
2451 if (!programObject)
2452 {
2453 if (context->getShader(program))
2454 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002455 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00002456 }
2457 else
2458 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002459 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00002460 }
2461 }
2462
2463 if (index >= (GLuint)programObject->getActiveUniformCount())
2464 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002465 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00002466 }
2467
2468 programObject->getActiveUniform(index, bufsize, length, size, type, name);
2469 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002470 }
2471 catch(std::bad_alloc&)
2472 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002473 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002474 }
2475}
2476
2477void __stdcall glGetAttachedShaders(GLuint program, GLsizei maxcount, GLsizei* count, GLuint* shaders)
2478{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002479 EVENT("(GLuint program = %d, GLsizei maxcount = %d, GLsizei* count = 0x%0.8p, GLuint* shaders = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00002480 program, maxcount, count, shaders);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002481
2482 try
2483 {
2484 if (maxcount < 0)
2485 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002486 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002487 }
2488
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002489 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com6c785212010-03-30 03:36:17 +00002490
2491 if (context)
2492 {
2493 gl::Program *programObject = context->getProgram(program);
2494
2495 if (!programObject)
2496 {
daniel@transgaming.com23953e32010-04-13 19:53:31 +00002497 if (context->getShader(program))
2498 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002499 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com23953e32010-04-13 19:53:31 +00002500 }
2501 else
2502 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002503 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com23953e32010-04-13 19:53:31 +00002504 }
daniel@transgaming.com6c785212010-03-30 03:36:17 +00002505 }
2506
2507 return programObject->getAttachedShaders(maxcount, count, shaders);
2508 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002509 }
2510 catch(std::bad_alloc&)
2511 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002512 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002513 }
2514}
2515
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00002516int __stdcall glGetAttribLocation(GLuint program, const GLchar* name)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002517{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002518 EVENT("(GLuint program = %d, const GLchar* name = %s)", program, name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002519
2520 try
2521 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002522 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002523
2524 if (context)
2525 {
daniel@transgaming.combb274c32010-04-13 03:26:21 +00002526
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002527 gl::Program *programObject = context->getProgram(program);
2528
2529 if (!programObject)
2530 {
daniel@transgaming.combb274c32010-04-13 03:26:21 +00002531 if (context->getShader(program))
2532 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002533 return gl::error(GL_INVALID_OPERATION, -1);
daniel@transgaming.combb274c32010-04-13 03:26:21 +00002534 }
2535 else
2536 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002537 return gl::error(GL_INVALID_VALUE, -1);
daniel@transgaming.combb274c32010-04-13 03:26:21 +00002538 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002539 }
2540
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00002541 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
daniel@transgaming.com716056c2012-07-24 18:38:59 +00002542 if (!programObject->isLinked() || !programBinary)
daniel@transgaming.comcf4aa872010-04-13 03:26:27 +00002543 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002544 return gl::error(GL_INVALID_OPERATION, -1);
daniel@transgaming.comcf4aa872010-04-13 03:26:27 +00002545 }
2546
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00002547 return programBinary->getAttributeLocation(name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002548 }
2549 }
2550 catch(std::bad_alloc&)
2551 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002552 return gl::error(GL_OUT_OF_MEMORY, -1);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002553 }
2554
2555 return -1;
2556}
2557
2558void __stdcall glGetBooleanv(GLenum pname, GLboolean* params)
2559{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002560 EVENT("(GLenum pname = 0x%X, GLboolean* params = 0x%0.8p)", pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002561
2562 try
2563 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002564 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com777f2672010-04-07 03:25:16 +00002565
2566 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002567 {
daniel@transgaming.com777f2672010-04-07 03:25:16 +00002568 if (!(context->getBooleanv(pname, params)))
2569 {
2570 GLenum nativeType;
2571 unsigned int numParams = 0;
2572 if (!context->getQueryParameterInfo(pname, &nativeType, &numParams))
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002573 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com777f2672010-04-07 03:25:16 +00002574
2575 if (numParams == 0)
2576 return; // it is known that the pname is valid, but there are no parameters to return
2577
2578 if (nativeType == GL_FLOAT)
2579 {
2580 GLfloat *floatParams = NULL;
2581 floatParams = new GLfloat[numParams];
2582
2583 context->getFloatv(pname, floatParams);
2584
2585 for (unsigned int i = 0; i < numParams; ++i)
2586 {
2587 if (floatParams[i] == 0.0f)
2588 params[i] = GL_FALSE;
2589 else
2590 params[i] = GL_TRUE;
2591 }
2592
2593 delete [] floatParams;
2594 }
2595 else if (nativeType == GL_INT)
2596 {
2597 GLint *intParams = NULL;
2598 intParams = new GLint[numParams];
2599
2600 context->getIntegerv(pname, intParams);
2601
2602 for (unsigned int i = 0; i < numParams; ++i)
2603 {
2604 if (intParams[i] == 0)
2605 params[i] = GL_FALSE;
2606 else
2607 params[i] = GL_TRUE;
2608 }
2609
2610 delete [] intParams;
2611 }
Jamie Madill71fbd602013-07-19 16:36:55 -04002612 else if (nativeType == GL_INT_64_ANGLEX)
2613 {
2614 GLint64 *int64Params = NULL;
2615 int64Params = new GLint64[numParams];
2616
2617 context->getInteger64v(pname, int64Params);
2618
2619 for (unsigned int i = 0; i < numParams; ++i)
2620 {
2621 if (int64Params[i] == 0)
2622 params[i] = GL_FALSE;
2623 else
2624 params[i] = GL_TRUE;
2625 }
2626
2627 delete [] int64Params;
2628 }
daniel@transgaming.com777f2672010-04-07 03:25:16 +00002629 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002630 }
2631 }
2632 catch(std::bad_alloc&)
2633 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002634 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002635 }
2636}
2637
2638void __stdcall glGetBufferParameteriv(GLenum target, GLenum pname, GLint* params)
2639{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002640 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 +00002641
2642 try
2643 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002644 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comaa0ccbd2010-04-15 20:45:05 +00002645
2646 if (context)
2647 {
2648 gl::Buffer *buffer;
2649
2650 switch (target)
2651 {
2652 case GL_ARRAY_BUFFER:
2653 buffer = context->getArrayBuffer();
2654 break;
2655 case GL_ELEMENT_ARRAY_BUFFER:
2656 buffer = context->getElementArrayBuffer();
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
2661 if (!buffer)
2662 {
2663 // A null buffer means that "0" is bound to the requested buffer target
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002664 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comaa0ccbd2010-04-15 20:45:05 +00002665 }
2666
2667 switch (pname)
2668 {
2669 case GL_BUFFER_USAGE:
2670 *params = buffer->usage();
2671 break;
2672 case GL_BUFFER_SIZE:
2673 *params = buffer->size();
2674 break;
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002675 default: return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comaa0ccbd2010-04-15 20:45:05 +00002676 }
2677 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002678 }
2679 catch(std::bad_alloc&)
2680 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002681 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002682 }
2683}
2684
2685GLenum __stdcall glGetError(void)
2686{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002687 EVENT("()");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002688
2689 gl::Context *context = gl::getContext();
2690
2691 if (context)
2692 {
daniel@transgaming.com82b28912011-12-12 21:01:35 +00002693 return context->getError();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002694 }
2695
2696 return GL_NO_ERROR;
2697}
2698
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002699void __stdcall glGetFenceivNV(GLuint fence, GLenum pname, GLint *params)
2700{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002701 EVENT("(GLuint fence = %d, GLenum pname = 0x%X, GLint *params = 0x%0.8p)", fence, pname, params);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002702
2703 try
2704 {
2705
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002706 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002707
2708 if (context)
2709 {
Jamie Madill33dc8432013-07-26 11:55:05 -04002710 gl::FenceNV *fenceObject = context->getFenceNV(fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002711
2712 if (fenceObject == NULL)
2713 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002714 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002715 }
2716
Jamie Madillfb9a7402013-07-26 11:55:01 -04002717 if (fenceObject->isFence() != GL_TRUE)
2718 {
2719 return gl::error(GL_INVALID_OPERATION);
2720 }
2721
2722 switch (pname)
2723 {
2724 case GL_FENCE_STATUS_NV:
2725 case GL_FENCE_CONDITION_NV:
2726 break;
2727
2728 default: return gl::error(GL_INVALID_ENUM);
2729 }
2730
2731 params[0] = fenceObject->getFencei(pname);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002732 }
2733 }
2734 catch(std::bad_alloc&)
2735 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002736 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002737 }
2738}
2739
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002740void __stdcall glGetFloatv(GLenum pname, GLfloat* params)
2741{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002742 EVENT("(GLenum pname = 0x%X, GLfloat* params = 0x%0.8p)", pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002743
2744 try
2745 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002746 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com32e58cd2010-03-24 09:44:10 +00002747
2748 if (context)
2749 {
daniel@transgaming.com777f2672010-04-07 03:25:16 +00002750 if (!(context->getFloatv(pname, params)))
daniel@transgaming.com32e58cd2010-03-24 09:44:10 +00002751 {
daniel@transgaming.com777f2672010-04-07 03:25:16 +00002752 GLenum nativeType;
2753 unsigned int numParams = 0;
2754 if (!context->getQueryParameterInfo(pname, &nativeType, &numParams))
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002755 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com777f2672010-04-07 03:25:16 +00002756
2757 if (numParams == 0)
2758 return; // it is known that the pname is valid, but that there are no parameters to return.
2759
2760 if (nativeType == GL_BOOL)
2761 {
2762 GLboolean *boolParams = NULL;
2763 boolParams = new GLboolean[numParams];
2764
2765 context->getBooleanv(pname, boolParams);
2766
2767 for (unsigned int i = 0; i < numParams; ++i)
2768 {
2769 if (boolParams[i] == GL_FALSE)
2770 params[i] = 0.0f;
2771 else
2772 params[i] = 1.0f;
2773 }
2774
2775 delete [] boolParams;
2776 }
2777 else if (nativeType == GL_INT)
2778 {
2779 GLint *intParams = NULL;
2780 intParams = new GLint[numParams];
2781
2782 context->getIntegerv(pname, intParams);
2783
2784 for (unsigned int i = 0; i < numParams; ++i)
2785 {
Jamie Madill71fbd602013-07-19 16:36:55 -04002786 params[i] = static_cast<GLfloat>(intParams[i]);
daniel@transgaming.com777f2672010-04-07 03:25:16 +00002787 }
2788
2789 delete [] intParams;
2790 }
Jamie Madill71fbd602013-07-19 16:36:55 -04002791 else if (nativeType == GL_INT_64_ANGLEX)
2792 {
2793 GLint64 *int64Params = NULL;
2794 int64Params = new GLint64[numParams];
2795
2796 context->getInteger64v(pname, int64Params);
2797
2798 for (unsigned int i = 0; i < numParams; ++i)
2799 {
2800 params[i] = static_cast<GLfloat>(int64Params[i]);
2801 }
2802
2803 delete [] int64Params;
2804 }
daniel@transgaming.com32e58cd2010-03-24 09:44:10 +00002805 }
2806 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002807 }
2808 catch(std::bad_alloc&)
2809 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002810 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002811 }
2812}
2813
2814void __stdcall glGetFramebufferAttachmentParameteriv(GLenum target, GLenum attachment, GLenum pname, GLint* params)
2815{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002816 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 +00002817 target, attachment, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002818
2819 try
2820 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002821 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002822
2823 if (context)
2824 {
Geoff Lang646559f2013-08-15 11:08:15 -04002825 META_ASSERT(GL_DRAW_FRAMEBUFFER_ANGLE == GL_DRAW_FRAMEBUFFER && GL_READ_FRAMEBUFFER_ANGLE == GL_READ_FRAMEBUFFER);
2826 if (target != GL_FRAMEBUFFER && target != GL_DRAW_FRAMEBUFFER && target != GL_READ_FRAMEBUFFER)
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002827 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002828 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002829 }
2830
Geoff Lang646559f2013-08-15 11:08:15 -04002831 switch (pname)
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002832 {
Geoff Lang646559f2013-08-15 11:08:15 -04002833 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE:
2834 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME:
2835 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL:
2836 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE:
2837 break;
2838 case GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE:
2839 case GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE:
2840 case GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE:
2841 case GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE:
2842 case GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE:
2843 case GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE:
2844 case GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE:
2845 case GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING:
2846 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER:
2847 if (context->getClientVersion() >= 3)
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 default:
2852 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002853 }
Geoff Lang646559f2013-08-15 11:08:15 -04002854
2855 // Determine if the attachment is a valid enum
2856 switch (attachment)
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002857 {
Geoff Lang646559f2013-08-15 11:08:15 -04002858 case GL_BACK:
2859 case GL_FRONT:
2860 case GL_STENCIL:
2861 case GL_DEPTH_STENCIL_ATTACHMENT:
2862 if (context->getClientVersion() < 3)
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002863 {
Geoff Lang646559f2013-08-15 11:08:15 -04002864 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002865 }
Geoff Lang646559f2013-08-15 11:08:15 -04002866 break;
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002867
Geoff Lang646559f2013-08-15 11:08:15 -04002868 case GL_DEPTH_ATTACHMENT:
2869 case GL_STENCIL_ATTACHMENT:
2870 break;
2871
2872 default:
2873 if (attachment < GL_COLOR_ATTACHMENT0_EXT ||
2874 (attachment - GL_COLOR_ATTACHMENT0_EXT) >= context->getMaximumRenderTargets())
2875 {
2876 return gl::error(GL_INVALID_ENUM);
2877 }
2878 break;
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002879 }
2880
Geoff Lang646559f2013-08-15 11:08:15 -04002881 GLuint framebufferHandle = (target == GL_READ_FRAMEBUFFER) ? context->getReadFramebufferHandle()
2882 : context->getDrawFramebufferHandle();
2883
2884 gl::Framebuffer *framebuffer = context->getFramebuffer(framebufferHandle);
2885
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002886 GLenum attachmentType;
2887 GLuint attachmentHandle;
Geoff Lang309c92a2013-07-25 16:23:19 -04002888 GLuint attachmentLevel;
2889 GLuint attachmentLayer;
Geoff Lang646559f2013-08-15 11:08:15 -04002890 gl::Renderbuffer *renderbuffer;
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002891
Geoff Lang646559f2013-08-15 11:08:15 -04002892 if(framebufferHandle == 0)
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002893 {
Geoff Lang646559f2013-08-15 11:08:15 -04002894 if(context->getClientVersion() < 3)
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002895 {
Geoff Lang646559f2013-08-15 11:08:15 -04002896 return gl::error(GL_INVALID_OPERATION);
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002897 }
2898
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002899 switch (attachment)
2900 {
Geoff Lang646559f2013-08-15 11:08:15 -04002901 case GL_BACK:
2902 attachmentType = framebuffer->getColorbufferType(0);
2903 attachmentHandle = framebuffer->getColorbufferHandle(0);
2904 attachmentLevel = framebuffer->getColorbufferMipLevel(0);
2905 attachmentLayer = framebuffer->getColorbufferLayer(0);
2906 renderbuffer = framebuffer->getColorbuffer(0);
2907 break;
2908 case GL_DEPTH:
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002909 attachmentType = framebuffer->getDepthbufferType();
2910 attachmentHandle = framebuffer->getDepthbufferHandle();
Geoff Lang309c92a2013-07-25 16:23:19 -04002911 attachmentLevel = framebuffer->getDepthbufferMipLevel();
2912 attachmentLayer = framebuffer->getDepthbufferLayer();
Geoff Lang646559f2013-08-15 11:08:15 -04002913 renderbuffer = framebuffer->getDepthbuffer();
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002914 break;
Geoff Lang646559f2013-08-15 11:08:15 -04002915 case GL_STENCIL:
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002916 attachmentType = framebuffer->getStencilbufferType();
2917 attachmentHandle = framebuffer->getStencilbufferHandle();
Geoff Lang309c92a2013-07-25 16:23:19 -04002918 attachmentLevel = framebuffer->getStencilbufferMipLevel();
2919 attachmentLayer = framebuffer->getStencilbufferLayer();
Geoff Lang646559f2013-08-15 11:08:15 -04002920 renderbuffer = framebuffer->getStencilbuffer();
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002921 break;
Geoff Lang646559f2013-08-15 11:08:15 -04002922 default:
2923 return gl::error(GL_INVALID_OPERATION);
2924 }
2925 }
2926 else
2927 {
2928 if (attachment >= GL_COLOR_ATTACHMENT0_EXT && attachment <= GL_COLOR_ATTACHMENT15_EXT)
2929 {
2930 const unsigned int colorAttachment = (attachment - GL_COLOR_ATTACHMENT0_EXT);
2931 attachmentType = framebuffer->getColorbufferType(colorAttachment);
2932 attachmentHandle = framebuffer->getColorbufferHandle(colorAttachment);
2933 attachmentLevel = framebuffer->getColorbufferMipLevel(colorAttachment);
2934 attachmentLayer = framebuffer->getColorbufferLayer(colorAttachment);
2935 renderbuffer = framebuffer->getColorbuffer(colorAttachment);
2936 }
2937 else
2938 {
2939 switch (attachment)
Geoff Lang55ba29c2013-07-11 16:57:53 -04002940 {
Geoff Lang646559f2013-08-15 11:08:15 -04002941 case GL_DEPTH_ATTACHMENT:
2942 attachmentType = framebuffer->getDepthbufferType();
2943 attachmentHandle = framebuffer->getDepthbufferHandle();
2944 attachmentLevel = framebuffer->getDepthbufferMipLevel();
2945 attachmentLayer = framebuffer->getDepthbufferLayer();
2946 renderbuffer = framebuffer->getDepthbuffer();
2947 break;
2948 case GL_STENCIL_ATTACHMENT:
2949 attachmentType = framebuffer->getStencilbufferType();
2950 attachmentHandle = framebuffer->getStencilbufferHandle();
2951 attachmentLevel = framebuffer->getStencilbufferMipLevel();
2952 attachmentLayer = framebuffer->getStencilbufferLayer();
2953 renderbuffer = framebuffer->getStencilbuffer();
2954 break;
2955 case GL_DEPTH_STENCIL_ATTACHMENT:
2956 if (framebuffer->getDepthbufferHandle() != framebuffer->getStencilbufferHandle())
2957 {
2958 return gl::error(GL_INVALID_OPERATION);
2959 }
2960 attachmentType = framebuffer->getDepthStencilbufferType();
2961 attachmentHandle = framebuffer->getDepthStencilbufferHandle();
2962 attachmentLevel = framebuffer->getDepthStencilbufferMipLevel();
2963 attachmentLayer = framebuffer->getDepthStencilbufferLayer();
2964 renderbuffer = framebuffer->getDepthStencilBuffer();
2965 break;
2966 default:
Geoff Lang55ba29c2013-07-11 16:57:53 -04002967 return gl::error(GL_INVALID_OPERATION);
2968 }
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002969 }
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002970 }
2971
2972 GLenum attachmentObjectType; // Type category
Geoff Lang646559f2013-08-15 11:08:15 -04002973 if (framebufferHandle == 0)
2974 {
2975 attachmentObjectType = GL_FRAMEBUFFER_DEFAULT;
2976 }
2977 else if (attachmentType == GL_NONE || attachmentType == GL_RENDERBUFFER)
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002978 {
2979 attachmentObjectType = attachmentType;
2980 }
Geoff Lang0fe19492013-07-25 17:04:31 -04002981 else if (gl::IsInternalTextureTarget(attachmentType, context->getClientVersion()))
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002982 {
2983 attachmentObjectType = GL_TEXTURE;
2984 }
apatrick@chromium.orga1d80592012-01-25 21:52:10 +00002985 else
2986 {
2987 UNREACHABLE();
2988 return;
2989 }
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002990
Geoff Lang646559f2013-08-15 11:08:15 -04002991 if (attachmentObjectType == GL_NONE)
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002992 {
Geoff Lang646559f2013-08-15 11:08:15 -04002993 // ES 2.0.25 spec pg 127 states that if the value of FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE
2994 // is NONE, then querying any other pname will generate INVALID_ENUM.
2995
2996 // ES 3.0.2 spec pg 235 states that if the attachment type is none,
2997 // GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME will return zero and be an
2998 // INVALID_OPERATION for all other pnames
2999
3000 switch (pname)
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003001 {
Geoff Lang646559f2013-08-15 11:08:15 -04003002 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE:
3003 *params = attachmentObjectType;
3004 break;
3005
3006 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME:
3007 if (context->getClientVersion() < 3)
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003008 {
Geoff Lang646559f2013-08-15 11:08:15 -04003009 return gl::error(GL_INVALID_ENUM);
3010 }
3011 *params = 0;
3012 break;
3013
3014 default:
3015 if (context->getClientVersion() < 3)
3016 {
3017 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003018 }
3019 else
3020 {
Geoff Lang646559f2013-08-15 11:08:15 -04003021 gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003022 }
3023 }
Geoff Lang646559f2013-08-15 11:08:15 -04003024 }
3025 else
3026 {
3027 ASSERT(attachmentObjectType == GL_RENDERBUFFER || attachmentObjectType == GL_TEXTURE ||
3028 attachmentObjectType == GL_FRAMEBUFFER_DEFAULT);
3029 ASSERT(renderbuffer != NULL);
3030
3031 switch (pname)
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003032 {
Geoff Lang646559f2013-08-15 11:08:15 -04003033 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE:
3034 *params = attachmentObjectType;
3035 break;
3036
3037 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME:
3038 if (attachmentObjectType != GL_RENDERBUFFER && attachmentObjectType != GL_TEXTURE)
3039 {
3040 return gl::error(GL_INVALID_ENUM);
3041 }
3042 *params = attachmentHandle;
3043 break;
3044
3045 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL:
3046 if (attachmentObjectType != GL_TEXTURE)
3047 {
3048 return gl::error(GL_INVALID_ENUM);
3049 }
3050 *params = attachmentLevel;
3051 break;
3052
3053 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE:
3054 if (attachmentObjectType != GL_TEXTURE)
3055 {
3056 return gl::error(GL_INVALID_ENUM);
3057 }
3058 *params = gl::IsCubemapTextureTarget(attachmentType) ? attachmentType : 0;
3059 break;
3060
3061 case GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE:
3062 *params = renderbuffer->getRedSize();
3063 break;
3064
3065 case GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE:
3066 *params = renderbuffer->getGreenSize();
3067 break;
3068
3069 case GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE:
3070 *params = renderbuffer->getBlueSize();
3071 break;
3072
3073 case GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE:
3074 *params = renderbuffer->getAlphaSize();
3075 break;
3076
3077 case GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE:
3078 *params = renderbuffer->getDepthSize();
3079 break;
3080
3081 case GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE:
3082 *params = renderbuffer->getStencilSize();
3083 break;
3084
3085 case GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE:
3086 if (attachment == GL_DEPTH_STENCIL)
3087 {
3088 gl::error(GL_INVALID_OPERATION);
3089 }
3090 *params = renderbuffer->getComponentType();
3091 break;
3092
3093 case GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING:
3094 *params = renderbuffer->getColorEncoding();
3095 break;
3096
3097 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER:
3098 if (attachmentObjectType != GL_TEXTURE)
3099 {
3100 return gl::error(GL_INVALID_ENUM);
3101 }
3102 *params = attachmentLayer;
3103 break;
3104
3105 default:
3106 UNREACHABLE();
3107 break;
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003108 }
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003109 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003110 }
3111 }
3112 catch(std::bad_alloc&)
3113 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003114 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003115 }
3116}
3117
daniel@transgaming.com17f548c2011-11-09 17:47:02 +00003118GLenum __stdcall glGetGraphicsResetStatusEXT(void)
3119{
3120 EVENT("()");
3121
3122 try
3123 {
3124 gl::Context *context = gl::getContext();
3125
3126 if (context)
3127 {
3128 return context->getResetStatus();
3129 }
3130
3131 return GL_NO_ERROR;
3132 }
3133 catch(std::bad_alloc&)
3134 {
3135 return GL_OUT_OF_MEMORY;
3136 }
3137}
3138
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003139void __stdcall glGetIntegerv(GLenum pname, GLint* params)
3140{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003141 EVENT("(GLenum pname = 0x%X, GLint* params = 0x%0.8p)", pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003142
3143 try
3144 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003145 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003146
3147 if (context)
3148 {
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003149 if (!(context->getIntegerv(pname, params)))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003150 {
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003151 GLenum nativeType;
3152 unsigned int numParams = 0;
3153 if (!context->getQueryParameterInfo(pname, &nativeType, &numParams))
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003154 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003155
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003156 if (numParams == 0)
3157 return; // it is known that pname is valid, but there are no parameters to return
3158
3159 if (nativeType == GL_BOOL)
3160 {
3161 GLboolean *boolParams = NULL;
3162 boolParams = new GLboolean[numParams];
3163
3164 context->getBooleanv(pname, boolParams);
3165
3166 for (unsigned int i = 0; i < numParams; ++i)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003167 {
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003168 if (boolParams[i] == GL_FALSE)
3169 params[i] = 0;
3170 else
3171 params[i] = 1;
3172 }
3173
3174 delete [] boolParams;
3175 }
3176 else if (nativeType == GL_FLOAT)
3177 {
3178 GLfloat *floatParams = NULL;
3179 floatParams = new GLfloat[numParams];
3180
3181 context->getFloatv(pname, floatParams);
3182
3183 for (unsigned int i = 0; i < numParams; ++i)
3184 {
Jamie Madill71fbd602013-07-19 16:36:55 -04003185 // 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 +00003186 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 +00003187 {
Jamie Madill71fbd602013-07-19 16:36:55 -04003188 params[i] = static_cast<GLint>((static_cast<GLfloat>(0xFFFFFFFF) * floatParams[i] - 1.0f) / 2.0f);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003189 }
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003190 else
Jamie Madill71fbd602013-07-19 16:36:55 -04003191 {
Jamie Madillaf496912013-07-19 16:36:54 -04003192 params[i] = gl::iround<GLint>(floatParams[i]);
Jamie Madill71fbd602013-07-19 16:36:55 -04003193 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003194 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003195
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003196 delete [] floatParams;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003197 }
Jamie Madill71fbd602013-07-19 16:36:55 -04003198 else if (nativeType == GL_INT_64_ANGLEX)
3199 {
3200 GLint64 minIntValue = static_cast<GLint64>(std::numeric_limits<int>::min());
3201 GLint64 maxIntValue = static_cast<GLint64>(std::numeric_limits<int>::max());
3202 GLint64 *int64Params = NULL;
3203 int64Params = new GLint64[numParams];
3204
3205 context->getInteger64v(pname, int64Params);
3206
3207 for (unsigned int i = 0; i < numParams; ++i)
3208 {
3209 GLint64 clampedValue = std::max(std::min(int64Params[i], maxIntValue), minIntValue);
3210 params[i] = static_cast<GLint>(clampedValue);
3211 }
3212
3213 delete [] int64Params;
3214 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003215 }
3216 }
3217 }
3218 catch(std::bad_alloc&)
3219 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003220 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003221 }
3222}
3223
3224void __stdcall glGetProgramiv(GLuint program, GLenum pname, GLint* params)
3225{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003226 EVENT("(GLuint program = %d, GLenum pname = %d, GLint* params = 0x%0.8p)", program, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003227
3228 try
3229 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003230 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003231
3232 if (context)
3233 {
3234 gl::Program *programObject = context->getProgram(program);
3235
3236 if (!programObject)
3237 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003238 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003239 }
3240
shannonwoods@chromium.orge684b582013-05-30 00:07:42 +00003241 if (context->getClientVersion() < 3)
3242 {
3243 switch (pname)
3244 {
3245 case GL_ACTIVE_UNIFORM_BLOCKS:
3246 case GL_ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH:
3247 return gl::error(GL_INVALID_ENUM);
3248 }
3249 }
3250
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003251 switch (pname)
3252 {
3253 case GL_DELETE_STATUS:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003254 *params = programObject->isFlaggedForDeletion();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003255 return;
3256 case GL_LINK_STATUS:
daniel@transgaming.com716056c2012-07-24 18:38:59 +00003257 *params = programObject->isLinked();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003258 return;
3259 case GL_VALIDATE_STATUS:
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00003260 *params = programObject->isValidated();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003261 return;
3262 case GL_INFO_LOG_LENGTH:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003263 *params = programObject->getInfoLogLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003264 return;
3265 case GL_ATTACHED_SHADERS:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003266 *params = programObject->getAttachedShadersCount();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003267 return;
3268 case GL_ACTIVE_ATTRIBUTES:
daniel@transgaming.com85423182010-04-22 13:35:27 +00003269 *params = programObject->getActiveAttributeCount();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003270 return;
3271 case GL_ACTIVE_ATTRIBUTE_MAX_LENGTH:
daniel@transgaming.com85423182010-04-22 13:35:27 +00003272 *params = programObject->getActiveAttributeMaxLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003273 return;
3274 case GL_ACTIVE_UNIFORMS:
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00003275 *params = programObject->getActiveUniformCount();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003276 return;
3277 case GL_ACTIVE_UNIFORM_MAX_LENGTH:
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00003278 *params = programObject->getActiveUniformMaxLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003279 return;
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00003280 case GL_PROGRAM_BINARY_LENGTH_OES:
apatrick@chromium.org90080e32012-07-09 22:15:33 +00003281 *params = programObject->getProgramBinaryLength();
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00003282 return;
shannonwoods@chromium.orge684b582013-05-30 00:07:42 +00003283 case GL_ACTIVE_UNIFORM_BLOCKS:
3284 *params = programObject->getActiveUniformBlockCount();
3285 return;
3286 case GL_ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH:
3287 *params = programObject->getActiveUniformBlockMaxLength();
3288 break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003289 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003290 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003291 }
3292 }
3293 }
3294 catch(std::bad_alloc&)
3295 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003296 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003297 }
3298}
3299
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00003300void __stdcall glGetProgramInfoLog(GLuint program, GLsizei bufsize, GLsizei* length, GLchar* infolog)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003301{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003302 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 +00003303 program, bufsize, length, infolog);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003304
3305 try
3306 {
3307 if (bufsize < 0)
3308 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003309 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003310 }
3311
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003312 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003313
3314 if (context)
3315 {
3316 gl::Program *programObject = context->getProgram(program);
3317
3318 if (!programObject)
3319 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003320 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003321 }
3322
3323 programObject->getInfoLog(bufsize, length, infolog);
3324 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003325 }
3326 catch(std::bad_alloc&)
3327 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003328 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003329 }
3330}
3331
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003332void __stdcall glGetQueryivEXT(GLenum target, GLenum pname, GLint *params)
3333{
3334 EVENT("GLenum target = 0x%X, GLenum pname = 0x%X, GLint *params = 0x%0.8p)", target, pname, params);
3335
3336 try
3337 {
3338 switch (pname)
3339 {
3340 case GL_CURRENT_QUERY_EXT:
3341 break;
3342 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003343 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003344 }
3345
3346 gl::Context *context = gl::getNonLostContext();
3347
3348 if (context)
3349 {
3350 params[0] = context->getActiveQuery(target);
3351 }
3352 }
3353 catch(std::bad_alloc&)
3354 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003355 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003356 }
3357}
3358
3359void __stdcall glGetQueryObjectuivEXT(GLuint id, GLenum pname, GLuint *params)
3360{
3361 EVENT("(GLuint id = %d, GLenum pname = 0x%X, GLuint *params = 0x%0.8p)", id, pname, params);
3362
3363 try
3364 {
3365 switch (pname)
3366 {
3367 case GL_QUERY_RESULT_EXT:
3368 case GL_QUERY_RESULT_AVAILABLE_EXT:
3369 break;
3370 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003371 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003372 }
3373 gl::Context *context = gl::getNonLostContext();
3374
3375 if (context)
3376 {
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003377 gl::Query *queryObject = context->getQuery(id, false, GL_NONE);
3378
3379 if (!queryObject)
3380 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003381 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003382 }
3383
3384 if (context->getActiveQuery(queryObject->getType()) == id)
3385 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003386 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003387 }
3388
3389 switch(pname)
3390 {
3391 case GL_QUERY_RESULT_EXT:
3392 params[0] = queryObject->getResult();
3393 break;
3394 case GL_QUERY_RESULT_AVAILABLE_EXT:
3395 params[0] = queryObject->isResultAvailable();
3396 break;
3397 default:
3398 ASSERT(false);
3399 }
3400 }
3401 }
3402 catch(std::bad_alloc&)
3403 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003404 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003405 }
3406}
3407
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003408void __stdcall glGetRenderbufferParameteriv(GLenum target, GLenum pname, GLint* params)
3409{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003410 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 +00003411
3412 try
3413 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003414 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003415
3416 if (context)
3417 {
3418 if (target != GL_RENDERBUFFER)
3419 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003420 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003421 }
3422
daniel@transgaming.com428d1582010-05-04 03:35:25 +00003423 if (context->getRenderbufferHandle() == 0)
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003424 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003425 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003426 }
3427
daniel@transgaming.com428d1582010-05-04 03:35:25 +00003428 gl::Renderbuffer *renderbuffer = context->getRenderbuffer(context->getRenderbufferHandle());
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003429
3430 switch (pname)
3431 {
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +00003432 case GL_RENDERBUFFER_WIDTH: *params = renderbuffer->getWidth(); break;
3433 case GL_RENDERBUFFER_HEIGHT: *params = renderbuffer->getHeight(); break;
3434 case GL_RENDERBUFFER_INTERNAL_FORMAT: *params = renderbuffer->getInternalFormat(); break;
3435 case GL_RENDERBUFFER_RED_SIZE: *params = renderbuffer->getRedSize(); break;
3436 case GL_RENDERBUFFER_GREEN_SIZE: *params = renderbuffer->getGreenSize(); break;
3437 case GL_RENDERBUFFER_BLUE_SIZE: *params = renderbuffer->getBlueSize(); break;
3438 case GL_RENDERBUFFER_ALPHA_SIZE: *params = renderbuffer->getAlphaSize(); break;
3439 case GL_RENDERBUFFER_DEPTH_SIZE: *params = renderbuffer->getDepthSize(); break;
3440 case GL_RENDERBUFFER_STENCIL_SIZE: *params = renderbuffer->getStencilSize(); break;
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00003441 case GL_RENDERBUFFER_SAMPLES_ANGLE:
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +00003442 if (context->getMaxSupportedSamples() != 0)
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00003443 {
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +00003444 *params = renderbuffer->getSamples();
3445 }
3446 else
3447 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003448 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00003449 }
3450 break;
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003451 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003452 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003453 }
3454 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003455 }
3456 catch(std::bad_alloc&)
3457 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003458 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003459 }
3460}
3461
3462void __stdcall glGetShaderiv(GLuint shader, GLenum pname, GLint* params)
3463{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003464 EVENT("(GLuint shader = %d, GLenum pname = %d, GLint* params = 0x%0.8p)", shader, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003465
3466 try
3467 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003468 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003469
3470 if (context)
3471 {
3472 gl::Shader *shaderObject = context->getShader(shader);
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00003473
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003474 if (!shaderObject)
3475 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003476 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003477 }
3478
3479 switch (pname)
3480 {
3481 case GL_SHADER_TYPE:
3482 *params = shaderObject->getType();
3483 return;
3484 case GL_DELETE_STATUS:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003485 *params = shaderObject->isFlaggedForDeletion();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003486 return;
3487 case GL_COMPILE_STATUS:
3488 *params = shaderObject->isCompiled() ? GL_TRUE : GL_FALSE;
3489 return;
3490 case GL_INFO_LOG_LENGTH:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003491 *params = shaderObject->getInfoLogLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003492 return;
3493 case GL_SHADER_SOURCE_LENGTH:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003494 *params = shaderObject->getSourceLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003495 return;
zmo@google.coma574f782011-10-03 21:45:23 +00003496 case GL_TRANSLATED_SHADER_SOURCE_LENGTH_ANGLE:
3497 *params = shaderObject->getTranslatedSourceLength();
3498 return;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003499 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003500 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003501 }
3502 }
3503 }
3504 catch(std::bad_alloc&)
3505 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003506 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003507 }
3508}
3509
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00003510void __stdcall glGetShaderInfoLog(GLuint shader, GLsizei bufsize, GLsizei* length, GLchar* infolog)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003511{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003512 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 +00003513 shader, bufsize, length, infolog);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003514
3515 try
3516 {
3517 if (bufsize < 0)
3518 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003519 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003520 }
3521
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003522 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003523
3524 if (context)
3525 {
3526 gl::Shader *shaderObject = context->getShader(shader);
3527
3528 if (!shaderObject)
3529 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003530 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003531 }
3532
3533 shaderObject->getInfoLog(bufsize, length, infolog);
3534 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003535 }
3536 catch(std::bad_alloc&)
3537 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003538 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003539 }
3540}
3541
3542void __stdcall glGetShaderPrecisionFormat(GLenum shadertype, GLenum precisiontype, GLint* range, GLint* precision)
3543{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003544 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 +00003545 shadertype, precisiontype, range, precision);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003546
3547 try
3548 {
daniel@transgaming.com6c785212010-03-30 03:36:17 +00003549 switch (shadertype)
3550 {
3551 case GL_VERTEX_SHADER:
3552 case GL_FRAGMENT_SHADER:
3553 break;
3554 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003555 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com6c785212010-03-30 03:36:17 +00003556 }
3557
3558 switch (precisiontype)
3559 {
3560 case GL_LOW_FLOAT:
3561 case GL_MEDIUM_FLOAT:
3562 case GL_HIGH_FLOAT:
3563 // Assume IEEE 754 precision
3564 range[0] = 127;
3565 range[1] = 127;
daniel@transgaming.comc5c15382010-04-23 18:34:49 +00003566 *precision = 23;
daniel@transgaming.com6c785212010-03-30 03:36:17 +00003567 break;
3568 case GL_LOW_INT:
3569 case GL_MEDIUM_INT:
3570 case GL_HIGH_INT:
3571 // Some (most) hardware only supports single-precision floating-point numbers,
3572 // which can accurately represent integers up to +/-16777216
3573 range[0] = 24;
3574 range[1] = 24;
daniel@transgaming.comc5c15382010-04-23 18:34:49 +00003575 *precision = 0;
daniel@transgaming.com6c785212010-03-30 03:36:17 +00003576 break;
3577 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003578 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com6c785212010-03-30 03:36:17 +00003579 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003580 }
3581 catch(std::bad_alloc&)
3582 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003583 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003584 }
3585}
3586
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00003587void __stdcall glGetShaderSource(GLuint shader, GLsizei bufsize, GLsizei* length, GLchar* source)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003588{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003589 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 +00003590 shader, bufsize, length, source);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003591
3592 try
3593 {
3594 if (bufsize < 0)
3595 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003596 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003597 }
3598
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003599 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003600
3601 if (context)
3602 {
3603 gl::Shader *shaderObject = context->getShader(shader);
3604
3605 if (!shaderObject)
3606 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003607 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003608 }
3609
3610 shaderObject->getSource(bufsize, length, source);
3611 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003612 }
3613 catch(std::bad_alloc&)
3614 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003615 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003616 }
3617}
3618
zmo@google.coma574f782011-10-03 21:45:23 +00003619void __stdcall glGetTranslatedShaderSourceANGLE(GLuint shader, GLsizei bufsize, GLsizei* length, GLchar* source)
3620{
3621 EVENT("(GLuint shader = %d, GLsizei bufsize = %d, GLsizei* length = 0x%0.8p, GLchar* source = 0x%0.8p)",
3622 shader, bufsize, length, source);
3623
3624 try
3625 {
3626 if (bufsize < 0)
3627 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003628 return gl::error(GL_INVALID_VALUE);
zmo@google.coma574f782011-10-03 21:45:23 +00003629 }
3630
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003631 gl::Context *context = gl::getNonLostContext();
zmo@google.coma574f782011-10-03 21:45:23 +00003632
3633 if (context)
3634 {
3635 gl::Shader *shaderObject = context->getShader(shader);
3636
3637 if (!shaderObject)
3638 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003639 return gl::error(GL_INVALID_OPERATION);
zmo@google.coma574f782011-10-03 21:45:23 +00003640 }
3641
3642 shaderObject->getTranslatedSource(bufsize, length, source);
3643 }
3644 }
3645 catch(std::bad_alloc&)
3646 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003647 return gl::error(GL_OUT_OF_MEMORY);
zmo@google.coma574f782011-10-03 21:45:23 +00003648 }
3649}
3650
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003651const GLubyte* __stdcall glGetString(GLenum name)
3652{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003653 EVENT("(GLenum name = 0x%X)", name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003654
3655 try
3656 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003657 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com3e4c6002010-05-05 18:50:13 +00003658
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003659 switch (name)
3660 {
3661 case GL_VENDOR:
daniel@transgaming.coma0ce7e62011-01-25 14:47:16 +00003662 return (GLubyte*)"Google Inc.";
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003663 case GL_RENDERER:
daniel@transgaming.comc23ff642011-08-16 20:28:45 +00003664 return (GLubyte*)((context != NULL) ? context->getRendererString() : "ANGLE");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003665 case GL_VERSION:
shannonwoods@chromium.orge2865d02013-05-30 00:06:01 +00003666 if (context->getClientVersion() == 2)
3667 {
3668 return (GLubyte*)"OpenGL ES 2.0 (ANGLE " VERSION_STRING ")";
3669 }
3670 else
3671 {
3672 return (GLubyte*)"OpenGL ES 3.0 (ANGLE " VERSION_STRING ")";
3673 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003674 case GL_SHADING_LANGUAGE_VERSION:
shannonwoods@chromium.orge2865d02013-05-30 00:06:01 +00003675 if (context->getClientVersion() == 2)
3676 {
3677 return (GLubyte*)"OpenGL ES GLSL ES 1.00 (ANGLE " VERSION_STRING ")";
3678 }
3679 else
3680 {
3681 return (GLubyte*)"OpenGL ES GLSL ES 3.00 (ANGLE " VERSION_STRING ")";
3682 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003683 case GL_EXTENSIONS:
shannonwoods@chromium.org302df742013-05-30 00:05:54 +00003684 return (GLubyte*)((context != NULL) ? context->getCombinedExtensionsString() : "");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003685 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003686 return gl::error(GL_INVALID_ENUM, (GLubyte*)NULL);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003687 }
3688 }
3689 catch(std::bad_alloc&)
3690 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003691 return gl::error(GL_OUT_OF_MEMORY, (GLubyte*)NULL);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003692 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003693}
3694
3695void __stdcall glGetTexParameterfv(GLenum target, GLenum pname, GLfloat* params)
3696{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003697 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 +00003698
3699 try
3700 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003701 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003702
3703 if (context)
3704 {
Jamie Madill35d15012013-10-07 10:46:37 -04003705 gl::Texture *texture = GetTargetTexture(context, target);
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003706
Jamie Madillfb8a8302013-07-03 14:24:12 -04003707 if (!texture)
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003708 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003709 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003710 }
3711
3712 switch (pname)
3713 {
3714 case GL_TEXTURE_MAG_FILTER:
3715 *params = (GLfloat)texture->getMagFilter();
3716 break;
3717 case GL_TEXTURE_MIN_FILTER:
3718 *params = (GLfloat)texture->getMinFilter();
3719 break;
3720 case GL_TEXTURE_WRAP_S:
3721 *params = (GLfloat)texture->getWrapS();
3722 break;
3723 case GL_TEXTURE_WRAP_T:
3724 *params = (GLfloat)texture->getWrapT();
3725 break;
shannon.woods%transgaming.com@gtempaccount.com0b3a8df2013-04-13 03:44:51 +00003726 case GL_TEXTURE_WRAP_R:
3727 if (context->getClientVersion() < 3)
3728 {
3729 return gl::error(GL_INVALID_ENUM);
3730 }
3731 *params = (GLfloat)texture->getWrapR();
3732 break;
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00003733 case GL_TEXTURE_IMMUTABLE_FORMAT:
3734 // Exposed to ES2.0 through EXT_texture_storage, no client version validation.
daniel@transgaming.comd30bd0a2011-11-11 04:10:34 +00003735 *params = (GLfloat)(texture->isImmutable() ? GL_TRUE : GL_FALSE);
3736 break;
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00003737 case GL_TEXTURE_IMMUTABLE_LEVELS:
3738 if (context->getClientVersion() < 3)
3739 {
3740 return gl::error(GL_INVALID_ENUM);
3741 }
3742 *params = (GLfloat)(texture->isImmutable() ? texture->levelCount() : 0);
3743 break;
daniel@transgaming.com7d18c172011-11-11 04:18:21 +00003744 case GL_TEXTURE_USAGE_ANGLE:
3745 *params = (GLfloat)texture->getUsage();
3746 break;
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00003747 case GL_TEXTURE_MAX_ANISOTROPY_EXT:
3748 if (!context->supportsTextureFilterAnisotropy())
3749 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003750 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00003751 }
3752 *params = (GLfloat)texture->getMaxAnisotropy();
3753 break;
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003754 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003755 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003756 }
3757 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003758 }
3759 catch(std::bad_alloc&)
3760 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003761 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003762 }
3763}
3764
3765void __stdcall glGetTexParameteriv(GLenum target, GLenum pname, GLint* params)
3766{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003767 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 +00003768
3769 try
3770 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003771 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003772
3773 if (context)
3774 {
Jamie Madill35d15012013-10-07 10:46:37 -04003775 gl::Texture *texture = GetTargetTexture(context, target);
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003776
Jamie Madillfb8a8302013-07-03 14:24:12 -04003777 if (!texture)
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003778 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003779 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003780 }
3781
3782 switch (pname)
3783 {
3784 case GL_TEXTURE_MAG_FILTER:
3785 *params = texture->getMagFilter();
3786 break;
3787 case GL_TEXTURE_MIN_FILTER:
3788 *params = texture->getMinFilter();
3789 break;
3790 case GL_TEXTURE_WRAP_S:
3791 *params = texture->getWrapS();
3792 break;
3793 case GL_TEXTURE_WRAP_T:
3794 *params = texture->getWrapT();
3795 break;
shannon.woods%transgaming.com@gtempaccount.com0b3a8df2013-04-13 03:44:51 +00003796 case GL_TEXTURE_WRAP_R:
3797 if (context->getClientVersion() < 3)
3798 {
3799 return gl::error(GL_INVALID_ENUM);
3800 }
3801 *params = texture->getWrapR();
3802 break;
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00003803 case GL_TEXTURE_IMMUTABLE_FORMAT:
3804 // Exposed to ES2.0 through EXT_texture_storage, no client version validation.
daniel@transgaming.comd30bd0a2011-11-11 04:10:34 +00003805 *params = texture->isImmutable() ? GL_TRUE : GL_FALSE;
3806 break;
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00003807 case GL_TEXTURE_IMMUTABLE_LEVELS:
3808 if (context->getClientVersion() < 3)
3809 {
3810 return gl::error(GL_INVALID_ENUM);
3811 }
3812 *params = texture->isImmutable() ? texture->levelCount() : 0;
3813 break;
daniel@transgaming.com7d18c172011-11-11 04:18:21 +00003814 case GL_TEXTURE_USAGE_ANGLE:
3815 *params = texture->getUsage();
3816 break;
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00003817 case GL_TEXTURE_MAX_ANISOTROPY_EXT:
3818 if (!context->supportsTextureFilterAnisotropy())
3819 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003820 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00003821 }
3822 *params = (GLint)texture->getMaxAnisotropy();
3823 break;
shannonwoods@chromium.orgabf14cc2013-05-30 00:20:58 +00003824
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003825 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003826 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003827 }
3828 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003829 }
3830 catch(std::bad_alloc&)
3831 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003832 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003833 }
3834}
3835
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003836void __stdcall glGetnUniformfvEXT(GLuint program, GLint location, GLsizei bufSize, GLfloat* params)
3837{
3838 EVENT("(GLuint program = %d, GLint location = %d, GLsizei bufSize = %d, GLfloat* params = 0x%0.8p)",
3839 program, location, bufSize, params);
3840
3841 try
3842 {
3843 if (bufSize < 0)
3844 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003845 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003846 }
3847
3848 gl::Context *context = gl::getNonLostContext();
3849
3850 if (context)
3851 {
3852 if (program == 0)
3853 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003854 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003855 }
3856
3857 gl::Program *programObject = context->getProgram(program);
3858
daniel@transgaming.com716056c2012-07-24 18:38:59 +00003859 if (!programObject || !programObject->isLinked())
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003860 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003861 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003862 }
3863
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003864 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
3865 if (!programBinary)
3866 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003867 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003868 }
3869
3870 if (!programBinary->getUniformfv(location, &bufSize, params))
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003871 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003872 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003873 }
3874 }
3875 }
3876 catch(std::bad_alloc&)
3877 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003878 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003879 }
3880}
3881
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003882void __stdcall glGetUniformfv(GLuint program, GLint location, GLfloat* params)
3883{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003884 EVENT("(GLuint program = %d, GLint location = %d, GLfloat* params = 0x%0.8p)", program, location, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003885
3886 try
3887 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003888 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003889
3890 if (context)
3891 {
3892 if (program == 0)
3893 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003894 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003895 }
3896
3897 gl::Program *programObject = context->getProgram(program);
3898
daniel@transgaming.com716056c2012-07-24 18:38:59 +00003899 if (!programObject || !programObject->isLinked())
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003900 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003901 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003902 }
3903
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003904 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
3905 if (!programBinary)
3906 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003907 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003908 }
3909
3910 if (!programBinary->getUniformfv(location, NULL, params))
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003911 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003912 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003913 }
3914 }
3915 }
3916 catch(std::bad_alloc&)
3917 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003918 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003919 }
3920}
3921
3922void __stdcall glGetnUniformivEXT(GLuint program, GLint location, GLsizei bufSize, GLint* params)
3923{
3924 EVENT("(GLuint program = %d, GLint location = %d, GLsizei bufSize = %d, GLint* params = 0x%0.8p)",
3925 program, location, bufSize, params);
3926
3927 try
3928 {
3929 if (bufSize < 0)
3930 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003931 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003932 }
3933
3934 gl::Context *context = gl::getNonLostContext();
3935
3936 if (context)
3937 {
3938 if (program == 0)
3939 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003940 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003941 }
3942
3943 gl::Program *programObject = context->getProgram(program);
3944
daniel@transgaming.com716056c2012-07-24 18:38:59 +00003945 if (!programObject || !programObject->isLinked())
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003946 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003947 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003948 }
3949
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003950 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
3951 if (!programBinary)
3952 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003953 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003954 }
3955
3956 if (!programBinary->getUniformiv(location, &bufSize, params))
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003957 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003958 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003959 }
3960 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003961 }
3962 catch(std::bad_alloc&)
3963 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003964 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003965 }
3966}
3967
3968void __stdcall glGetUniformiv(GLuint program, GLint location, GLint* params)
3969{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003970 EVENT("(GLuint program = %d, GLint location = %d, GLint* params = 0x%0.8p)", program, location, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003971
3972 try
3973 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003974 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003975
3976 if (context)
3977 {
3978 if (program == 0)
3979 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003980 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003981 }
3982
3983 gl::Program *programObject = context->getProgram(program);
3984
daniel@transgaming.com716056c2012-07-24 18:38:59 +00003985 if (!programObject || !programObject->isLinked())
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003986 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003987 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003988 }
3989
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003990 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
3991 if (!programBinary)
3992 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003993 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003994 }
3995
3996 if (!programBinary->getUniformiv(location, NULL, params))
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003997 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003998 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003999 }
4000 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004001 }
4002 catch(std::bad_alloc&)
4003 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004004 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004005 }
4006}
4007
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00004008int __stdcall glGetUniformLocation(GLuint program, const GLchar* name)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004009{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004010 EVENT("(GLuint program = %d, const GLchar* name = 0x%0.8p)", program, name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004011
4012 try
4013 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004014 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004015
4016 if (strstr(name, "gl_") == name)
4017 {
4018 return -1;
4019 }
4020
4021 if (context)
4022 {
4023 gl::Program *programObject = context->getProgram(program);
4024
4025 if (!programObject)
4026 {
daniel@transgaming.comd1abe5b2010-04-13 19:53:33 +00004027 if (context->getShader(program))
4028 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004029 return gl::error(GL_INVALID_OPERATION, -1);
daniel@transgaming.comd1abe5b2010-04-13 19:53:33 +00004030 }
4031 else
4032 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004033 return gl::error(GL_INVALID_VALUE, -1);
daniel@transgaming.comd1abe5b2010-04-13 19:53:33 +00004034 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004035 }
4036
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00004037 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
daniel@transgaming.com716056c2012-07-24 18:38:59 +00004038 if (!programObject->isLinked() || !programBinary)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004039 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004040 return gl::error(GL_INVALID_OPERATION, -1);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004041 }
4042
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00004043 return programBinary->getUniformLocation(name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004044 }
4045 }
4046 catch(std::bad_alloc&)
4047 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004048 return gl::error(GL_OUT_OF_MEMORY, -1);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004049 }
4050
4051 return -1;
4052}
4053
4054void __stdcall glGetVertexAttribfv(GLuint index, GLenum pname, GLfloat* params)
4055{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004056 EVENT("(GLuint index = %d, GLenum pname = 0x%X, GLfloat* params = 0x%0.8p)", index, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004057
4058 try
4059 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004060 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004061
daniel@transgaming.come0078962010-04-15 20:45:08 +00004062 if (context)
4063 {
4064 if (index >= gl::MAX_VERTEX_ATTRIBS)
4065 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004066 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004067 }
4068
daniel@transgaming.com83921382011-01-08 05:46:00 +00004069 const gl::VertexAttribute &attribState = context->getVertexAttribState(index);
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004070
Geoff Lang34dbb6f2013-08-05 15:05:47 -04004071 if (!gl::ValidateGetVertexAttribParameters(pname, context->getClientVersion()))
daniel@transgaming.come0078962010-04-15 20:45:08 +00004072 {
Jamie Madillaff71502013-07-02 11:57:05 -04004073 return;
4074 }
4075
4076 if (pname == GL_CURRENT_VERTEX_ATTRIB)
4077 {
4078 const gl::VertexAttribCurrentValueData &currentValueData = context->getVertexAttribCurrentValue(index);
4079 for (int i = 0; i < 4; ++i)
daniel@transgaming.come0078962010-04-15 20:45:08 +00004080 {
Jamie Madillaff71502013-07-02 11:57:05 -04004081 params[i] = currentValueData.FloatValues[i];
daniel@transgaming.come0078962010-04-15 20:45:08 +00004082 }
Jamie Madillaff71502013-07-02 11:57:05 -04004083 }
4084 else
4085 {
4086 *params = attribState.querySingleParameter<GLfloat>(pname);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004087 }
4088 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004089 }
4090 catch(std::bad_alloc&)
4091 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004092 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004093 }
4094}
4095
4096void __stdcall glGetVertexAttribiv(GLuint index, GLenum pname, GLint* params)
4097{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004098 EVENT("(GLuint index = %d, GLenum pname = 0x%X, GLint* params = 0x%0.8p)", index, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004099
4100 try
4101 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004102 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004103
daniel@transgaming.come0078962010-04-15 20:45:08 +00004104 if (context)
4105 {
4106 if (index >= gl::MAX_VERTEX_ATTRIBS)
4107 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004108 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004109 }
4110
daniel@transgaming.com83921382011-01-08 05:46:00 +00004111 const gl::VertexAttribute &attribState = context->getVertexAttribState(index);
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004112
Geoff Lang34dbb6f2013-08-05 15:05:47 -04004113 if (!gl::ValidateGetVertexAttribParameters(pname, context->getClientVersion()))
daniel@transgaming.come0078962010-04-15 20:45:08 +00004114 {
Jamie Madillaff71502013-07-02 11:57:05 -04004115 return;
4116 }
4117
4118 if (pname == GL_CURRENT_VERTEX_ATTRIB)
4119 {
4120 const gl::VertexAttribCurrentValueData &currentValueData = context->getVertexAttribCurrentValue(index);
4121 for (int i = 0; i < 4; ++i)
daniel@transgaming.come0078962010-04-15 20:45:08 +00004122 {
Jamie Madillaff71502013-07-02 11:57:05 -04004123 float currentValue = currentValueData.FloatValues[i];
Jamie Madillaf496912013-07-19 16:36:54 -04004124 params[i] = gl::iround<GLint>(currentValue);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004125 }
Jamie Madillaff71502013-07-02 11:57:05 -04004126 }
4127 else
4128 {
4129 *params = attribState.querySingleParameter<GLint>(pname);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004130 }
4131 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004132 }
4133 catch(std::bad_alloc&)
4134 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004135 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004136 }
4137}
4138
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00004139void __stdcall glGetVertexAttribPointerv(GLuint index, GLenum pname, GLvoid** pointer)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004140{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004141 EVENT("(GLuint index = %d, GLenum pname = 0x%X, GLvoid** pointer = 0x%0.8p)", index, pname, pointer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004142
4143 try
4144 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004145 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004146
daniel@transgaming.come0078962010-04-15 20:45:08 +00004147 if (context)
4148 {
4149 if (index >= gl::MAX_VERTEX_ATTRIBS)
4150 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004151 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004152 }
4153
4154 if (pname != GL_VERTEX_ATTRIB_ARRAY_POINTER)
4155 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004156 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004157 }
4158
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004159 *pointer = const_cast<GLvoid*>(context->getVertexAttribPointer(index));
daniel@transgaming.come0078962010-04-15 20:45:08 +00004160 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004161 }
4162 catch(std::bad_alloc&)
4163 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004164 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004165 }
4166}
4167
4168void __stdcall glHint(GLenum target, GLenum mode)
4169{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004170 EVENT("(GLenum target = 0x%X, GLenum mode = 0x%X)", target, mode);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004171
4172 try
4173 {
alokp@chromium.orgd303ef92010-09-09 17:30:15 +00004174 switch (mode)
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00004175 {
alokp@chromium.orgd303ef92010-09-09 17:30:15 +00004176 case GL_FASTEST:
4177 case GL_NICEST:
4178 case GL_DONT_CARE:
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00004179 break;
4180 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004181 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00004182 }
4183
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004184 gl::Context *context = gl::getNonLostContext();
alokp@chromium.orgd303ef92010-09-09 17:30:15 +00004185 switch (target)
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00004186 {
alokp@chromium.orgd303ef92010-09-09 17:30:15 +00004187 case GL_GENERATE_MIPMAP_HINT:
4188 if (context) context->setGenerateMipmapHint(mode);
4189 break;
4190 case GL_FRAGMENT_SHADER_DERIVATIVE_HINT_OES:
4191 if (context) context->setFragmentShaderDerivativeHint(mode);
4192 break;
4193 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004194 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00004195 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004196 }
4197 catch(std::bad_alloc&)
4198 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004199 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004200 }
4201}
4202
4203GLboolean __stdcall glIsBuffer(GLuint buffer)
4204{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004205 EVENT("(GLuint buffer = %d)", buffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004206
4207 try
4208 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004209 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004210
4211 if (context && buffer)
4212 {
4213 gl::Buffer *bufferObject = context->getBuffer(buffer);
4214
4215 if (bufferObject)
4216 {
4217 return GL_TRUE;
4218 }
4219 }
4220 }
4221 catch(std::bad_alloc&)
4222 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004223 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004224 }
4225
4226 return GL_FALSE;
4227}
4228
4229GLboolean __stdcall glIsEnabled(GLenum cap)
4230{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004231 EVENT("(GLenum cap = 0x%X)", cap);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004232
4233 try
4234 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004235 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004236
4237 if (context)
4238 {
4239 switch (cap)
4240 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004241 case GL_CULL_FACE: return context->isCullFaceEnabled();
4242 case GL_POLYGON_OFFSET_FILL: return context->isPolygonOffsetFillEnabled();
4243 case GL_SAMPLE_ALPHA_TO_COVERAGE: return context->isSampleAlphaToCoverageEnabled();
4244 case GL_SAMPLE_COVERAGE: return context->isSampleCoverageEnabled();
4245 case GL_SCISSOR_TEST: return context->isScissorTestEnabled();
4246 case GL_STENCIL_TEST: return context->isStencilTestEnabled();
4247 case GL_DEPTH_TEST: return context->isDepthTestEnabled();
4248 case GL_BLEND: return context->isBlendEnabled();
4249 case GL_DITHER: return context->isDitherEnabled();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004250 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004251 return gl::error(GL_INVALID_ENUM, false);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004252 }
4253 }
4254 }
4255 catch(std::bad_alloc&)
4256 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004257 return gl::error(GL_OUT_OF_MEMORY, false);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004258 }
4259
4260 return false;
4261}
4262
daniel@transgaming.comfe208882010-09-01 15:47:57 +00004263GLboolean __stdcall glIsFenceNV(GLuint fence)
4264{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004265 EVENT("(GLuint fence = %d)", fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004266
4267 try
4268 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004269 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004270
4271 if (context)
4272 {
Jamie Madill33dc8432013-07-26 11:55:05 -04004273 gl::FenceNV *fenceObject = context->getFenceNV(fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004274
4275 if (fenceObject == NULL)
4276 {
4277 return GL_FALSE;
4278 }
4279
4280 return fenceObject->isFence();
4281 }
4282 }
4283 catch(std::bad_alloc&)
4284 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004285 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004286 }
4287
4288 return GL_FALSE;
daniel@transgaming.comfe208882010-09-01 15:47:57 +00004289}
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004290
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004291GLboolean __stdcall glIsFramebuffer(GLuint framebuffer)
4292{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004293 EVENT("(GLuint framebuffer = %d)", framebuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004294
4295 try
4296 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004297 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004298
4299 if (context && framebuffer)
4300 {
4301 gl::Framebuffer *framebufferObject = context->getFramebuffer(framebuffer);
4302
4303 if (framebufferObject)
4304 {
4305 return GL_TRUE;
4306 }
4307 }
4308 }
4309 catch(std::bad_alloc&)
4310 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004311 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004312 }
4313
4314 return GL_FALSE;
4315}
4316
4317GLboolean __stdcall glIsProgram(GLuint program)
4318{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004319 EVENT("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004320
4321 try
4322 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004323 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004324
4325 if (context && program)
4326 {
4327 gl::Program *programObject = context->getProgram(program);
4328
4329 if (programObject)
4330 {
4331 return GL_TRUE;
4332 }
4333 }
4334 }
4335 catch(std::bad_alloc&)
4336 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004337 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004338 }
4339
4340 return GL_FALSE;
4341}
4342
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00004343GLboolean __stdcall glIsQueryEXT(GLuint id)
4344{
4345 EVENT("(GLuint id = %d)", id);
4346
4347 try
4348 {
4349 if (id == 0)
4350 {
4351 return GL_FALSE;
4352 }
4353
4354 gl::Context *context = gl::getNonLostContext();
4355
4356 if (context)
4357 {
4358 gl::Query *queryObject = context->getQuery(id, false, GL_NONE);
4359
4360 if (queryObject)
4361 {
4362 return GL_TRUE;
4363 }
4364 }
4365 }
4366 catch(std::bad_alloc&)
4367 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004368 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00004369 }
4370
4371 return GL_FALSE;
4372}
4373
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004374GLboolean __stdcall glIsRenderbuffer(GLuint renderbuffer)
4375{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004376 EVENT("(GLuint renderbuffer = %d)", renderbuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004377
4378 try
4379 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004380 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004381
4382 if (context && renderbuffer)
4383 {
4384 gl::Renderbuffer *renderbufferObject = context->getRenderbuffer(renderbuffer);
4385
4386 if (renderbufferObject)
4387 {
4388 return GL_TRUE;
4389 }
4390 }
4391 }
4392 catch(std::bad_alloc&)
4393 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004394 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004395 }
4396
4397 return GL_FALSE;
4398}
4399
4400GLboolean __stdcall glIsShader(GLuint shader)
4401{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004402 EVENT("(GLuint shader = %d)", shader);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004403
4404 try
4405 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004406 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004407
4408 if (context && shader)
4409 {
4410 gl::Shader *shaderObject = context->getShader(shader);
4411
4412 if (shaderObject)
4413 {
4414 return GL_TRUE;
4415 }
4416 }
4417 }
4418 catch(std::bad_alloc&)
4419 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004420 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004421 }
4422
4423 return GL_FALSE;
4424}
4425
4426GLboolean __stdcall glIsTexture(GLuint texture)
4427{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004428 EVENT("(GLuint texture = %d)", texture);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004429
4430 try
4431 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004432 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004433
4434 if (context && texture)
4435 {
4436 gl::Texture *textureObject = context->getTexture(texture);
4437
4438 if (textureObject)
4439 {
4440 return GL_TRUE;
4441 }
4442 }
4443 }
4444 catch(std::bad_alloc&)
4445 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004446 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004447 }
4448
4449 return GL_FALSE;
4450}
4451
4452void __stdcall glLineWidth(GLfloat width)
4453{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004454 EVENT("(GLfloat width = %f)", width);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004455
4456 try
4457 {
4458 if (width <= 0.0f)
4459 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004460 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004461 }
4462
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004463 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com32e58cd2010-03-24 09:44:10 +00004464
4465 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004466 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004467 context->setLineWidth(width);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004468 }
4469 }
4470 catch(std::bad_alloc&)
4471 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004472 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004473 }
4474}
4475
4476void __stdcall glLinkProgram(GLuint program)
4477{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004478 EVENT("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004479
4480 try
4481 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004482 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004483
4484 if (context)
4485 {
4486 gl::Program *programObject = context->getProgram(program);
4487
4488 if (!programObject)
4489 {
daniel@transgaming.com277b7142010-04-13 03:26:44 +00004490 if (context->getShader(program))
4491 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004492 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com277b7142010-04-13 03:26:44 +00004493 }
4494 else
4495 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004496 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com277b7142010-04-13 03:26:44 +00004497 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004498 }
4499
daniel@transgaming.com95d29422012-07-24 18:36:10 +00004500 context->linkProgram(program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004501 }
4502 }
4503 catch(std::bad_alloc&)
4504 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004505 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004506 }
4507}
4508
4509void __stdcall glPixelStorei(GLenum pname, GLint param)
4510{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004511 EVENT("(GLenum pname = 0x%X, GLint param = %d)", pname, param);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004512
4513 try
4514 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004515 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004516
4517 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004518 {
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004519 switch (pname)
4520 {
4521 case GL_UNPACK_ALIGNMENT:
4522 if (param != 1 && param != 2 && param != 4 && param != 8)
4523 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004524 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004525 }
4526
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004527 context->setUnpackAlignment(param);
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004528 break;
4529
4530 case GL_PACK_ALIGNMENT:
4531 if (param != 1 && param != 2 && param != 4 && param != 8)
4532 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004533 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004534 }
4535
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004536 context->setPackAlignment(param);
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004537 break;
4538
bsalomon@google.com56d46ab2011-11-23 14:53:10 +00004539 case GL_PACK_REVERSE_ROW_ORDER_ANGLE:
4540 context->setPackReverseRowOrder(param != 0);
4541 break;
4542
shannonwoods@chromium.orgabf14cc2013-05-30 00:20:58 +00004543 case GL_UNPACK_IMAGE_HEIGHT:
4544 case GL_UNPACK_SKIP_IMAGES:
4545 case GL_UNPACK_ROW_LENGTH:
4546 case GL_UNPACK_SKIP_ROWS:
4547 case GL_UNPACK_SKIP_PIXELS:
4548 case GL_PACK_ROW_LENGTH:
4549 case GL_PACK_SKIP_ROWS:
4550 case GL_PACK_SKIP_PIXELS:
4551 if (context->getClientVersion() < 3)
4552 {
4553 return gl::error(GL_INVALID_ENUM);
4554 }
4555 UNIMPLEMENTED();
4556 break;
4557
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004558 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004559 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004560 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004561 }
4562 }
4563 catch(std::bad_alloc&)
4564 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004565 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004566 }
4567}
4568
4569void __stdcall glPolygonOffset(GLfloat factor, GLfloat units)
4570{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004571 EVENT("(GLfloat factor = %f, GLfloat units = %f)", factor, units);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004572
4573 try
4574 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004575 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comaede6302010-04-29 03:35:48 +00004576
4577 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004578 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004579 context->setPolygonOffsetParams(factor, units);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004580 }
4581 }
4582 catch(std::bad_alloc&)
4583 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004584 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004585 }
4586}
4587
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00004588void __stdcall glReadnPixelsEXT(GLint x, GLint y, GLsizei width, GLsizei height,
4589 GLenum format, GLenum type, GLsizei bufSize,
4590 GLvoid *data)
4591{
4592 EVENT("(GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d, "
4593 "GLenum format = 0x%X, GLenum type = 0x%X, GLsizei bufSize = 0x%d, GLvoid *data = 0x%0.8p)",
4594 x, y, width, height, format, type, bufSize, data);
4595
4596 try
4597 {
4598 if (width < 0 || height < 0 || bufSize < 0)
4599 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004600 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00004601 }
4602
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00004603 gl::Context *context = gl::getNonLostContext();
4604
4605 if (context)
4606 {
shannonwoods@chromium.org44a4f982013-05-30 00:13:49 +00004607 GLint currentInternalFormat;
daniel@transgaming.com42944b02012-09-27 17:45:57 +00004608 GLenum currentFormat, currentType;
shannonwoods@chromium.org44a4f982013-05-30 00:13:49 +00004609
daniel@transgaming.com42944b02012-09-27 17:45:57 +00004610 // Failure in getCurrentReadFormatType indicates that no color attachment is currently bound,
4611 // and attempting to read back if that's the case is an error. The error will be registered
4612 // by getCurrentReadFormat.
shannonwoods@chromium.org44a4f982013-05-30 00:13:49 +00004613 if (!context->getCurrentReadFormatType(&currentInternalFormat, &currentFormat, &currentType))
daniel@transgaming.com42944b02012-09-27 17:45:57 +00004614 return;
4615
Geoff Lang34dbb6f2013-08-05 15:05:47 -04004616 bool validReadFormat = (context->getClientVersion() < 3) ? gl::ValidES2ReadFormatType(format, type) :
4617 gl::ValidES3ReadFormatType(currentInternalFormat, format, type);
shannonwoods@chromium.org44a4f982013-05-30 00:13:49 +00004618
4619 if (!(currentFormat == format && currentType == type) && !validReadFormat)
daniel@transgaming.com42944b02012-09-27 17:45:57 +00004620 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004621 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com42944b02012-09-27 17:45:57 +00004622 }
4623
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00004624 context->readPixels(x, y, width, height, format, type, &bufSize, data);
4625 }
4626 }
4627 catch(std::bad_alloc&)
4628 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004629 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00004630 }
4631}
4632
4633void __stdcall glReadPixels(GLint x, GLint y, GLsizei width, GLsizei height,
4634 GLenum format, GLenum type, GLvoid* pixels)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004635{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004636 EVENT("(GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00004637 "GLenum format = 0x%X, GLenum type = 0x%X, GLvoid* pixels = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00004638 x, y, width, height, format, type, pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004639
4640 try
4641 {
4642 if (width < 0 || height < 0)
4643 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004644 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004645 }
4646
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004647 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004648
4649 if (context)
4650 {
shannonwoods@chromium.org44a4f982013-05-30 00:13:49 +00004651 GLint currentInternalFormat;
daniel@transgaming.com42944b02012-09-27 17:45:57 +00004652 GLenum currentFormat, currentType;
shannonwoods@chromium.org44a4f982013-05-30 00:13:49 +00004653
daniel@transgaming.com42944b02012-09-27 17:45:57 +00004654 // Failure in getCurrentReadFormatType indicates that no color attachment is currently bound,
4655 // and attempting to read back if that's the case is an error. The error will be registered
4656 // by getCurrentReadFormat.
shannonwoods@chromium.org44a4f982013-05-30 00:13:49 +00004657 if (!context->getCurrentReadFormatType(&currentInternalFormat, &currentFormat, &currentType))
daniel@transgaming.com42944b02012-09-27 17:45:57 +00004658 return;
4659
Geoff Lang34dbb6f2013-08-05 15:05:47 -04004660 bool validReadFormat = (context->getClientVersion() < 3) ? gl::ValidES2ReadFormatType(format, type) :
4661 gl::ValidES3ReadFormatType(currentInternalFormat, format, type);
shannonwoods@chromium.org44a4f982013-05-30 00:13:49 +00004662
4663 if (!(currentFormat == format && currentType == type) && !validReadFormat)
daniel@transgaming.com42944b02012-09-27 17:45:57 +00004664 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004665 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com42944b02012-09-27 17:45:57 +00004666 }
4667
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00004668 context->readPixels(x, y, width, height, format, type, NULL, pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004669 }
4670 }
4671 catch(std::bad_alloc&)
4672 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004673 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004674 }
4675}
4676
4677void __stdcall glReleaseShaderCompiler(void)
4678{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004679 EVENT("()");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004680
4681 try
4682 {
4683 gl::Shader::releaseCompiler();
4684 }
4685 catch(std::bad_alloc&)
4686 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004687 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004688 }
4689}
4690
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00004691void __stdcall glRenderbufferStorageMultisampleANGLE(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004692{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004693 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 +00004694 target, samples, internalformat, width, height);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004695
4696 try
4697 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004698 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004699
4700 if (context)
4701 {
Geoff Lang34dbb6f2013-08-05 15:05:47 -04004702 if (!ValidateRenderbufferStorageParameters(context, target, samples, internalformat,
Geoff Lang2e1dcd52013-05-29 10:34:08 -04004703 width, height, true))
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +00004704 {
Geoff Lang2e1dcd52013-05-29 10:34:08 -04004705 return;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004706 }
shannon.woods%transgaming.com@gtempaccount.com8dce6512013-04-13 03:42:19 +00004707
4708 context->setRenderbufferStorage(width, height, internalformat, samples);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004709 }
4710 }
4711 catch(std::bad_alloc&)
4712 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004713 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004714 }
4715}
4716
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00004717void __stdcall glRenderbufferStorage(GLenum target, GLenum internalformat, GLsizei width, GLsizei height)
4718{
4719 glRenderbufferStorageMultisampleANGLE(target, 0, internalformat, width, height);
4720}
4721
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004722void __stdcall glSampleCoverage(GLclampf value, GLboolean invert)
4723{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00004724 EVENT("(GLclampf value = %f, GLboolean invert = %u)", value, invert);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004725
4726 try
4727 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004728 gl::Context* context = gl::getNonLostContext();
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00004729
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004730 if (context)
4731 {
daniel@transgaming.coma36f98e2010-05-18 18:51:09 +00004732 context->setSampleCoverageParams(gl::clamp01(value), invert == GL_TRUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004733 }
4734 }
4735 catch(std::bad_alloc&)
4736 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004737 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004738 }
4739}
4740
daniel@transgaming.comfe208882010-09-01 15:47:57 +00004741void __stdcall glSetFenceNV(GLuint fence, GLenum condition)
4742{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004743 EVENT("(GLuint fence = %d, GLenum condition = 0x%X)", fence, condition);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004744
4745 try
4746 {
4747 if (condition != GL_ALL_COMPLETED_NV)
4748 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004749 return gl::error(GL_INVALID_ENUM);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004750 }
4751
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004752 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004753
4754 if (context)
4755 {
Jamie Madill33dc8432013-07-26 11:55:05 -04004756 gl::FenceNV *fenceObject = context->getFenceNV(fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004757
4758 if (fenceObject == NULL)
4759 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004760 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004761 }
4762
4763 fenceObject->setFence(condition);
4764 }
4765 }
4766 catch(std::bad_alloc&)
4767 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004768 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004769 }
daniel@transgaming.comfe208882010-09-01 15:47:57 +00004770}
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004771
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004772void __stdcall glScissor(GLint x, GLint y, GLsizei width, GLsizei height)
4773{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004774 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 +00004775
4776 try
4777 {
4778 if (width < 0 || height < 0)
4779 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004780 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004781 }
4782
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004783 gl::Context* context = gl::getNonLostContext();
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00004784
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004785 if (context)
4786 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004787 context->setScissorParams(x, y, width, height);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004788 }
4789 }
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
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00004796void __stdcall glShaderBinary(GLsizei n, const GLuint* shaders, GLenum binaryformat, const GLvoid* binary, GLsizei length)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004797{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004798 EVENT("(GLsizei n = %d, const GLuint* shaders = 0x%0.8p, GLenum binaryformat = 0x%X, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00004799 "const GLvoid* binary = 0x%0.8p, GLsizei length = %d)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00004800 n, shaders, binaryformat, binary, length);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004801
4802 try
4803 {
daniel@transgaming.comd1f667f2010-04-29 03:38:52 +00004804 // No binary shader formats are supported.
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004805 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004806 }
4807 catch(std::bad_alloc&)
4808 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004809 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004810 }
4811}
4812
shannon.woods%transgaming.com@gtempaccount.com5f339332013-04-13 03:29:02 +00004813void __stdcall glShaderSource(GLuint shader, GLsizei count, const GLchar* const* string, const GLint* length)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004814{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004815 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 +00004816 shader, count, string, length);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004817
4818 try
4819 {
daniel@transgaming.com8e6a6be2010-04-13 03:26:41 +00004820 if (count < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004821 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004822 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004823 }
4824
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004825 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004826
4827 if (context)
4828 {
4829 gl::Shader *shaderObject = context->getShader(shader);
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00004830
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004831 if (!shaderObject)
4832 {
daniel@transgaming.com8e6a6be2010-04-13 03:26:41 +00004833 if (context->getProgram(shader))
4834 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004835 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com8e6a6be2010-04-13 03:26:41 +00004836 }
4837 else
4838 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004839 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com8e6a6be2010-04-13 03:26:41 +00004840 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004841 }
4842
4843 shaderObject->setSource(count, string, length);
4844 }
4845 }
4846 catch(std::bad_alloc&)
4847 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004848 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004849 }
4850}
4851
4852void __stdcall glStencilFunc(GLenum func, GLint ref, GLuint mask)
4853{
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00004854 glStencilFuncSeparate(GL_FRONT_AND_BACK, func, ref, mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004855}
4856
4857void __stdcall glStencilFuncSeparate(GLenum face, GLenum func, GLint ref, GLuint mask)
4858{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004859 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 +00004860
4861 try
4862 {
4863 switch (face)
4864 {
4865 case GL_FRONT:
4866 case GL_BACK:
4867 case GL_FRONT_AND_BACK:
4868 break;
4869 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004870 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004871 }
4872
4873 switch (func)
4874 {
4875 case GL_NEVER:
4876 case GL_ALWAYS:
4877 case GL_LESS:
4878 case GL_LEQUAL:
4879 case GL_EQUAL:
4880 case GL_GEQUAL:
4881 case GL_GREATER:
4882 case GL_NOTEQUAL:
4883 break;
4884 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004885 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004886 }
4887
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004888 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004889
4890 if (context)
4891 {
4892 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
4893 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004894 context->setStencilParams(func, ref, mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004895 }
4896
4897 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
4898 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004899 context->setStencilBackParams(func, ref, mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004900 }
4901 }
4902 }
4903 catch(std::bad_alloc&)
4904 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004905 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004906 }
4907}
4908
4909void __stdcall glStencilMask(GLuint mask)
4910{
4911 glStencilMaskSeparate(GL_FRONT_AND_BACK, mask);
4912}
4913
4914void __stdcall glStencilMaskSeparate(GLenum face, GLuint mask)
4915{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004916 EVENT("(GLenum face = 0x%X, GLuint mask = %d)", face, mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004917
4918 try
4919 {
4920 switch (face)
4921 {
4922 case GL_FRONT:
4923 case GL_BACK:
4924 case GL_FRONT_AND_BACK:
4925 break;
4926 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004927 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004928 }
4929
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004930 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004931
4932 if (context)
4933 {
4934 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
4935 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004936 context->setStencilWritemask(mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004937 }
4938
4939 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
4940 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004941 context->setStencilBackWritemask(mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004942 }
4943 }
4944 }
4945 catch(std::bad_alloc&)
4946 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004947 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004948 }
4949}
4950
4951void __stdcall glStencilOp(GLenum fail, GLenum zfail, GLenum zpass)
4952{
4953 glStencilOpSeparate(GL_FRONT_AND_BACK, fail, zfail, zpass);
4954}
4955
4956void __stdcall glStencilOpSeparate(GLenum face, GLenum fail, GLenum zfail, GLenum zpass)
4957{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004958 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 +00004959 face, fail, zfail, zpass);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004960
4961 try
4962 {
4963 switch (face)
4964 {
4965 case GL_FRONT:
4966 case GL_BACK:
4967 case GL_FRONT_AND_BACK:
4968 break;
4969 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004970 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004971 }
4972
4973 switch (fail)
4974 {
4975 case GL_ZERO:
4976 case GL_KEEP:
4977 case GL_REPLACE:
4978 case GL_INCR:
4979 case GL_DECR:
4980 case GL_INVERT:
4981 case GL_INCR_WRAP:
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00004982 case GL_DECR_WRAP:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004983 break;
4984 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004985 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004986 }
4987
4988 switch (zfail)
4989 {
4990 case GL_ZERO:
4991 case GL_KEEP:
4992 case GL_REPLACE:
4993 case GL_INCR:
4994 case GL_DECR:
4995 case GL_INVERT:
4996 case GL_INCR_WRAP:
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00004997 case GL_DECR_WRAP:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004998 break;
4999 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005000 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005001 }
5002
5003 switch (zpass)
5004 {
5005 case GL_ZERO:
5006 case GL_KEEP:
5007 case GL_REPLACE:
5008 case GL_INCR:
5009 case GL_DECR:
5010 case GL_INVERT:
5011 case GL_INCR_WRAP:
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00005012 case GL_DECR_WRAP:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005013 break;
5014 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005015 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005016 }
5017
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005018 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005019
5020 if (context)
5021 {
5022 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
5023 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00005024 context->setStencilOperations(fail, zfail, zpass);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005025 }
5026
5027 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
5028 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00005029 context->setStencilBackOperations(fail, zfail, zpass);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005030 }
5031 }
5032 }
5033 catch(std::bad_alloc&)
5034 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005035 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005036 }
5037}
5038
daniel@transgaming.comfe208882010-09-01 15:47:57 +00005039GLboolean __stdcall glTestFenceNV(GLuint fence)
5040{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005041 EVENT("(GLuint fence = %d)", fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005042
5043 try
5044 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005045 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005046
5047 if (context)
5048 {
Jamie Madill33dc8432013-07-26 11:55:05 -04005049 gl::FenceNV *fenceObject = context->getFenceNV(fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005050
5051 if (fenceObject == NULL)
5052 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005053 return gl::error(GL_INVALID_OPERATION, GL_TRUE);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005054 }
5055
Jamie Madillfb9a7402013-07-26 11:55:01 -04005056 if (fenceObject->isFence() != GL_TRUE)
5057 {
5058 return gl::error(GL_INVALID_OPERATION, GL_TRUE);
5059 }
5060
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005061 return fenceObject->testFence();
5062 }
5063 }
5064 catch(std::bad_alloc&)
5065 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005066 gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005067 }
5068
5069 return GL_TRUE;
daniel@transgaming.comfe208882010-09-01 15:47:57 +00005070}
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005071
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00005072void __stdcall glTexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height,
5073 GLint border, GLenum format, GLenum type, const GLvoid* pixels)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005074{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005075 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 +00005076 "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 +00005077 target, level, internalformat, width, height, border, format, type, pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005078
5079 try
5080 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005081 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005082
5083 if (context)
5084 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005085 if (context->getClientVersion() < 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -04005086 !ValidateES2TexImageParameters(context, target, level, internalformat, false, false,
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005087 0, 0, width, height, border, format, type, pixels))
daniel@transgaming.com32b11442011-11-19 02:42:48 +00005088 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005089 return;
5090 }
5091
5092 if (context->getClientVersion() >= 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -04005093 !ValidateES3TexImageParameters(context, target, level, internalformat, false, false,
Jamie Madillefb2a6f2013-09-24 10:22:42 -04005094 0, 0, 0, width, height, 1, border, format, type, pixels))
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005095 {
5096 return;
daniel@transgaming.com32b11442011-11-19 02:42:48 +00005097 }
5098
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00005099 switch (target)
5100 {
5101 case GL_TEXTURE_2D:
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00005102 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005103 gl::Texture2D *texture = context->getTexture2D();
Jamie Madill88f18f42013-09-18 14:36:19 -04005104 texture->setImage(level, width, height, internalformat, format, type, context->getUnpackState(), pixels);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00005105 }
5106 break;
5107 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00005108 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005109 gl::TextureCubeMap *texture = context->getTextureCubeMap();
Jamie Madill88f18f42013-09-18 14:36:19 -04005110 texture->setImagePosX(level, width, height, internalformat, format, type, context->getUnpackState(), pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005111 }
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005112 break;
5113 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
5114 {
5115 gl::TextureCubeMap *texture = context->getTextureCubeMap();
Jamie Madill88f18f42013-09-18 14:36:19 -04005116 texture->setImageNegX(level, width, height, internalformat, format, type, context->getUnpackState(), pixels);
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005117 }
5118 break;
5119 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
5120 {
5121 gl::TextureCubeMap *texture = context->getTextureCubeMap();
Jamie Madill88f18f42013-09-18 14:36:19 -04005122 texture->setImagePosY(level, width, height, internalformat, format, type, context->getUnpackState(), pixels);
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005123 }
5124 break;
5125 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
5126 {
5127 gl::TextureCubeMap *texture = context->getTextureCubeMap();
Jamie Madill88f18f42013-09-18 14:36:19 -04005128 texture->setImageNegY(level, width, height, internalformat, format, type, context->getUnpackState(), pixels);
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005129 }
5130 break;
5131 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
5132 {
5133 gl::TextureCubeMap *texture = context->getTextureCubeMap();
Jamie Madill88f18f42013-09-18 14:36:19 -04005134 texture->setImagePosZ(level, width, height, internalformat, format, type, context->getUnpackState(), pixels);
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005135 }
5136 break;
5137 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
5138 {
5139 gl::TextureCubeMap *texture = context->getTextureCubeMap();
Jamie Madill88f18f42013-09-18 14:36:19 -04005140 texture->setImageNegZ(level, width, height, internalformat, format, type, context->getUnpackState(), pixels);
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005141 }
5142 break;
5143 default: UNREACHABLE();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005144 }
5145 }
5146 }
5147 catch(std::bad_alloc&)
5148 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005149 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005150 }
5151}
5152
5153void __stdcall glTexParameterf(GLenum target, GLenum pname, GLfloat param)
5154{
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005155 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLint param = %f)", target, pname, param);
5156
5157 try
5158 {
5159 gl::Context *context = gl::getNonLostContext();
5160
5161 if (context)
5162 {
Geoff Lang34dbb6f2013-08-05 15:05:47 -04005163 if (!ValidateTexParamParameters(context, pname, static_cast<GLint>(param)))
Jamie Madill478fdb22013-07-19 16:36:59 -04005164 {
5165 return;
5166 }
5167
Jamie Madill35d15012013-10-07 10:46:37 -04005168 gl::Texture *texture = GetTargetTexture(context, target);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005169
Jamie Madillfb8a8302013-07-03 14:24:12 -04005170 if (!texture)
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005171 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005172 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005173 }
5174
5175 switch (pname)
5176 {
Jamie Madill478fdb22013-07-19 16:36:59 -04005177 case GL_TEXTURE_WRAP_S: texture->setWrapS(gl::uiround<GLenum>(param)); break;
5178 case GL_TEXTURE_WRAP_T: texture->setWrapT(gl::uiround<GLenum>(param)); break;
5179 case GL_TEXTURE_WRAP_R: texture->setWrapR(gl::uiround<GLenum>(param)); break;
5180 case GL_TEXTURE_MIN_FILTER: texture->setMinFilter(gl::uiround<GLenum>(param)); break;
5181 case GL_TEXTURE_MAG_FILTER: texture->setMagFilter(gl::uiround<GLenum>(param)); break;
5182 case GL_TEXTURE_USAGE_ANGLE: texture->setUsage(gl::uiround<GLenum>(param)); break;
5183 case GL_TEXTURE_MAX_ANISOTROPY_EXT: texture->setMaxAnisotropy(static_cast<GLfloat>(param), context->getTextureMaxAnisotropy()); break;
5184 case GL_TEXTURE_COMPARE_MODE: texture->setCompareMode(gl::uiround<GLenum>(param)); break;
5185 case GL_TEXTURE_COMPARE_FUNC: texture->setCompareFunc(gl::uiround<GLenum>(param)); break;
shannonwoods@chromium.orgabf14cc2013-05-30 00:20:58 +00005186
Jamie Madill478fdb22013-07-19 16:36:59 -04005187 case GL_TEXTURE_SWIZZLE_R:
5188 case GL_TEXTURE_SWIZZLE_G:
5189 case GL_TEXTURE_SWIZZLE_B:
5190 case GL_TEXTURE_SWIZZLE_A:
5191 case GL_TEXTURE_BASE_LEVEL:
5192 case GL_TEXTURE_MAX_LEVEL:
shannonwoods@chromium.orgabf14cc2013-05-30 00:20:58 +00005193 case GL_TEXTURE_MIN_LOD:
5194 case GL_TEXTURE_MAX_LOD:
shannonwoods@chromium.orgabf14cc2013-05-30 00:20:58 +00005195 UNIMPLEMENTED();
5196 break;
5197
Jamie Madill478fdb22013-07-19 16:36:59 -04005198 default: UNREACHABLE(); break;
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005199 }
5200 }
5201 }
5202 catch(std::bad_alloc&)
5203 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005204 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005205 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005206}
5207
5208void __stdcall glTexParameterfv(GLenum target, GLenum pname, const GLfloat* params)
5209{
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005210 glTexParameterf(target, pname, (GLfloat)*params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005211}
5212
5213void __stdcall glTexParameteri(GLenum target, GLenum pname, GLint param)
5214{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005215 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLint param = %d)", target, pname, param);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005216
5217 try
5218 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005219 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005220
5221 if (context)
5222 {
Geoff Lang34dbb6f2013-08-05 15:05:47 -04005223 if (!ValidateTexParamParameters(context, pname, param))
Jamie Madill478fdb22013-07-19 16:36:59 -04005224 {
5225 return;
5226 }
5227
Jamie Madill35d15012013-10-07 10:46:37 -04005228 gl::Texture *texture = GetTargetTexture(context, target);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005229
Jamie Madillfb8a8302013-07-03 14:24:12 -04005230 if (!texture)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005231 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005232 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005233 }
5234
5235 switch (pname)
5236 {
Jamie Madill478fdb22013-07-19 16:36:59 -04005237 case GL_TEXTURE_WRAP_S: texture->setWrapS((GLenum)param); break;
5238 case GL_TEXTURE_WRAP_T: texture->setWrapT((GLenum)param); break;
5239 case GL_TEXTURE_WRAP_R: texture->setWrapR((GLenum)param); break;
5240 case GL_TEXTURE_MIN_FILTER: texture->setMinFilter((GLenum)param); break;
5241 case GL_TEXTURE_MAG_FILTER: texture->setMagFilter((GLenum)param); break;
5242 case GL_TEXTURE_USAGE_ANGLE: texture->setUsage((GLenum)param); break;
5243 case GL_TEXTURE_MAX_ANISOTROPY_EXT: texture->setMaxAnisotropy((float)param, context->getTextureMaxAnisotropy()); break;
5244 case GL_TEXTURE_COMPARE_MODE: texture->setCompareMode((GLenum)param); break;
5245 case GL_TEXTURE_COMPARE_FUNC: texture->setCompareFunc((GLenum)param); break;
shannonwoods@chromium.orgabf14cc2013-05-30 00:20:58 +00005246
5247 case GL_TEXTURE_SWIZZLE_R:
5248 case GL_TEXTURE_SWIZZLE_G:
5249 case GL_TEXTURE_SWIZZLE_B:
5250 case GL_TEXTURE_SWIZZLE_A:
5251 case GL_TEXTURE_BASE_LEVEL:
5252 case GL_TEXTURE_MAX_LEVEL:
Jamie Madill478fdb22013-07-19 16:36:59 -04005253 case GL_TEXTURE_MIN_LOD:
5254 case GL_TEXTURE_MAX_LOD:
shannonwoods@chromium.orgabf14cc2013-05-30 00:20:58 +00005255 UNIMPLEMENTED();
5256 break;
5257
Jamie Madill478fdb22013-07-19 16:36:59 -04005258 default: UNREACHABLE(); break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005259 }
5260 }
5261 }
5262 catch(std::bad_alloc&)
5263 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005264 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005265 }
5266}
5267
5268void __stdcall glTexParameteriv(GLenum target, GLenum pname, const GLint* params)
5269{
5270 glTexParameteri(target, pname, *params);
5271}
5272
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005273void __stdcall glTexStorage2DEXT(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height)
5274{
5275 EVENT("(GLenum target = 0x%X, GLsizei levels = %d, GLenum internalformat = 0x%X, GLsizei width = %d, GLsizei height = %d)",
5276 target, levels, internalformat, width, height);
5277
5278 try
5279 {
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005280 gl::Context *context = gl::getNonLostContext();
5281
5282 if (context)
5283 {
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00005284 if (context->getClientVersion() < 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -04005285 !ValidateES2TexStorageParameters(context, target, levels, internalformat, width, height))
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +00005286 {
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00005287 return;
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +00005288 }
5289
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00005290 if (context->getClientVersion() >= 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -04005291 !ValidateES3TexStorageParameters(context, target, levels, internalformat, width, height, 1))
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +00005292 {
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00005293 return;
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +00005294 }
5295
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00005296 switch (target)
5297 {
5298 case GL_TEXTURE_2D:
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00005299 {
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00005300 gl::Texture2D *texture2d = context->getTexture2D();
5301 texture2d->storage(levels, internalformat, width, height);
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00005302 }
5303 break;
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00005304
Geoff Lang01c21d22013-09-24 11:52:16 -04005305 case GL_TEXTURE_CUBE_MAP:
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00005306 {
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00005307 gl::TextureCubeMap *textureCube = context->getTextureCubeMap();
5308 textureCube->storage(levels, internalformat, width);
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00005309 }
5310 break;
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00005311
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00005312 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005313 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00005314 }
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005315 }
5316 }
5317 catch(std::bad_alloc&)
5318 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005319 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005320 }
5321}
5322
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00005323void __stdcall glTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height,
5324 GLenum format, GLenum type, const GLvoid* pixels)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005325{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005326 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00005327 "GLsizei width = %d, GLsizei height = %d, GLenum format = 0x%X, GLenum type = 0x%X, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00005328 "const GLvoid* pixels = 0x%0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005329 target, level, xoffset, yoffset, width, height, format, type, pixels);
5330
5331 try
5332 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005333 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005334
5335 if (context)
5336 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005337 if (context->getClientVersion() < 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -04005338 !ValidateES2TexImageParameters(context, target, level, GL_NONE, false, true,
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005339 0, 0, width, height, 0, format, type, pixels))
daniel@transgaming.com1d2d3c42012-05-31 01:14:15 +00005340 {
5341 return;
5342 }
5343
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005344 if (context->getClientVersion() >= 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -04005345 !ValidateES3TexImageParameters(context, target, level, GL_NONE, false, true,
Jamie Madillefb2a6f2013-09-24 10:22:42 -04005346 0, 0, 0, width, height, 1, 0, format, type, pixels))
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005347 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005348 return;
5349 }
5350
5351 switch (target)
5352 {
5353 case GL_TEXTURE_2D:
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005354 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005355 gl::Texture2D *texture = context->getTexture2D();
Jamie Madill88f18f42013-09-18 14:36:19 -04005356 texture->subImage(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 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
5361 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
5362 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
5363 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
5364 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
5365 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005366 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005367 gl::TextureCubeMap *texture = context->getTextureCubeMap();
Jamie Madill88f18f42013-09-18 14:36:19 -04005368 texture->subImage(target, level, xoffset, yoffset, width, height, format, type, context->getUnpackState(), pixels);
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005369 }
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005370 break;
5371
5372 default:
Geoff Lang01c21d22013-09-24 11:52:16 -04005373 UNREACHABLE();
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005374 }
5375 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005376 }
5377 catch(std::bad_alloc&)
5378 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005379 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005380 }
5381}
5382
5383void __stdcall glUniform1f(GLint location, GLfloat x)
5384{
5385 glUniform1fv(location, 1, &x);
5386}
5387
5388void __stdcall glUniform1fv(GLint location, GLsizei count, const GLfloat* v)
5389{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005390 EVENT("(GLint location = %d, GLsizei count = %d, const GLfloat* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005391
5392 try
5393 {
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005394 if (count < 0)
5395 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005396 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005397 }
5398
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005399 if (location == -1)
5400 {
5401 return;
5402 }
5403
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005404 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005405
5406 if (context)
5407 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00005408 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005409 if (!programBinary)
5410 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005411 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005412 }
5413
5414 if (!programBinary->setUniform1fv(location, count, v))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005415 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005416 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005417 }
5418 }
5419 }
5420 catch(std::bad_alloc&)
5421 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005422 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005423 }
5424}
5425
5426void __stdcall glUniform1i(GLint location, GLint x)
5427{
5428 glUniform1iv(location, 1, &x);
5429}
5430
5431void __stdcall glUniform1iv(GLint location, GLsizei count, const GLint* v)
5432{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005433 EVENT("(GLint location = %d, GLsizei count = %d, const GLint* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005434
5435 try
5436 {
5437 if (count < 0)
5438 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005439 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005440 }
5441
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005442 if (location == -1)
5443 {
5444 return;
5445 }
5446
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005447 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005448
5449 if (context)
5450 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00005451 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005452 if (!programBinary)
5453 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005454 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005455 }
5456
5457 if (!programBinary->setUniform1iv(location, count, v))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005458 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005459 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005460 }
5461 }
5462 }
5463 catch(std::bad_alloc&)
5464 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005465 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005466 }
5467}
5468
5469void __stdcall glUniform2f(GLint location, GLfloat x, GLfloat y)
5470{
5471 GLfloat xy[2] = {x, y};
5472
5473 glUniform2fv(location, 1, (GLfloat*)&xy);
5474}
5475
5476void __stdcall glUniform2fv(GLint location, GLsizei count, const GLfloat* v)
5477{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005478 EVENT("(GLint location = %d, GLsizei count = %d, const GLfloat* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005479
5480 try
5481 {
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005482 if (count < 0)
5483 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005484 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005485 }
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005486
5487 if (location == -1)
5488 {
5489 return;
5490 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005491
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005492 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005493
5494 if (context)
5495 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00005496 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005497 if (!programBinary)
5498 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005499 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005500 }
5501
5502 if (!programBinary->setUniform2fv(location, count, v))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005503 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005504 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005505 }
5506 }
5507 }
5508 catch(std::bad_alloc&)
5509 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005510 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005511 }
5512}
5513
5514void __stdcall glUniform2i(GLint location, GLint x, GLint y)
5515{
5516 GLint xy[4] = {x, y};
5517
5518 glUniform2iv(location, 1, (GLint*)&xy);
5519}
5520
5521void __stdcall glUniform2iv(GLint location, GLsizei count, const GLint* v)
5522{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005523 EVENT("(GLint location = %d, GLsizei count = %d, const GLint* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005524
5525 try
5526 {
5527 if (count < 0)
5528 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005529 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005530 }
5531
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005532 if (location == -1)
5533 {
5534 return;
5535 }
5536
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005537 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005538
5539 if (context)
5540 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00005541 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005542 if (!programBinary)
5543 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005544 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005545 }
5546
5547 if (!programBinary->setUniform2iv(location, count, v))
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005548 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005549 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005550 }
5551 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005552 }
5553 catch(std::bad_alloc&)
5554 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005555 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005556 }
5557}
5558
5559void __stdcall glUniform3f(GLint location, GLfloat x, GLfloat y, GLfloat z)
5560{
5561 GLfloat xyz[3] = {x, y, z};
5562
5563 glUniform3fv(location, 1, (GLfloat*)&xyz);
5564}
5565
5566void __stdcall glUniform3fv(GLint location, GLsizei count, const GLfloat* v)
5567{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005568 EVENT("(GLint location = %d, GLsizei count = %d, const GLfloat* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005569
5570 try
5571 {
5572 if (count < 0)
5573 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005574 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005575 }
5576
5577 if (location == -1)
5578 {
5579 return;
5580 }
5581
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005582 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005583
5584 if (context)
5585 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00005586 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005587 if (!programBinary)
5588 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005589 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005590 }
5591
5592 if (!programBinary->setUniform3fv(location, count, v))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005593 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005594 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005595 }
5596 }
5597 }
5598 catch(std::bad_alloc&)
5599 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005600 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005601 }
5602}
5603
5604void __stdcall glUniform3i(GLint location, GLint x, GLint y, GLint z)
5605{
5606 GLint xyz[3] = {x, y, z};
5607
5608 glUniform3iv(location, 1, (GLint*)&xyz);
5609}
5610
5611void __stdcall glUniform3iv(GLint location, GLsizei count, const GLint* v)
5612{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005613 EVENT("(GLint location = %d, GLsizei count = %d, const GLint* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005614
5615 try
5616 {
5617 if (count < 0)
5618 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005619 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005620 }
5621
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005622 if (location == -1)
5623 {
5624 return;
5625 }
5626
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005627 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005628
5629 if (context)
5630 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00005631 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005632 if (!programBinary)
5633 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005634 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005635 }
5636
5637 if (!programBinary->setUniform3iv(location, count, v))
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005638 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005639 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005640 }
5641 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005642 }
5643 catch(std::bad_alloc&)
5644 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005645 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005646 }
5647}
5648
5649void __stdcall glUniform4f(GLint location, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
5650{
5651 GLfloat xyzw[4] = {x, y, z, w};
5652
5653 glUniform4fv(location, 1, (GLfloat*)&xyzw);
5654}
5655
5656void __stdcall glUniform4fv(GLint location, GLsizei count, const GLfloat* v)
5657{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005658 EVENT("(GLint location = %d, GLsizei count = %d, const GLfloat* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005659
5660 try
5661 {
5662 if (count < 0)
5663 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005664 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005665 }
5666
5667 if (location == -1)
5668 {
5669 return;
5670 }
5671
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005672 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005673
5674 if (context)
5675 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00005676 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005677 if (!programBinary)
5678 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005679 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005680 }
5681
5682 if (!programBinary->setUniform4fv(location, count, v))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005683 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005684 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005685 }
5686 }
5687 }
5688 catch(std::bad_alloc&)
5689 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005690 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005691 }
5692}
5693
5694void __stdcall glUniform4i(GLint location, GLint x, GLint y, GLint z, GLint w)
5695{
5696 GLint xyzw[4] = {x, y, z, w};
5697
5698 glUniform4iv(location, 1, (GLint*)&xyzw);
5699}
5700
5701void __stdcall glUniform4iv(GLint location, GLsizei count, const GLint* v)
5702{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005703 EVENT("(GLint location = %d, GLsizei count = %d, const GLint* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005704
5705 try
5706 {
5707 if (count < 0)
5708 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005709 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005710 }
5711
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005712 if (location == -1)
5713 {
5714 return;
5715 }
5716
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005717 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005718
5719 if (context)
5720 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00005721 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005722 if (!programBinary)
5723 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005724 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005725 }
5726
5727 if (!programBinary->setUniform4iv(location, count, v))
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005728 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005729 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005730 }
5731 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005732 }
5733 catch(std::bad_alloc&)
5734 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005735 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005736 }
5737}
5738
5739void __stdcall glUniformMatrix2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
5740{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005741 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00005742 location, count, transpose, value);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005743
5744 try
5745 {
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00005746 if (count < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005747 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005748 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005749 }
5750
5751 if (location == -1)
5752 {
5753 return;
5754 }
5755
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005756 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005757
5758 if (context)
5759 {
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00005760 if (transpose != GL_FALSE && context->getClientVersion() < 3)
5761 {
5762 return gl::error(GL_INVALID_VALUE);
5763 }
5764
daniel@transgaming.com62a28462012-07-24 18:33:59 +00005765 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005766 if (!programBinary)
5767 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005768 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005769 }
5770
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00005771 if (!programBinary->setUniformMatrix2fv(location, count, transpose, value))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005772 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005773 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005774 }
5775 }
5776 }
5777 catch(std::bad_alloc&)
5778 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005779 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005780 }
5781}
5782
5783void __stdcall glUniformMatrix3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
5784{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005785 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00005786 location, count, transpose, value);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005787
5788 try
5789 {
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00005790 if (count < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005791 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005792 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005793 }
5794
5795 if (location == -1)
5796 {
5797 return;
5798 }
5799
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005800 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005801
5802 if (context)
5803 {
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00005804 if (transpose != GL_FALSE && context->getClientVersion() < 3)
5805 {
5806 return gl::error(GL_INVALID_VALUE);
5807 }
5808
daniel@transgaming.com62a28462012-07-24 18:33:59 +00005809 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005810 if (!programBinary)
5811 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005812 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005813 }
5814
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00005815 if (!programBinary->setUniformMatrix3fv(location, count, transpose, value))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005816 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005817 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005818 }
5819 }
5820 }
5821 catch(std::bad_alloc&)
5822 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005823 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005824 }
5825}
5826
5827void __stdcall glUniformMatrix4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
5828{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005829 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00005830 location, count, transpose, value);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005831
5832 try
5833 {
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00005834 if (count < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005835 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005836 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005837 }
5838
5839 if (location == -1)
5840 {
5841 return;
5842 }
5843
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005844 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005845
5846 if (context)
5847 {
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00005848 if (transpose != GL_FALSE && context->getClientVersion() < 3)
5849 {
5850 return gl::error(GL_INVALID_VALUE);
5851 }
5852
daniel@transgaming.com62a28462012-07-24 18:33:59 +00005853 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005854 if (!programBinary)
5855 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005856 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005857 }
5858
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00005859 if (!programBinary->setUniformMatrix4fv(location, count, transpose, value))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005860 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005861 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005862 }
5863 }
5864 }
5865 catch(std::bad_alloc&)
5866 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005867 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005868 }
5869}
5870
5871void __stdcall glUseProgram(GLuint program)
5872{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005873 EVENT("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005874
5875 try
5876 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005877 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005878
5879 if (context)
5880 {
5881 gl::Program *programObject = context->getProgram(program);
5882
daniel@transgaming.comc8478202010-04-13 19:53:35 +00005883 if (!programObject && program != 0)
5884 {
5885 if (context->getShader(program))
5886 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005887 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comc8478202010-04-13 19:53:35 +00005888 }
5889 else
5890 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005891 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comc8478202010-04-13 19:53:35 +00005892 }
5893 }
5894
daniel@transgaming.com716056c2012-07-24 18:38:59 +00005895 if (program != 0 && !programObject->isLinked())
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005896 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005897 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005898 }
5899
5900 context->useProgram(program);
5901 }
5902 }
5903 catch(std::bad_alloc&)
5904 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005905 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005906 }
5907}
5908
5909void __stdcall glValidateProgram(GLuint program)
5910{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005911 EVENT("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005912
5913 try
5914 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005915 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00005916
5917 if (context)
5918 {
5919 gl::Program *programObject = context->getProgram(program);
5920
5921 if (!programObject)
5922 {
5923 if (context->getShader(program))
5924 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005925 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00005926 }
5927 else
5928 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005929 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00005930 }
5931 }
5932
apatrick@chromium.org253b8d22012-06-22 19:27:21 +00005933 programObject->validate();
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00005934 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005935 }
5936 catch(std::bad_alloc&)
5937 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005938 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005939 }
5940}
5941
5942void __stdcall glVertexAttrib1f(GLuint index, GLfloat x)
5943{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005944 EVENT("(GLuint index = %d, GLfloat x = %f)", index, x);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005945
5946 try
5947 {
5948 if (index >= gl::MAX_VERTEX_ATTRIBS)
5949 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005950 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005951 }
5952
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005953 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005954
5955 if (context)
5956 {
5957 GLfloat vals[4] = { x, 0, 0, 1 };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00005958 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005959 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005960 }
5961 catch(std::bad_alloc&)
5962 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005963 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005964 }
5965}
5966
5967void __stdcall glVertexAttrib1fv(GLuint index, const GLfloat* values)
5968{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005969 EVENT("(GLuint index = %d, const GLfloat* values = 0x%0.8p)", index, values);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005970
5971 try
5972 {
5973 if (index >= gl::MAX_VERTEX_ATTRIBS)
5974 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005975 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005976 }
5977
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005978 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005979
5980 if (context)
5981 {
5982 GLfloat vals[4] = { values[0], 0, 0, 1 };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00005983 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005984 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005985 }
5986 catch(std::bad_alloc&)
5987 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005988 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005989 }
5990}
5991
5992void __stdcall glVertexAttrib2f(GLuint index, GLfloat x, GLfloat y)
5993{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005994 EVENT("(GLuint index = %d, GLfloat x = %f, GLfloat y = %f)", index, x, y);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005995
5996 try
5997 {
5998 if (index >= gl::MAX_VERTEX_ATTRIBS)
5999 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006000 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006001 }
6002
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006003 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006004
6005 if (context)
6006 {
6007 GLfloat vals[4] = { x, y, 0, 1 };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00006008 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006009 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006010 }
6011 catch(std::bad_alloc&)
6012 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006013 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006014 }
6015}
6016
6017void __stdcall glVertexAttrib2fv(GLuint index, const GLfloat* values)
6018{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006019 EVENT("(GLuint index = %d, const GLfloat* values = 0x%0.8p)", index, values);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006020
6021 try
6022 {
6023 if (index >= gl::MAX_VERTEX_ATTRIBS)
6024 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006025 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006026 }
6027
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006028 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006029
6030 if (context)
6031 {
6032 GLfloat vals[4] = { values[0], values[1], 0, 1 };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00006033 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006034 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006035 }
6036 catch(std::bad_alloc&)
6037 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006038 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006039 }
6040}
6041
6042void __stdcall glVertexAttrib3f(GLuint index, GLfloat x, GLfloat y, GLfloat z)
6043{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006044 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 +00006045
6046 try
6047 {
6048 if (index >= gl::MAX_VERTEX_ATTRIBS)
6049 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006050 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006051 }
6052
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006053 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006054
6055 if (context)
6056 {
6057 GLfloat vals[4] = { x, y, z, 1 };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00006058 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006059 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006060 }
6061 catch(std::bad_alloc&)
6062 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006063 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006064 }
6065}
6066
6067void __stdcall glVertexAttrib3fv(GLuint index, const GLfloat* values)
6068{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006069 EVENT("(GLuint index = %d, const GLfloat* values = 0x%0.8p)", index, values);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006070
6071 try
6072 {
6073 if (index >= gl::MAX_VERTEX_ATTRIBS)
6074 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006075 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006076 }
6077
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006078 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006079
6080 if (context)
6081 {
6082 GLfloat vals[4] = { values[0], values[1], values[2], 1 };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00006083 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006084 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006085 }
6086 catch(std::bad_alloc&)
6087 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006088 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006089 }
6090}
6091
6092void __stdcall glVertexAttrib4f(GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
6093{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006094 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 +00006095
6096 try
6097 {
6098 if (index >= gl::MAX_VERTEX_ATTRIBS)
6099 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006100 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006101 }
6102
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006103 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006104
6105 if (context)
6106 {
6107 GLfloat vals[4] = { x, y, z, w };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00006108 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006109 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006110 }
6111 catch(std::bad_alloc&)
6112 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006113 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006114 }
6115}
6116
6117void __stdcall glVertexAttrib4fv(GLuint index, const GLfloat* values)
6118{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006119 EVENT("(GLuint index = %d, const GLfloat* values = 0x%0.8p)", index, values);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006120
6121 try
6122 {
6123 if (index >= gl::MAX_VERTEX_ATTRIBS)
6124 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006125 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006126 }
6127
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006128 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006129
6130 if (context)
6131 {
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00006132 context->setVertexAttribf(index, values);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006133 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006134 }
6135 catch(std::bad_alloc&)
6136 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006137 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006138 }
6139}
6140
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00006141void __stdcall glVertexAttribDivisorANGLE(GLuint index, GLuint divisor)
6142{
6143 EVENT("(GLuint index = %d, GLuint divisor = %d)", index, divisor);
6144
6145 try
6146 {
6147 if (index >= gl::MAX_VERTEX_ATTRIBS)
6148 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006149 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00006150 }
6151
6152 gl::Context *context = gl::getNonLostContext();
6153
6154 if (context)
6155 {
6156 context->setVertexAttribDivisor(index, divisor);
6157 }
6158 }
6159 catch(std::bad_alloc&)
6160 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006161 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00006162 }
6163}
6164
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00006165void __stdcall glVertexAttribPointer(GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid* ptr)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006166{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006167 EVENT("(GLuint index = %d, GLint size = %d, GLenum type = 0x%X, "
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006168 "GLboolean normalized = %u, GLsizei stride = %d, const GLvoid* ptr = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00006169 index, size, type, normalized, stride, ptr);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006170
6171 try
6172 {
6173 if (index >= gl::MAX_VERTEX_ATTRIBS)
6174 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006175 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006176 }
6177
6178 if (size < 1 || size > 4)
6179 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006180 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006181 }
6182
shannon.woods%transgaming.com@gtempaccount.com1a4e09a2013-04-13 03:33:30 +00006183 gl::Context *context = gl::getNonLostContext();
6184
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006185 switch (type)
6186 {
6187 case GL_BYTE:
6188 case GL_UNSIGNED_BYTE:
6189 case GL_SHORT:
6190 case GL_UNSIGNED_SHORT:
6191 case GL_FIXED:
6192 case GL_FLOAT:
6193 break;
shannon.woods%transgaming.com@gtempaccount.com1a4e09a2013-04-13 03:33:30 +00006194 case GL_HALF_FLOAT:
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00006195 case GL_INT:
6196 case GL_UNSIGNED_INT:
shannon.woods%transgaming.com@gtempaccount.com1ab57be2013-04-13 03:38:39 +00006197 case GL_INT_2_10_10_10_REV:
6198 case GL_UNSIGNED_INT_2_10_10_10_REV:
shannon.woods%transgaming.com@gtempaccount.com1a4e09a2013-04-13 03:33:30 +00006199 if (context && context->getClientVersion() < 3)
6200 {
6201 return gl::error(GL_INVALID_ENUM);
6202 }
6203 else
6204 {
6205 break;
6206 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006207 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006208 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006209 }
6210
6211 if (stride < 0)
6212 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006213 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006214 }
6215
shannon.woods%transgaming.com@gtempaccount.com1ab57be2013-04-13 03:38:39 +00006216 if ((type == GL_INT_2_10_10_10_REV || type == GL_UNSIGNED_INT_2_10_10_10_REV) && size != 4)
6217 {
6218 return gl::error(GL_INVALID_OPERATION);
6219 }
6220
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006221 if (context)
6222 {
Jamie Madilld8db8662013-07-02 11:57:04 -04006223 // [OpenGL ES 3.0.2] Section 2.8 page 24:
6224 // An INVALID_OPERATION error is generated when a non-zero vertex array object
6225 // is bound, zero is bound to the ARRAY_BUFFER buffer object binding point,
6226 // and the pointer argument is not NULL.
6227 if (context->getVertexArrayHandle() != 0 && context->getArrayBufferHandle() == 0 && ptr != NULL)
6228 {
6229 return gl::error(GL_INVALID_OPERATION);
6230 }
6231
shannon.woods%transgaming.com@gtempaccount.com8de4e6a2013-04-13 03:37:44 +00006232 context->setVertexAttribState(index, context->getArrayBuffer(), size, type,
6233 normalized == GL_TRUE, false, stride, ptr);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006234 }
6235 }
6236 catch(std::bad_alloc&)
6237 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006238 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006239 }
6240}
6241
6242void __stdcall glViewport(GLint x, GLint y, GLsizei width, GLsizei height)
6243{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006244 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 +00006245
6246 try
6247 {
6248 if (width < 0 || height < 0)
6249 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006250 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006251 }
6252
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006253 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006254
6255 if (context)
6256 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00006257 context->setViewportParams(x, y, width, height);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006258 }
6259 }
6260 catch(std::bad_alloc&)
6261 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006262 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006263 }
6264}
6265
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006266// OpenGL ES 3.0 functions
6267
6268void __stdcall glReadBuffer(GLenum mode)
6269{
6270 EVENT("(GLenum mode = 0x%X)", mode);
6271
6272 try
6273 {
6274 gl::Context *context = gl::getNonLostContext();
6275
6276 if (context)
6277 {
6278 if (context->getClientVersion() < 3)
6279 {
6280 return gl::error(GL_INVALID_OPERATION);
6281 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006282
Jamie Madill54133512013-06-21 09:33:07 -04006283 // glReadBuffer
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006284 UNIMPLEMENTED();
6285 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006286 }
6287 catch(std::bad_alloc&)
6288 {
6289 return gl::error(GL_OUT_OF_MEMORY);
6290 }
6291}
6292
6293void __stdcall glDrawRangeElements(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid* indices)
6294{
6295 EVENT("(GLenum mode = 0x%X, GLuint start = %u, GLuint end = %u, GLsizei count = %d, GLenum type = 0x%X, "
6296 "const GLvoid* indices = 0x%0.8p)", mode, start, end, count, type, indices);
6297
6298 try
6299 {
6300 gl::Context *context = gl::getNonLostContext();
6301
6302 if (context)
6303 {
6304 if (context->getClientVersion() < 3)
6305 {
6306 return gl::error(GL_INVALID_OPERATION);
6307 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006308
Jamie Madill54133512013-06-21 09:33:07 -04006309 // glDrawRangeElements
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006310 UNIMPLEMENTED();
6311 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006312 }
6313 catch(std::bad_alloc&)
6314 {
6315 return gl::error(GL_OUT_OF_MEMORY);
6316 }
6317}
6318
6319void __stdcall glTexImage3D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid* pixels)
6320{
6321 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint internalformat = %d, GLsizei width = %d, "
6322 "GLsizei height = %d, GLsizei depth = %d, GLint border = %d, GLenum format = 0x%X, "
6323 "GLenum type = 0x%X, const GLvoid* pixels = 0x%0.8p)",
6324 target, level, internalformat, width, height, depth, border, format, type, pixels);
6325
6326 try
6327 {
6328 gl::Context *context = gl::getNonLostContext();
6329
6330 if (context)
6331 {
6332 if (context->getClientVersion() < 3)
6333 {
6334 return gl::error(GL_INVALID_OPERATION);
6335 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006336
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006337 // validateES3TexImageFormat sets the error code if there is an error
Geoff Lang34dbb6f2013-08-05 15:05:47 -04006338 if (!ValidateES3TexImageParameters(context, target, level, internalformat, false, false,
Jamie Madillefb2a6f2013-09-24 10:22:42 -04006339 0, 0, 0, width, height, depth, border, format, type, pixels))
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006340 {
6341 return;
6342 }
6343
6344 switch(target)
6345 {
6346 case GL_TEXTURE_3D:
6347 {
6348 gl::Texture3D *texture = context->getTexture3D();
Jamie Madill88f18f42013-09-18 14:36:19 -04006349 texture->setImage(level, width, height, depth, internalformat, format, type, context->getUnpackState(), pixels);
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006350 }
6351 break;
6352
6353 case GL_TEXTURE_2D_ARRAY:
shannon.woods%transgaming.com@gtempaccount.com14e8f592013-04-13 03:46:21 +00006354 {
6355 gl::Texture2DArray *texture = context->getTexture2DArray();
Jamie Madill88f18f42013-09-18 14:36:19 -04006356 texture->setImage(level, width, height, depth, internalformat, format, type, context->getUnpackState(), pixels);
shannon.woods%transgaming.com@gtempaccount.com14e8f592013-04-13 03:46:21 +00006357 }
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006358 break;
6359
6360 default:
6361 return gl::error(GL_INVALID_ENUM);
6362 }
6363 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006364 }
6365 catch(std::bad_alloc&)
6366 {
6367 return gl::error(GL_OUT_OF_MEMORY);
6368 }
6369}
6370
6371void __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)
6372{
6373 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
6374 "GLint zoffset = %d, GLsizei width = %d, GLsizei height = %d, GLsizei depth = %d, "
6375 "GLenum format = 0x%X, GLenum type = 0x%X, const GLvoid* pixels = 0x%0.8p)",
6376 target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels);
6377
6378 try
6379 {
6380 gl::Context *context = gl::getNonLostContext();
6381
6382 if (context)
6383 {
6384 if (context->getClientVersion() < 3)
6385 {
6386 return gl::error(GL_INVALID_OPERATION);
6387 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006388
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006389 if (!pixels)
6390 {
6391 return gl::error(GL_INVALID_VALUE);
6392 }
6393
6394 // validateES3TexImageFormat sets the error code if there is an error
Geoff Lang34dbb6f2013-08-05 15:05:47 -04006395 if (!ValidateES3TexImageParameters(context, target, level, GL_NONE, false, true,
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006396 xoffset, yoffset, zoffset, width, height, depth, 0,
Jamie Madillefb2a6f2013-09-24 10:22:42 -04006397 format, type, pixels))
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006398 {
6399 return;
6400 }
6401
6402 switch(target)
6403 {
6404 case GL_TEXTURE_3D:
6405 {
6406 gl::Texture3D *texture = context->getTexture3D();
Jamie Madill88f18f42013-09-18 14:36:19 -04006407 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 +00006408 }
6409 break;
6410
6411 case GL_TEXTURE_2D_ARRAY:
shannon.woods%transgaming.com@gtempaccount.com14e8f592013-04-13 03:46:21 +00006412 {
6413 gl::Texture2DArray *texture = context->getTexture2DArray();
Jamie Madill88f18f42013-09-18 14:36:19 -04006414 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 +00006415 }
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006416 break;
6417
6418 default:
6419 return gl::error(GL_INVALID_ENUM);
6420 }
6421 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006422 }
6423 catch(std::bad_alloc&)
6424 {
6425 return gl::error(GL_OUT_OF_MEMORY);
6426 }
6427}
6428
6429void __stdcall glCopyTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height)
6430{
6431 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
6432 "GLint zoffset = %d, GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d)",
6433 target, level, xoffset, yoffset, zoffset, x, y, width, height);
6434
6435 try
6436 {
6437 gl::Context *context = gl::getNonLostContext();
6438
6439 if (context)
6440 {
6441 if (context->getClientVersion() < 3)
6442 {
6443 return gl::error(GL_INVALID_OPERATION);
6444 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006445
Geoff Lang34dbb6f2013-08-05 15:05:47 -04006446 if (!ValidateES3CopyTexImageParameters(context, target, level, GL_NONE, false, xoffset, yoffset, zoffset,
shannonwoods@chromium.org6cf2b0e2013-05-30 00:13:36 +00006447 x, y, width, height, 0))
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006448 {
6449 return;
6450 }
6451
6452 gl::Framebuffer *framebuffer = context->getReadFramebuffer();
6453 gl::Texture *texture = NULL;
6454 switch (target)
6455 {
6456 case GL_TEXTURE_3D:
6457 texture = context->getTexture3D();
6458 break;
6459
6460 case GL_TEXTURE_2D_ARRAY:
shannon.woods%transgaming.com@gtempaccount.com14e8f592013-04-13 03:46:21 +00006461 texture = context->getTexture2DArray();
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006462 break;
6463
6464 default:
6465 return gl::error(GL_INVALID_ENUM);
6466 }
6467
6468 texture->copySubImage(target, level, xoffset, yoffset, zoffset, x, y, width, height, framebuffer);
6469 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006470 }
6471 catch(std::bad_alloc&)
6472 {
6473 return gl::error(GL_OUT_OF_MEMORY);
6474 }
6475}
6476
6477void __stdcall glCompressedTexImage3D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid* data)
6478{
6479 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint internalformat = %d, GLsizei width = %d, "
6480 "GLsizei height = %d, GLsizei depth = %d, GLint border = %d, GLsizei imageSize = %d, "
6481 "const GLvoid* data = 0x%0.8p)",
6482 target, level, internalformat, width, height, depth, border, imageSize, data);
6483
6484 try
6485 {
6486 gl::Context *context = gl::getNonLostContext();
6487
6488 if (context)
6489 {
6490 if (context->getClientVersion() < 3)
6491 {
6492 return gl::error(GL_INVALID_OPERATION);
6493 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006494
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +00006495 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 +00006496 {
6497 return gl::error(GL_INVALID_VALUE);
6498 }
6499
6500 // validateES3TexImageFormat sets the error code if there is an error
Geoff Lang34dbb6f2013-08-05 15:05:47 -04006501 if (!ValidateES3TexImageParameters(context, target, level, internalformat, true, false,
Jamie Madillefb2a6f2013-09-24 10:22:42 -04006502 0, 0, 0, width, height, depth, border, GL_NONE, GL_NONE, data))
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006503 {
6504 return;
6505 }
6506
6507 switch(target)
6508 {
6509 case GL_TEXTURE_3D:
6510 {
6511 gl::Texture3D *texture = context->getTexture3D();
6512 texture->setCompressedImage(level, internalformat, width, height, depth, imageSize, data);
6513 }
6514 break;
6515
6516 case GL_TEXTURE_2D_ARRAY:
shannon.woods%transgaming.com@gtempaccount.com14e8f592013-04-13 03:46:21 +00006517 {
6518 gl::Texture2DArray *texture = context->getTexture2DArray();
6519 texture->setCompressedImage(level, internalformat, width, height, depth, imageSize, data);
6520 }
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006521 break;
6522
6523 default:
6524 return gl::error(GL_INVALID_ENUM);
6525 }
6526 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006527 }
6528 catch(std::bad_alloc&)
6529 {
6530 return gl::error(GL_OUT_OF_MEMORY);
6531 }
6532}
6533
6534void __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)
6535{
6536 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
6537 "GLint zoffset = %d, GLsizei width = %d, GLsizei height = %d, GLsizei depth = %d, "
6538 "GLenum format = 0x%X, GLsizei imageSize = %d, const GLvoid* data = 0x%0.8p)",
6539 target, level, xoffset, yoffset, zoffset, width, height, depth, format, imageSize, data);
6540
6541 try
6542 {
6543 gl::Context *context = gl::getNonLostContext();
6544
6545 if (context)
6546 {
6547 if (context->getClientVersion() < 3)
6548 {
6549 return gl::error(GL_INVALID_OPERATION);
6550 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006551
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +00006552 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 +00006553 {
6554 return gl::error(GL_INVALID_VALUE);
6555 }
6556
6557 if (!data)
6558 {
6559 return gl::error(GL_INVALID_VALUE);
6560 }
6561
6562 // validateES3TexImageFormat sets the error code if there is an error
Geoff Lang34dbb6f2013-08-05 15:05:47 -04006563 if (!ValidateES3TexImageParameters(context, target, level, GL_NONE, true, true,
Jamie Madillefb2a6f2013-09-24 10:22:42 -04006564 0, 0, 0, width, height, depth, 0, GL_NONE, GL_NONE, data))
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006565 {
6566 return;
6567 }
6568
6569 switch(target)
6570 {
6571 case GL_TEXTURE_3D:
6572 {
6573 gl::Texture3D *texture = context->getTexture3D();
6574 texture->subImageCompressed(level, xoffset, yoffset, zoffset, width, height, depth,
6575 format, imageSize, data);
6576 }
6577 break;
6578
6579 case GL_TEXTURE_2D_ARRAY:
shannon.woods%transgaming.com@gtempaccount.com14e8f592013-04-13 03:46:21 +00006580 {
6581 gl::Texture2DArray *texture = context->getTexture2DArray();
6582 texture->subImageCompressed(level, xoffset, yoffset, zoffset, width, height, depth,
6583 format, imageSize, data);
6584 }
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006585 break;
6586
6587 default:
6588 return gl::error(GL_INVALID_ENUM);
6589 }
6590 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006591 }
6592 catch(std::bad_alloc&)
6593 {
6594 return gl::error(GL_OUT_OF_MEMORY);
6595 }
6596}
6597
6598void __stdcall glGenQueries(GLsizei n, GLuint* ids)
6599{
6600 EVENT("(GLsizei n = %d, GLuint* ids = 0x%0.8p)", n, ids);
6601
6602 try
6603 {
6604 gl::Context *context = gl::getNonLostContext();
6605
6606 if (context)
6607 {
6608 if (context->getClientVersion() < 3)
6609 {
6610 return gl::error(GL_INVALID_OPERATION);
6611 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006612
Jamie Madill3641b4b2013-07-26 12:54:59 -04006613 glGenQueriesEXT(n, ids);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006614 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006615 }
6616 catch(std::bad_alloc&)
6617 {
6618 return gl::error(GL_OUT_OF_MEMORY);
6619 }
6620}
6621
6622void __stdcall glDeleteQueries(GLsizei n, const GLuint* ids)
6623{
6624 EVENT("(GLsizei n = %d, GLuint* ids = 0x%0.8p)", n, ids);
6625
6626 try
6627 {
6628 gl::Context *context = gl::getNonLostContext();
6629
6630 if (context)
6631 {
6632 if (context->getClientVersion() < 3)
6633 {
6634 return gl::error(GL_INVALID_OPERATION);
6635 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006636
Jamie Madill3641b4b2013-07-26 12:54:59 -04006637 glDeleteQueriesEXT(n, ids);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006638 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006639 }
6640 catch(std::bad_alloc&)
6641 {
6642 return gl::error(GL_OUT_OF_MEMORY);
6643 }
6644}
6645
6646GLboolean __stdcall glIsQuery(GLuint id)
6647{
6648 EVENT("(GLuint id = %u)", id);
6649
6650 try
6651 {
6652 gl::Context *context = gl::getNonLostContext();
6653
6654 if (context)
6655 {
6656 if (context->getClientVersion() < 3)
6657 {
6658 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
6659 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006660
Jamie Madill3641b4b2013-07-26 12:54:59 -04006661 // TODO: XFB queries
6662 return glIsQueryEXT(id);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006663 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006664 }
6665 catch(std::bad_alloc&)
6666 {
6667 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
6668 }
6669
6670 return GL_FALSE;
6671}
6672
6673void __stdcall glBeginQuery(GLenum target, GLuint id)
6674{
6675 EVENT("(GLenum target = 0x%X, GLuint id = %u)", target, id);
6676
6677 try
6678 {
6679 gl::Context *context = gl::getNonLostContext();
6680
6681 if (context)
6682 {
6683 if (context->getClientVersion() < 3)
6684 {
6685 return gl::error(GL_INVALID_OPERATION);
6686 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006687
Jamie Madill3641b4b2013-07-26 12:54:59 -04006688 switch (target)
6689 {
6690 case GL_ANY_SAMPLES_PASSED:
6691 case GL_ANY_SAMPLES_PASSED_CONSERVATIVE:
6692 case GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN:
6693 break;
6694 default:
6695 return gl::error(GL_INVALID_ENUM);
6696 }
6697
6698 if (id == 0)
6699 {
6700 return gl::error(GL_INVALID_OPERATION);
6701 }
6702
6703 if (target == GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN)
6704 {
6705 // TODO: XFB queries
6706 UNIMPLEMENTED();
6707 }
6708 else
6709 {
6710 context->beginQuery(target, id);
6711 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006712 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006713 }
6714 catch(std::bad_alloc&)
6715 {
6716 return gl::error(GL_OUT_OF_MEMORY);
6717 }
6718}
6719
6720void __stdcall glEndQuery(GLenum target)
6721{
6722 EVENT("(GLenum target = 0x%X)", target);
6723
6724 try
6725 {
6726 gl::Context *context = gl::getNonLostContext();
6727
6728 if (context)
6729 {
6730 if (context->getClientVersion() < 3)
6731 {
6732 return gl::error(GL_INVALID_OPERATION);
6733 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006734
Jamie Madill3641b4b2013-07-26 12:54:59 -04006735 if (target == GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN)
6736 {
6737 // TODO: XFB queries
6738 UNIMPLEMENTED();
6739 }
6740 else
6741 {
6742 glEndQueryEXT(target);
6743 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006744 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006745 }
6746 catch(std::bad_alloc&)
6747 {
6748 return gl::error(GL_OUT_OF_MEMORY);
6749 }
6750}
6751
6752void __stdcall glGetQueryiv(GLenum target, GLenum pname, GLint* params)
6753{
6754 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLint* params = 0x%0.8p)", target, pname, params);
6755
6756 try
6757 {
6758 gl::Context *context = gl::getNonLostContext();
6759
6760 if (context)
6761 {
6762 if (context->getClientVersion() < 3)
6763 {
6764 return gl::error(GL_INVALID_OPERATION);
6765 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006766
Jamie Madill3641b4b2013-07-26 12:54:59 -04006767 if (target == GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN)
6768 {
6769 // TODO: XFB queries
6770 UNIMPLEMENTED();
6771 }
6772 else
6773 {
6774 glGetQueryivEXT(target, pname, params);
6775 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006776 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006777 }
6778 catch(std::bad_alloc&)
6779 {
6780 return gl::error(GL_OUT_OF_MEMORY);
6781 }
6782}
6783
6784void __stdcall glGetQueryObjectuiv(GLuint id, GLenum pname, GLuint* params)
6785{
6786 EVENT("(GLuint id = %u, GLenum pname = 0x%X, GLint* params = 0x%0.8p)", id, pname, params);
6787
6788 try
6789 {
6790 gl::Context *context = gl::getNonLostContext();
6791
6792 if (context)
6793 {
6794 if (context->getClientVersion() < 3)
6795 {
6796 return gl::error(GL_INVALID_OPERATION);
6797 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006798
Jamie Madill3641b4b2013-07-26 12:54:59 -04006799 // TODO: XFB queries
6800 glGetQueryObjectuivEXT(id, pname, params);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006801 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006802 }
6803 catch(std::bad_alloc&)
6804 {
6805 return gl::error(GL_OUT_OF_MEMORY);
6806 }
6807}
6808
6809GLboolean __stdcall glUnmapBuffer(GLenum target)
6810{
6811 EVENT("(GLenum target = 0x%X)", target);
6812
6813 try
6814 {
6815 gl::Context *context = gl::getNonLostContext();
6816
6817 if (context)
6818 {
6819 if (context->getClientVersion() < 3)
6820 {
6821 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
6822 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006823
Jamie Madill54133512013-06-21 09:33:07 -04006824 // glUnmapBuffer
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006825 UNIMPLEMENTED();
6826 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006827 }
6828 catch(std::bad_alloc&)
6829 {
6830 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
6831 }
6832
6833 return GL_FALSE;
6834}
6835
6836void __stdcall glGetBufferPointerv(GLenum target, GLenum pname, GLvoid** params)
6837{
6838 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLvoid** params = 0x%0.8p)", target, pname, params);
6839
6840 try
6841 {
6842 gl::Context *context = gl::getNonLostContext();
6843
6844 if (context)
6845 {
6846 if (context->getClientVersion() < 3)
6847 {
6848 return gl::error(GL_INVALID_OPERATION);
6849 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006850
Jamie Madill54133512013-06-21 09:33:07 -04006851 // glGetBufferPointerv
shannonwoods@chromium.org2d2190a2013-05-30 00:17:35 +00006852 UNIMPLEMENTED();
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006853 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006854 }
6855 catch(std::bad_alloc&)
6856 {
6857 return gl::error(GL_OUT_OF_MEMORY);
6858 }
6859}
6860
6861void __stdcall glDrawBuffers(GLsizei n, const GLenum* bufs)
6862{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006863 try
6864 {
6865 gl::Context *context = gl::getNonLostContext();
6866
6867 if (context)
6868 {
6869 if (context->getClientVersion() < 3)
6870 {
6871 return gl::error(GL_INVALID_OPERATION);
6872 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006873
shannon.woods%transgaming.com@gtempaccount.com7948c5f2013-04-13 03:38:58 +00006874 glDrawBuffersEXT(n, bufs);
6875 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006876 }
6877 catch(std::bad_alloc&)
6878 {
6879 return gl::error(GL_OUT_OF_MEMORY);
6880 }
6881}
6882
6883void __stdcall glUniformMatrix2x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
6884{
6885 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
6886 location, count, transpose, value);
6887
6888 try
6889 {
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006890 if (count < 0)
6891 {
6892 return gl::error(GL_INVALID_VALUE);
6893 }
6894
6895 if (location == -1)
6896 {
6897 return;
6898 }
6899
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006900 gl::Context *context = gl::getNonLostContext();
6901
6902 if (context)
6903 {
6904 if (context->getClientVersion() < 3)
6905 {
6906 return gl::error(GL_INVALID_OPERATION);
6907 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006908
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006909 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
6910 if (!programBinary)
6911 {
6912 return gl::error(GL_INVALID_OPERATION);
6913 }
6914
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00006915 if (!programBinary->setUniformMatrix2x3fv(location, count, transpose, value))
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006916 {
6917 return gl::error(GL_INVALID_OPERATION);
6918 }
6919 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006920 }
6921 catch(std::bad_alloc&)
6922 {
6923 return gl::error(GL_OUT_OF_MEMORY);
6924 }
6925}
6926
6927void __stdcall glUniformMatrix3x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
6928{
6929 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
6930 location, count, transpose, value);
6931
6932 try
6933 {
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006934 if (count < 0)
6935 {
6936 return gl::error(GL_INVALID_VALUE);
6937 }
6938
6939 if (location == -1)
6940 {
6941 return;
6942 }
6943
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006944 gl::Context *context = gl::getNonLostContext();
6945
6946 if (context)
6947 {
6948 if (context->getClientVersion() < 3)
6949 {
6950 return gl::error(GL_INVALID_OPERATION);
6951 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006952
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006953 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
6954 if (!programBinary)
6955 {
6956 return gl::error(GL_INVALID_OPERATION);
6957 }
6958
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00006959 if (!programBinary->setUniformMatrix3x2fv(location, count, transpose, value))
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006960 {
6961 return gl::error(GL_INVALID_OPERATION);
6962 }
6963 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006964 }
6965 catch(std::bad_alloc&)
6966 {
6967 return gl::error(GL_OUT_OF_MEMORY);
6968 }
6969}
6970
6971void __stdcall glUniformMatrix2x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
6972{
6973 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
6974 location, count, transpose, value);
6975
6976 try
6977 {
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006978 if (count < 0)
6979 {
6980 return gl::error(GL_INVALID_VALUE);
6981 }
6982
6983 if (location == -1)
6984 {
6985 return;
6986 }
6987
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006988 gl::Context *context = gl::getNonLostContext();
6989
6990 if (context)
6991 {
6992 if (context->getClientVersion() < 3)
6993 {
6994 return gl::error(GL_INVALID_OPERATION);
6995 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006996
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006997 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
6998 if (!programBinary)
6999 {
7000 return gl::error(GL_INVALID_OPERATION);
7001 }
7002
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00007003 if (!programBinary->setUniformMatrix2x4fv(location, count, transpose, value))
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00007004 {
7005 return gl::error(GL_INVALID_OPERATION);
7006 }
7007 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007008 }
7009 catch(std::bad_alloc&)
7010 {
7011 return gl::error(GL_OUT_OF_MEMORY);
7012 }
7013}
7014
7015void __stdcall glUniformMatrix4x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
7016{
7017 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
7018 location, count, transpose, value);
7019
7020 try
7021 {
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00007022 if (count < 0)
7023 {
7024 return gl::error(GL_INVALID_VALUE);
7025 }
7026
7027 if (location == -1)
7028 {
7029 return;
7030 }
7031
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007032 gl::Context *context = gl::getNonLostContext();
7033
7034 if (context)
7035 {
7036 if (context->getClientVersion() < 3)
7037 {
7038 return gl::error(GL_INVALID_OPERATION);
7039 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007040
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00007041 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
7042 if (!programBinary)
7043 {
7044 return gl::error(GL_INVALID_OPERATION);
7045 }
7046
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00007047 if (!programBinary->setUniformMatrix4x2fv(location, count, transpose, value))
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00007048 {
7049 return gl::error(GL_INVALID_OPERATION);
7050 }
7051 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007052 }
7053 catch(std::bad_alloc&)
7054 {
7055 return gl::error(GL_OUT_OF_MEMORY);
7056 }
7057}
7058
7059void __stdcall glUniformMatrix3x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
7060{
7061 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
7062 location, count, transpose, value);
7063
7064 try
7065 {
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00007066 if (count < 0)
7067 {
7068 return gl::error(GL_INVALID_VALUE);
7069 }
7070
7071 if (location == -1)
7072 {
7073 return;
7074 }
7075
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007076 gl::Context *context = gl::getNonLostContext();
7077
7078 if (context)
7079 {
7080 if (context->getClientVersion() < 3)
7081 {
7082 return gl::error(GL_INVALID_OPERATION);
7083 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007084
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00007085 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
7086 if (!programBinary)
7087 {
7088 return gl::error(GL_INVALID_OPERATION);
7089 }
7090
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00007091 if (!programBinary->setUniformMatrix3x4fv(location, count, transpose, value))
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00007092 {
7093 return gl::error(GL_INVALID_OPERATION);
7094 }
7095 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007096 }
7097 catch(std::bad_alloc&)
7098 {
7099 return gl::error(GL_OUT_OF_MEMORY);
7100 }
7101}
7102
7103void __stdcall glUniformMatrix4x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
7104{
7105 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
7106 location, count, transpose, value);
7107
7108 try
7109 {
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00007110 if (count < 0)
7111 {
7112 return gl::error(GL_INVALID_VALUE);
7113 }
7114
7115 if (location == -1)
7116 {
7117 return;
7118 }
7119
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007120 gl::Context *context = gl::getNonLostContext();
7121
7122 if (context)
7123 {
7124 if (context->getClientVersion() < 3)
7125 {
7126 return gl::error(GL_INVALID_OPERATION);
7127 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007128
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00007129 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
7130 if (!programBinary)
7131 {
7132 return gl::error(GL_INVALID_OPERATION);
7133 }
7134
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00007135 if (!programBinary->setUniformMatrix4x3fv(location, count, transpose, value))
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00007136 {
7137 return gl::error(GL_INVALID_OPERATION);
7138 }
7139 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007140 }
7141 catch(std::bad_alloc&)
7142 {
7143 return gl::error(GL_OUT_OF_MEMORY);
7144 }
7145}
7146
7147void __stdcall glBlitFramebuffer(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter)
7148{
7149 EVENT("(GLint srcX0 = %d, GLint srcY0 = %d, GLint srcX1 = %d, GLint srcY1 = %d, GLint dstX0 = %d, "
7150 "GLint dstY0 = %d, GLint dstX1 = %d, GLint dstY1 = %d, GLbitfield mask = 0x%X, GLenum filter = 0x%X)",
7151 srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter);
7152
7153 try
7154 {
7155 gl::Context *context = gl::getNonLostContext();
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007156 if (context)
7157 {
7158 if (context->getClientVersion() < 3)
7159 {
7160 return gl::error(GL_INVALID_OPERATION);
7161 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007162
Geoff Lang34dbb6f2013-08-05 15:05:47 -04007163 if (!ValidateBlitFramebufferParameters(context, srcX0, srcY0, srcX1, srcY1,
Geoff Lang758d5b22013-06-11 11:42:50 -04007164 dstX0, dstY0, dstX1, dstY1, mask, filter,
7165 false))
7166 {
7167 return;
7168 }
7169
7170 context->blitFramebuffer(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1,
7171 mask, filter);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007172 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007173 }
7174 catch(std::bad_alloc&)
7175 {
7176 return gl::error(GL_OUT_OF_MEMORY);
7177 }
7178}
7179
7180void __stdcall glRenderbufferStorageMultisample(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height)
7181{
7182 EVENT("(GLenum target = 0x%X, GLsizei samples = %d, GLenum internalformat = 0x%X, GLsizei width = %d, GLsizei height = %d)",
7183 target, samples, internalformat, width, height);
7184
7185 try
7186 {
7187 gl::Context *context = gl::getNonLostContext();
7188
7189 if (context)
7190 {
7191 if (context->getClientVersion() < 3)
7192 {
7193 return gl::error(GL_INVALID_OPERATION);
7194 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007195
Geoff Lang34dbb6f2013-08-05 15:05:47 -04007196 if (!ValidateRenderbufferStorageParameters(context, target, samples, internalformat,
Geoff Lang2e1dcd52013-05-29 10:34:08 -04007197 width, height, false))
7198 {
7199 return;
7200 }
7201
7202 context->setRenderbufferStorage(width, height, internalformat, samples);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007203 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007204 }
7205 catch(std::bad_alloc&)
7206 {
7207 return gl::error(GL_OUT_OF_MEMORY);
7208 }
7209}
7210
7211void __stdcall glFramebufferTextureLayer(GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer)
7212{
7213 EVENT("(GLenum target = 0x%X, GLenum attachment = 0x%X, GLuint texture = %u, GLint level = %d, GLint layer = %d)",
7214 target, attachment, texture, level, layer);
7215
7216 try
7217 {
7218 gl::Context *context = gl::getNonLostContext();
7219
7220 if (context)
7221 {
7222 if (context->getClientVersion() < 3)
7223 {
7224 return gl::error(GL_INVALID_OPERATION);
7225 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007226
Geoff Lang34dbb6f2013-08-05 15:05:47 -04007227 if (!ValidateES3FramebufferTextureParameters(context, target, attachment, GL_NONE, texture, level, layer, true))
Geoff Lang3ed0c482013-07-25 17:03:18 -04007228 {
7229 return;
7230 }
7231
7232 gl::Framebuffer *framebuffer = NULL;
7233 if (target == GL_READ_FRAMEBUFFER)
7234 {
7235 framebuffer = context->getReadFramebuffer();
7236 }
7237 else
7238 {
7239 framebuffer = context->getDrawFramebuffer();
7240 }
7241
7242 gl::Texture *textureObject = context->getTexture(texture);
7243 GLenum textarget = textureObject ? textureObject->getTarget() : GL_NONE;
7244
7245 if (attachment >= GL_COLOR_ATTACHMENT0_EXT && attachment <= GL_COLOR_ATTACHMENT15_EXT)
7246 {
7247 const unsigned int colorAttachment = (attachment - GL_COLOR_ATTACHMENT0_EXT);
7248 framebuffer->setColorbuffer(colorAttachment, textarget, texture, level, layer);
7249 }
7250 else
7251 {
7252 switch (attachment)
7253 {
7254 case GL_DEPTH_ATTACHMENT: framebuffer->setDepthbuffer(textarget, texture, level, layer); break;
7255 case GL_STENCIL_ATTACHMENT: framebuffer->setStencilbuffer(textarget, texture, level, layer); break;
7256 case GL_DEPTH_STENCIL_ATTACHMENT: framebuffer->setDepthStencilBuffer(textarget, texture, level, layer); break;
7257 }
7258 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007259 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007260 }
7261 catch(std::bad_alloc&)
7262 {
7263 return gl::error(GL_OUT_OF_MEMORY);
7264 }
7265}
7266
7267GLvoid* __stdcall glMapBufferRange(GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access)
7268{
7269 EVENT("(GLenum target = 0x%X, GLintptr offset = %d, GLsizeiptr length = %d, GLbitfield access = 0x%X)",
7270 target, offset, length, access);
7271
7272 try
7273 {
7274 gl::Context *context = gl::getNonLostContext();
7275
7276 if (context)
7277 {
7278 if (context->getClientVersion() < 3)
7279 {
7280 return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLvoid*>(NULL));
7281 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007282
Jamie Madill54133512013-06-21 09:33:07 -04007283 // glMapBufferRange
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007284 UNIMPLEMENTED();
7285 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007286 }
7287 catch(std::bad_alloc&)
7288 {
7289 return gl::error(GL_OUT_OF_MEMORY, reinterpret_cast<GLvoid*>(NULL));
7290 }
7291
7292 return NULL;
7293}
7294
7295void __stdcall glFlushMappedBufferRange(GLenum target, GLintptr offset, GLsizeiptr length)
7296{
7297 EVENT("(GLenum target = 0x%X, GLintptr offset = %d, GLsizeiptr length = %d)", target, offset, length);
7298
7299 try
7300 {
7301 gl::Context *context = gl::getNonLostContext();
7302
7303 if (context)
7304 {
7305 if (context->getClientVersion() < 3)
7306 {
7307 return gl::error(GL_INVALID_OPERATION);
7308 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007309
Jamie Madill54133512013-06-21 09:33:07 -04007310 // glFlushMappedBufferRange
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007311 UNIMPLEMENTED();
7312 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007313 }
7314 catch(std::bad_alloc&)
7315 {
7316 return gl::error(GL_OUT_OF_MEMORY);
7317 }
7318}
7319
7320void __stdcall glBindVertexArray(GLuint array)
7321{
7322 EVENT("(GLuint array = %u)", array);
7323
7324 try
7325 {
7326 gl::Context *context = gl::getNonLostContext();
7327
7328 if (context)
7329 {
7330 if (context->getClientVersion() < 3)
7331 {
7332 return gl::error(GL_INVALID_OPERATION);
7333 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007334
Jamie Madilld1028542013-07-02 11:57:04 -04007335 gl::VertexArray *vao = context->getVertexArray(array);
7336
7337 if (!vao)
7338 {
7339 // The default VAO should always exist
7340 ASSERT(array != 0);
7341 return gl::error(GL_INVALID_OPERATION);
7342 }
7343
7344 context->bindVertexArray(array);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007345 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007346 }
7347 catch(std::bad_alloc&)
7348 {
7349 return gl::error(GL_OUT_OF_MEMORY);
7350 }
7351}
7352
7353void __stdcall glDeleteVertexArrays(GLsizei n, const GLuint* arrays)
7354{
7355 EVENT("(GLsizei n = %d, const GLuint* arrays = 0x%0.8p)", n, arrays);
7356
7357 try
7358 {
7359 gl::Context *context = gl::getNonLostContext();
7360
7361 if (context)
7362 {
7363 if (context->getClientVersion() < 3)
7364 {
7365 return gl::error(GL_INVALID_OPERATION);
7366 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007367
Jamie Madilld1028542013-07-02 11:57:04 -04007368 if (n < 0)
7369 {
7370 return gl::error(GL_INVALID_VALUE);
7371 }
7372
7373 for (int arrayIndex = 0; arrayIndex < n; arrayIndex++)
7374 {
7375 if (arrays[arrayIndex] != 0)
7376 {
7377 context->deleteVertexArray(arrays[arrayIndex]);
7378 }
7379 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007380 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007381 }
7382 catch(std::bad_alloc&)
7383 {
7384 return gl::error(GL_OUT_OF_MEMORY);
7385 }
7386}
7387
7388void __stdcall glGenVertexArrays(GLsizei n, GLuint* arrays)
7389{
7390 EVENT("(GLsizei n = %d, GLuint* arrays = 0x%0.8p)", n, arrays);
7391
7392 try
7393 {
7394 gl::Context *context = gl::getNonLostContext();
7395
7396 if (context)
7397 {
7398 if (context->getClientVersion() < 3)
7399 {
7400 return gl::error(GL_INVALID_OPERATION);
7401 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007402
Jamie Madilld1028542013-07-02 11:57:04 -04007403 if (n < 0)
7404 {
7405 return gl::error(GL_INVALID_VALUE);
7406 }
7407
7408 for (int arrayIndex = 0; arrayIndex < n; arrayIndex++)
7409 {
7410 arrays[arrayIndex] = context->createVertexArray();
7411 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007412 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007413 }
7414 catch(std::bad_alloc&)
7415 {
7416 return gl::error(GL_OUT_OF_MEMORY);
7417 }
7418}
7419
7420GLboolean __stdcall glIsVertexArray(GLuint array)
7421{
7422 EVENT("(GLuint array = %u)", array);
7423
7424 try
7425 {
7426 gl::Context *context = gl::getNonLostContext();
7427
7428 if (context)
7429 {
7430 if (context->getClientVersion() < 3)
7431 {
7432 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
7433 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007434
Jamie Madilld1028542013-07-02 11:57:04 -04007435 if (array == 0)
7436 {
7437 return GL_FALSE;
7438 }
7439
7440 gl::VertexArray *vao = context->getVertexArray(array);
7441
7442 return (vao != NULL ? GL_TRUE : GL_FALSE);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007443 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007444 }
7445 catch(std::bad_alloc&)
7446 {
7447 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
7448 }
7449
7450 return GL_FALSE;
7451}
7452
7453void __stdcall glGetIntegeri_v(GLenum target, GLuint index, GLint* data)
7454{
7455 EVENT("(GLenum target = 0x%X, GLuint index = %u, GLint* data = 0x%0.8p)",
7456 target, index, data);
7457
7458 try
7459 {
7460 gl::Context *context = gl::getNonLostContext();
7461
7462 if (context)
7463 {
7464 if (context->getClientVersion() < 3)
7465 {
7466 return gl::error(GL_INVALID_OPERATION);
7467 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007468
Shannon Woods15934d52013-08-19 14:28:49 -04007469 switch (target)
7470 {
7471 case GL_TRANSFORM_FEEDBACK_BUFFER_START:
7472 case GL_TRANSFORM_FEEDBACK_BUFFER_SIZE:
7473 case GL_TRANSFORM_FEEDBACK_BUFFER_BINDING:
7474 if (index >= context->getMaxTransformFeedbackBufferBindings())
7475 return gl::error(GL_INVALID_VALUE);
7476 break;
7477 case GL_UNIFORM_BUFFER_START:
7478 case GL_UNIFORM_BUFFER_SIZE:
7479 case GL_UNIFORM_BUFFER_BINDING:
7480 if (index >= context->getMaximumCombinedUniformBufferBindings())
7481 return gl::error(GL_INVALID_VALUE);
7482 break;
7483 default:
7484 return gl::error(GL_INVALID_ENUM);
7485 }
7486
7487 if (!(context->getIndexedIntegerv(target, index, data)))
7488 {
7489 GLenum nativeType;
7490 unsigned int numParams = 0;
7491 if (!context->getIndexedQueryParameterInfo(target, &nativeType, &numParams))
7492 return gl::error(GL_INVALID_ENUM);
7493
7494 if (numParams == 0)
7495 return; // it is known that pname is valid, but there are no parameters to return
7496
7497 if (nativeType == GL_INT_64_ANGLEX)
7498 {
7499 GLint64 minIntValue = static_cast<GLint64>(std::numeric_limits<int>::min());
7500 GLint64 maxIntValue = static_cast<GLint64>(std::numeric_limits<int>::max());
7501 GLint64 *int64Params = new GLint64[numParams];
7502
7503 context->getIndexedInteger64v(target, index, int64Params);
7504
7505 for (unsigned int i = 0; i < numParams; ++i)
7506 {
7507 GLint64 clampedValue = std::max(std::min(int64Params[i], maxIntValue), minIntValue);
7508 data[i] = static_cast<GLint>(clampedValue);
7509 }
7510
7511 delete [] int64Params;
7512 }
7513 else
7514 {
7515 UNREACHABLE();
7516 }
7517 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007518 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007519 }
7520 catch(std::bad_alloc&)
7521 {
7522 return gl::error(GL_OUT_OF_MEMORY);
7523 }
7524}
7525
7526void __stdcall glBeginTransformFeedback(GLenum primitiveMode)
7527{
7528 EVENT("(GLenum primitiveMode = 0x%X)", primitiveMode);
7529
7530 try
7531 {
7532 gl::Context *context = gl::getNonLostContext();
7533
7534 if (context)
7535 {
7536 if (context->getClientVersion() < 3)
7537 {
7538 return gl::error(GL_INVALID_OPERATION);
7539 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007540
Jamie Madill54133512013-06-21 09:33:07 -04007541 // glBeginTransformFeedback
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007542 UNIMPLEMENTED();
7543 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007544 }
7545 catch(std::bad_alloc&)
7546 {
7547 return gl::error(GL_OUT_OF_MEMORY);
7548 }
7549}
7550
7551void __stdcall glEndTransformFeedback(void)
7552{
7553 EVENT("(void)");
7554
7555 try
7556 {
7557 gl::Context *context = gl::getNonLostContext();
7558
7559 if (context)
7560 {
7561 if (context->getClientVersion() < 3)
7562 {
7563 return gl::error(GL_INVALID_OPERATION);
7564 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007565
Jamie Madill54133512013-06-21 09:33:07 -04007566 // glEndTransformFeedback
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007567 UNIMPLEMENTED();
7568 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007569 }
7570 catch(std::bad_alloc&)
7571 {
7572 return gl::error(GL_OUT_OF_MEMORY);
7573 }
7574}
7575
7576void __stdcall glBindBufferRange(GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size)
7577{
7578 EVENT("(GLenum target = 0x%X, GLuint index = %u, GLuint buffer = %u, GLintptr offset = %d, GLsizeiptr size = %d)",
7579 target, index, buffer, offset, size);
7580
7581 try
7582 {
7583 gl::Context *context = gl::getNonLostContext();
7584
7585 if (context)
7586 {
7587 if (context->getClientVersion() < 3)
7588 {
7589 return gl::error(GL_INVALID_OPERATION);
7590 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007591
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007592 switch (target)
7593 {
7594 case GL_TRANSFORM_FEEDBACK_BUFFER:
shannonwoods@chromium.orgd11158f2013-05-30 00:06:19 +00007595 if (index >= context->getMaxTransformFeedbackBufferBindings())
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007596 {
7597 return gl::error(GL_INVALID_VALUE);
7598 }
7599 break;
7600
7601 case GL_UNIFORM_BUFFER:
7602 if (index >= context->getMaximumCombinedUniformBufferBindings())
7603 {
7604 return gl::error(GL_INVALID_VALUE);
7605 }
7606 break;
7607
7608 default:
7609 return gl::error(GL_INVALID_ENUM);
7610 }
7611
shannonwoods@chromium.orge6e00792013-05-30 00:06:07 +00007612 if (buffer != 0 && size <= 0)
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007613 {
7614 return gl::error(GL_INVALID_VALUE);
7615 }
7616
7617 switch (target)
7618 {
7619 case GL_TRANSFORM_FEEDBACK_BUFFER:
shannonwoods@chromium.orga26aeaf2013-05-30 00:06:13 +00007620
7621 // size and offset must be a multiple of 4
7622 if (buffer != 0 && ((offset % 4) != 0 || (size % 4) != 0))
7623 {
7624 return gl::error(GL_INVALID_VALUE);
7625 }
7626
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +00007627 context->bindIndexedTransformFeedbackBuffer(buffer, index, offset, size);
7628 context->bindGenericTransformFeedbackBuffer(buffer);
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007629 break;
7630
7631 case GL_UNIFORM_BUFFER:
shannonwoods@chromium.org97c3d502013-05-30 00:04:34 +00007632
7633 // it is an error to bind an offset not a multiple of the alignment
7634 if (buffer != 0 && (offset % context->getUniformBufferOffsetAlignment()) != 0)
7635 {
7636 return gl::error(GL_INVALID_VALUE);
7637 }
7638
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +00007639 context->bindIndexedUniformBuffer(buffer, index, offset, size);
7640 context->bindGenericUniformBuffer(buffer);
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007641 break;
7642
7643 default:
7644 UNREACHABLE();
7645 }
7646 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007647 }
7648 catch(std::bad_alloc&)
7649 {
7650 return gl::error(GL_OUT_OF_MEMORY);
7651 }
7652}
7653
7654void __stdcall glBindBufferBase(GLenum target, GLuint index, GLuint buffer)
7655{
7656 EVENT("(GLenum target = 0x%X, GLuint index = %u, GLuint buffer = %u)",
7657 target, index, buffer);
7658
7659 try
7660 {
7661 gl::Context *context = gl::getNonLostContext();
7662
7663 if (context)
7664 {
7665 if (context->getClientVersion() < 3)
7666 {
7667 return gl::error(GL_INVALID_OPERATION);
7668 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007669
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007670 switch (target)
7671 {
7672 case GL_TRANSFORM_FEEDBACK_BUFFER:
shannonwoods@chromium.orgd11158f2013-05-30 00:06:19 +00007673 if (index >= context->getMaxTransformFeedbackBufferBindings())
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007674 {
7675 return gl::error(GL_INVALID_VALUE);
7676 }
7677 break;
7678
7679 case GL_UNIFORM_BUFFER:
shannonwoods@chromium.orgd11158f2013-05-30 00:06:19 +00007680 if (index >= context->getMaximumCombinedUniformBufferBindings())
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007681 {
7682 return gl::error(GL_INVALID_VALUE);
7683 }
7684 break;
7685
7686 default:
7687 return gl::error(GL_INVALID_ENUM);
7688 }
7689
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007690 switch (target)
7691 {
7692 case GL_TRANSFORM_FEEDBACK_BUFFER:
shannonwoods@chromium.org3eeca1e2013-05-30 00:04:28 +00007693 context->bindIndexedTransformFeedbackBuffer(buffer, index, 0, 0);
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +00007694 context->bindGenericTransformFeedbackBuffer(buffer);
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007695 break;
7696
7697 case GL_UNIFORM_BUFFER:
shannonwoods@chromium.org3eeca1e2013-05-30 00:04:28 +00007698 context->bindIndexedUniformBuffer(buffer, index, 0, 0);
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +00007699 context->bindGenericUniformBuffer(buffer);
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007700 break;
7701
7702 default:
7703 UNREACHABLE();
7704 }
7705 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007706 }
7707 catch(std::bad_alloc&)
7708 {
7709 return gl::error(GL_OUT_OF_MEMORY);
7710 }
7711}
7712
7713void __stdcall glTransformFeedbackVaryings(GLuint program, GLsizei count, const GLchar* const* varyings, GLenum bufferMode)
7714{
7715 EVENT("(GLuint program = %u, GLsizei count = %d, const GLchar* const* varyings = 0x%0.8p, GLenum bufferMode = 0x%X)",
7716 program, count, varyings, bufferMode);
7717
7718 try
7719 {
7720 gl::Context *context = gl::getNonLostContext();
7721
7722 if (context)
7723 {
7724 if (context->getClientVersion() < 3)
7725 {
7726 return gl::error(GL_INVALID_OPERATION);
7727 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007728
Jamie Madill54133512013-06-21 09:33:07 -04007729 // glTransformFeedbackVaryings
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007730 UNIMPLEMENTED();
7731 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007732 }
7733 catch(std::bad_alloc&)
7734 {
7735 return gl::error(GL_OUT_OF_MEMORY);
7736 }
7737}
7738
7739void __stdcall glGetTransformFeedbackVarying(GLuint program, GLuint index, GLsizei bufSize, GLsizei* length, GLsizei* size, GLenum* type, GLchar* name)
7740{
7741 EVENT("(GLuint program = %u, GLuint index = %u, GLsizei bufSize = %d, GLsizei* length = 0x%0.8p, "
7742 "GLsizei* size = 0x%0.8p, GLenum* type = 0x%0.8p, GLchar* name = 0x%0.8p)",
7743 program, index, bufSize, length, size, type, name);
7744
7745 try
7746 {
7747 gl::Context *context = gl::getNonLostContext();
7748
7749 if (context)
7750 {
7751 if (context->getClientVersion() < 3)
7752 {
7753 return gl::error(GL_INVALID_OPERATION);
7754 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007755
Jamie Madill54133512013-06-21 09:33:07 -04007756 // glGetTransformFeedbackVarying
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007757 UNIMPLEMENTED();
7758 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007759 }
7760 catch(std::bad_alloc&)
7761 {
7762 return gl::error(GL_OUT_OF_MEMORY);
7763 }
7764}
7765
7766void __stdcall glVertexAttribIPointer(GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid* pointer)
7767{
7768 EVENT("(GLuint index = %u, GLint size = %d, GLenum type = 0x%X, GLsizei stride = %d, const GLvoid* pointer = 0x%0.8p)",
7769 index, size, type, stride, pointer);
7770
7771 try
7772 {
7773 gl::Context *context = gl::getNonLostContext();
7774
7775 if (context)
7776 {
7777 if (context->getClientVersion() < 3)
7778 {
7779 return gl::error(GL_INVALID_OPERATION);
7780 }
7781 }
7782
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007783 if (index >= gl::MAX_VERTEX_ATTRIBS)
7784 {
7785 return gl::error(GL_INVALID_VALUE);
7786 }
7787
7788 if (size < 1 || size > 4)
7789 {
7790 return gl::error(GL_INVALID_VALUE);
7791 }
7792
7793 switch (type)
7794 {
7795 case GL_BYTE:
7796 case GL_UNSIGNED_BYTE:
7797 case GL_SHORT:
7798 case GL_UNSIGNED_SHORT:
7799 case GL_INT:
7800 case GL_UNSIGNED_INT:
shannon.woods%transgaming.com@gtempaccount.com1ab57be2013-04-13 03:38:39 +00007801 case GL_INT_2_10_10_10_REV:
7802 case GL_UNSIGNED_INT_2_10_10_10_REV:
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007803 break;
7804 default:
7805 return gl::error(GL_INVALID_ENUM);
7806 }
7807
7808 if (stride < 0)
7809 {
7810 return gl::error(GL_INVALID_VALUE);
7811 }
7812
shannon.woods%transgaming.com@gtempaccount.com1ab57be2013-04-13 03:38:39 +00007813 if ((type == GL_INT_2_10_10_10_REV || type == GL_UNSIGNED_INT_2_10_10_10_REV) && size != 4)
7814 {
7815 return gl::error(GL_INVALID_OPERATION);
7816 }
7817
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007818 if (context)
7819 {
Jamie Madilld8db8662013-07-02 11:57:04 -04007820 // [OpenGL ES 3.0.2] Section 2.8 page 24:
7821 // An INVALID_OPERATION error is generated when a non-zero vertex array object
7822 // is bound, zero is bound to the ARRAY_BUFFER buffer object binding point,
7823 // and the pointer argument is not NULL.
7824 if (context->getVertexArrayHandle() != 0 && context->getArrayBufferHandle() == 0 && pointer != NULL)
7825 {
7826 return gl::error(GL_INVALID_OPERATION);
7827 }
7828
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007829 context->setVertexAttribState(index, context->getArrayBuffer(), size, type, false, true,
7830 stride, pointer);
7831 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007832 }
7833 catch(std::bad_alloc&)
7834 {
7835 return gl::error(GL_OUT_OF_MEMORY);
7836 }
7837}
7838
7839void __stdcall glGetVertexAttribIiv(GLuint index, GLenum pname, GLint* params)
7840{
7841 EVENT("(GLuint index = %u, GLenum pname = 0x%X, GLint* params = 0x%0.8p)",
7842 index, pname, params);
7843
7844 try
7845 {
7846 gl::Context *context = gl::getNonLostContext();
7847
7848 if (context)
7849 {
7850 if (context->getClientVersion() < 3)
7851 {
7852 return gl::error(GL_INVALID_OPERATION);
7853 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007854
Jamie Madilla7d05862013-07-02 11:57:06 -04007855 if (index >= gl::MAX_VERTEX_ATTRIBS)
7856 {
7857 return gl::error(GL_INVALID_VALUE);
7858 }
7859
7860 const gl::VertexAttribute &attribState = context->getVertexAttribState(index);
7861
Geoff Lang34dbb6f2013-08-05 15:05:47 -04007862 if (!gl::ValidateGetVertexAttribParameters(pname, context->getClientVersion()))
Jamie Madilla7d05862013-07-02 11:57:06 -04007863 {
7864 return;
7865 }
7866
7867 if (pname == GL_CURRENT_VERTEX_ATTRIB)
7868 {
7869 const gl::VertexAttribCurrentValueData &currentValueData = context->getVertexAttribCurrentValue(index);
7870 for (int i = 0; i < 4; ++i)
7871 {
7872 params[i] = currentValueData.IntValues[i];
7873 }
7874 }
7875 else
7876 {
7877 *params = attribState.querySingleParameter<GLint>(pname);
7878 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007879 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007880 }
7881 catch(std::bad_alloc&)
7882 {
7883 return gl::error(GL_OUT_OF_MEMORY);
7884 }
7885}
7886
7887void __stdcall glGetVertexAttribIuiv(GLuint index, GLenum pname, GLuint* params)
7888{
7889 EVENT("(GLuint index = %u, GLenum pname = 0x%X, GLuint* params = 0x%0.8p)",
7890 index, pname, params);
7891
7892 try
7893 {
7894 gl::Context *context = gl::getNonLostContext();
7895
7896 if (context)
7897 {
7898 if (context->getClientVersion() < 3)
7899 {
7900 return gl::error(GL_INVALID_OPERATION);
7901 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007902
Jamie Madilla7d05862013-07-02 11:57:06 -04007903 if (index >= gl::MAX_VERTEX_ATTRIBS)
7904 {
7905 return gl::error(GL_INVALID_VALUE);
7906 }
7907
7908 const gl::VertexAttribute &attribState = context->getVertexAttribState(index);
7909
Geoff Lang34dbb6f2013-08-05 15:05:47 -04007910 if (!gl::ValidateGetVertexAttribParameters(pname, context->getClientVersion()))
Jamie Madilla7d05862013-07-02 11:57:06 -04007911 {
7912 return;
7913 }
7914
7915 if (pname == GL_CURRENT_VERTEX_ATTRIB)
7916 {
7917 const gl::VertexAttribCurrentValueData &currentValueData = context->getVertexAttribCurrentValue(index);
7918 for (int i = 0; i < 4; ++i)
7919 {
7920 params[i] = currentValueData.UnsignedIntValues[i];
7921 }
7922 }
7923 else
7924 {
7925 *params = attribState.querySingleParameter<GLuint>(pname);
7926 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007927 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007928 }
7929 catch(std::bad_alloc&)
7930 {
7931 return gl::error(GL_OUT_OF_MEMORY);
7932 }
7933}
7934
7935void __stdcall glVertexAttribI4i(GLuint index, GLint x, GLint y, GLint z, GLint w)
7936{
7937 EVENT("(GLuint index = %u, GLint x = %d, GLint y = %d, GLint z = %d, GLint w = %d)",
7938 index, x, y, z, w);
7939
7940 try
7941 {
7942 gl::Context *context = gl::getNonLostContext();
7943
7944 if (context)
7945 {
7946 if (context->getClientVersion() < 3)
7947 {
7948 return gl::error(GL_INVALID_OPERATION);
7949 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007950
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007951 if (index >= gl::MAX_VERTEX_ATTRIBS)
7952 {
7953 return gl::error(GL_INVALID_VALUE);
7954 }
7955
7956 GLint vals[4] = { x, y, z, w };
7957 context->setVertexAttribi(index, vals);
7958 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007959 }
7960 catch(std::bad_alloc&)
7961 {
7962 return gl::error(GL_OUT_OF_MEMORY);
7963 }
7964}
7965
7966void __stdcall glVertexAttribI4ui(GLuint index, GLuint x, GLuint y, GLuint z, GLuint w)
7967{
7968 EVENT("(GLuint index = %u, GLuint x = %u, GLuint y = %u, GLuint z = %u, GLuint w = %u)",
7969 index, x, y, z, w);
7970
7971 try
7972 {
7973 gl::Context *context = gl::getNonLostContext();
7974
7975 if (context)
7976 {
7977 if (context->getClientVersion() < 3)
7978 {
7979 return gl::error(GL_INVALID_OPERATION);
7980 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007981
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007982 if (index >= gl::MAX_VERTEX_ATTRIBS)
7983 {
7984 return gl::error(GL_INVALID_VALUE);
7985 }
7986
7987 GLuint vals[4] = { x, y, z, w };
7988 context->setVertexAttribu(index, vals);
7989 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007990 }
7991 catch(std::bad_alloc&)
7992 {
7993 return gl::error(GL_OUT_OF_MEMORY);
7994 }
7995}
7996
7997void __stdcall glVertexAttribI4iv(GLuint index, const GLint* v)
7998{
7999 EVENT("(GLuint index = %u, const GLint* v = 0x%0.8p)", index, v);
8000
8001 try
8002 {
8003 gl::Context *context = gl::getNonLostContext();
8004
8005 if (context)
8006 {
8007 if (context->getClientVersion() < 3)
8008 {
8009 return gl::error(GL_INVALID_OPERATION);
8010 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008011
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00008012 if (index >= gl::MAX_VERTEX_ATTRIBS)
8013 {
8014 return gl::error(GL_INVALID_VALUE);
8015 }
8016
8017 context->setVertexAttribi(index, v);
8018 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008019 }
8020 catch(std::bad_alloc&)
8021 {
8022 return gl::error(GL_OUT_OF_MEMORY);
8023 }
8024}
8025
8026void __stdcall glVertexAttribI4uiv(GLuint index, const GLuint* v)
8027{
8028 EVENT("(GLuint index = %u, const GLuint* v = 0x%0.8p)", index, v);
8029
8030 try
8031 {
8032 gl::Context *context = gl::getNonLostContext();
8033
8034 if (context)
8035 {
8036 if (context->getClientVersion() < 3)
8037 {
8038 return gl::error(GL_INVALID_OPERATION);
8039 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008040
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00008041 if (index >= gl::MAX_VERTEX_ATTRIBS)
8042 {
8043 return gl::error(GL_INVALID_VALUE);
8044 }
8045
8046 context->setVertexAttribu(index, v);
8047 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008048 }
8049 catch(std::bad_alloc&)
8050 {
8051 return gl::error(GL_OUT_OF_MEMORY);
8052 }
8053}
8054
8055void __stdcall glGetUniformuiv(GLuint program, GLint location, GLuint* params)
8056{
8057 EVENT("(GLuint program = %u, GLint location = %d, GLuint* params = 0x%0.8p)",
8058 program, location, params);
8059
8060 try
8061 {
8062 gl::Context *context = gl::getNonLostContext();
8063
8064 if (context)
8065 {
8066 if (context->getClientVersion() < 3)
8067 {
8068 return gl::error(GL_INVALID_OPERATION);
8069 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008070
shannon.woods%transgaming.com@gtempaccount.come2290122013-04-13 03:41:07 +00008071 if (program == 0)
8072 {
8073 return gl::error(GL_INVALID_VALUE);
8074 }
8075
8076 gl::Program *programObject = context->getProgram(program);
8077
8078 if (!programObject || !programObject->isLinked())
8079 {
8080 return gl::error(GL_INVALID_OPERATION);
8081 }
8082
8083 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
8084 if (!programBinary)
8085 {
8086 return gl::error(GL_INVALID_OPERATION);
8087 }
8088
8089 if (!programBinary->getUniformuiv(location, NULL, params))
8090 {
8091 return gl::error(GL_INVALID_OPERATION);
8092 }
8093 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008094 }
8095 catch(std::bad_alloc&)
8096 {
8097 return gl::error(GL_OUT_OF_MEMORY);
8098 }
8099}
8100
8101GLint __stdcall glGetFragDataLocation(GLuint program, const GLchar *name)
8102{
8103 EVENT("(GLuint program = %u, const GLchar *name = 0x%0.8p)",
8104 program, name);
8105
8106 try
8107 {
8108 gl::Context *context = gl::getNonLostContext();
8109
8110 if (context)
8111 {
8112 if (context->getClientVersion() < 3)
8113 {
Jamie Madilld1e78c92013-06-20 11:55:50 -04008114 return gl::error(GL_INVALID_OPERATION, -1);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008115 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008116
Jamie Madilld1e78c92013-06-20 11:55:50 -04008117 if (program == 0)
8118 {
8119 return gl::error(GL_INVALID_VALUE, -1);
8120 }
8121
8122 gl::Program *programObject = context->getProgram(program);
8123
8124 if (!programObject || !programObject->isLinked())
8125 {
8126 return gl::error(GL_INVALID_OPERATION, -1);
8127 }
8128
8129 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
8130 if (!programBinary)
8131 {
8132 return gl::error(GL_INVALID_OPERATION, -1);
8133 }
8134
8135 return programBinary->getFragDataLocation(name);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008136 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008137 }
8138 catch(std::bad_alloc&)
8139 {
8140 return gl::error(GL_OUT_OF_MEMORY, 0);
8141 }
8142
8143 return 0;
8144}
8145
8146void __stdcall glUniform1ui(GLint location, GLuint v0)
8147{
shannon.woods%transgaming.com@gtempaccount.com8431b9c2013-04-13 03:40:17 +00008148 glUniform1uiv(location, 1, &v0);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008149}
8150
8151void __stdcall glUniform2ui(GLint location, GLuint v0, GLuint v1)
8152{
shannon.woods%transgaming.com@gtempaccount.com8431b9c2013-04-13 03:40:17 +00008153 const GLuint xy[] = { v0, v1 };
8154 glUniform2uiv(location, 1, xy);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008155}
8156
8157void __stdcall glUniform3ui(GLint location, GLuint v0, GLuint v1, GLuint v2)
8158{
shannon.woods%transgaming.com@gtempaccount.com8431b9c2013-04-13 03:40:17 +00008159 const GLuint xyz[] = { v0, v1, v2 };
8160 glUniform3uiv(location, 1, xyz);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008161}
8162
8163void __stdcall glUniform4ui(GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3)
8164{
shannon.woods%transgaming.com@gtempaccount.com8431b9c2013-04-13 03:40:17 +00008165 const GLuint xyzw[] = { v0, v1, v2, v3 };
8166 glUniform4uiv(location, 1, xyzw);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008167}
8168
8169void __stdcall glUniform1uiv(GLint location, GLsizei count, const GLuint* value)
8170{
8171 EVENT("(GLint location = %d, GLsizei count = %d, const GLuint* value = 0x%0.8p)",
8172 location, count, value);
8173
8174 try
8175 {
8176 gl::Context *context = gl::getNonLostContext();
8177
8178 if (context)
8179 {
8180 if (context->getClientVersion() < 3)
8181 {
8182 return gl::error(GL_INVALID_OPERATION);
8183 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008184
shannon.woods%transgaming.com@gtempaccount.com50ea4ab2013-04-13 03:40:36 +00008185 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
8186 if (!programBinary)
8187 {
8188 return gl::error(GL_INVALID_OPERATION);
8189 }
8190
8191 if (!programBinary->setUniform1uiv(location, count, value))
8192 {
8193 return gl::error(GL_INVALID_OPERATION);
8194 }
8195 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008196 }
8197 catch(std::bad_alloc&)
8198 {
8199 return gl::error(GL_OUT_OF_MEMORY);
8200 }
8201}
8202
8203void __stdcall glUniform2uiv(GLint location, GLsizei count, const GLuint* value)
8204{
8205 EVENT("(GLint location = %d, GLsizei count = %d, const GLuint* value = 0x%0.8p)",
8206 location, count, value);
8207
8208 try
8209 {
8210 gl::Context *context = gl::getNonLostContext();
8211
8212 if (context)
8213 {
8214 if (context->getClientVersion() < 3)
8215 {
8216 return gl::error(GL_INVALID_OPERATION);
8217 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008218
shannon.woods%transgaming.com@gtempaccount.com50ea4ab2013-04-13 03:40:36 +00008219 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
8220 if (!programBinary)
8221 {
8222 return gl::error(GL_INVALID_OPERATION);
8223 }
8224
8225 if (!programBinary->setUniform2uiv(location, count, value))
8226 {
8227 return gl::error(GL_INVALID_OPERATION);
8228 }
8229 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008230 }
8231 catch(std::bad_alloc&)
8232 {
8233 return gl::error(GL_OUT_OF_MEMORY);
8234 }
8235}
8236
8237void __stdcall glUniform3uiv(GLint location, GLsizei count, const GLuint* value)
8238{
8239 EVENT("(GLint location = %d, GLsizei count = %d, const GLuint* value)",
8240 location, count, value);
8241
8242 try
8243 {
8244 gl::Context *context = gl::getNonLostContext();
8245
8246 if (context)
8247 {
8248 if (context->getClientVersion() < 3)
8249 {
8250 return gl::error(GL_INVALID_OPERATION);
8251 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008252
shannon.woods%transgaming.com@gtempaccount.com50ea4ab2013-04-13 03:40:36 +00008253 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
8254 if (!programBinary)
8255 {
8256 return gl::error(GL_INVALID_OPERATION);
8257 }
8258
8259 if (!programBinary->setUniform3uiv(location, count, value))
8260 {
8261 return gl::error(GL_INVALID_OPERATION);
8262 }
8263 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008264 }
8265 catch(std::bad_alloc&)
8266 {
8267 return gl::error(GL_OUT_OF_MEMORY);
8268 }
8269}
8270
8271void __stdcall glUniform4uiv(GLint location, GLsizei count, const GLuint* value)
8272{
8273 EVENT("(GLint location = %d, GLsizei count = %d, const GLuint* value = 0x%0.8p)",
8274 location, count, value);
8275
8276 try
8277 {
8278 gl::Context *context = gl::getNonLostContext();
8279
8280 if (context)
8281 {
8282 if (context->getClientVersion() < 3)
8283 {
8284 return gl::error(GL_INVALID_OPERATION);
8285 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008286
shannon.woods%transgaming.com@gtempaccount.com50ea4ab2013-04-13 03:40:36 +00008287 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
8288 if (!programBinary)
8289 {
8290 return gl::error(GL_INVALID_OPERATION);
8291 }
8292
8293 if (!programBinary->setUniform4uiv(location, count, value))
8294 {
8295 return gl::error(GL_INVALID_OPERATION);
8296 }
8297 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008298 }
8299 catch(std::bad_alloc&)
8300 {
8301 return gl::error(GL_OUT_OF_MEMORY);
8302 }
8303}
8304
8305void __stdcall glClearBufferiv(GLenum buffer, GLint drawbuffer, const GLint* value)
8306{
8307 EVENT("(GLenum buffer = 0x%X, GLint drawbuffer = %d, const GLint* value = 0x%0.8p)",
8308 buffer, drawbuffer, value);
8309
8310 try
8311 {
8312 gl::Context *context = gl::getNonLostContext();
8313
8314 if (context)
8315 {
8316 if (context->getClientVersion() < 3)
8317 {
8318 return gl::error(GL_INVALID_OPERATION);
8319 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008320
Geoff Lang42359ca2013-08-21 13:25:17 -04008321 switch (buffer)
8322 {
8323 case GL_COLOR:
8324 if (drawbuffer < 0 || drawbuffer >= static_cast<GLint>(context->getMaximumRenderTargets()))
8325 {
8326 return gl::error(GL_INVALID_VALUE);
8327 }
8328 break;
8329 case GL_STENCIL:
8330 if (drawbuffer != 0)
8331 {
8332 return gl::error(GL_INVALID_VALUE);
8333 }
8334 default:
8335 return gl::error(GL_INVALID_ENUM);
8336 }
8337
8338 context->clearBufferiv(buffer, drawbuffer, value);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008339 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008340 }
8341 catch(std::bad_alloc&)
8342 {
8343 return gl::error(GL_OUT_OF_MEMORY);
8344 }
8345}
8346
8347void __stdcall glClearBufferuiv(GLenum buffer, GLint drawbuffer, const GLuint* value)
8348{
8349 EVENT("(GLenum buffer = 0x%X, GLint drawbuffer = %d, const GLuint* value = 0x%0.8p)",
8350 buffer, drawbuffer, value);
8351
8352 try
8353 {
8354 gl::Context *context = gl::getNonLostContext();
8355
8356 if (context)
8357 {
8358 if (context->getClientVersion() < 3)
8359 {
8360 return gl::error(GL_INVALID_OPERATION);
8361 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008362
Geoff Lang42359ca2013-08-21 13:25:17 -04008363 switch (buffer)
8364 {
8365 case GL_COLOR:
8366 if (drawbuffer < 0 || drawbuffer >= static_cast<GLint>(context->getMaximumRenderTargets()))
8367 {
8368 return gl::error(GL_INVALID_VALUE);
8369 }
8370 break;
8371 default:
8372 return gl::error(GL_INVALID_ENUM);
8373 }
8374
8375 context->clearBufferuiv(buffer, drawbuffer, value);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008376 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008377 }
8378 catch(std::bad_alloc&)
8379 {
8380 return gl::error(GL_OUT_OF_MEMORY);
8381 }
8382}
8383
8384void __stdcall glClearBufferfv(GLenum buffer, GLint drawbuffer, const GLfloat* value)
8385{
8386 EVENT("(GLenum buffer = 0x%X, GLint drawbuffer = %d, const GLfloat* value = 0x%0.8p)",
8387 buffer, drawbuffer, value);
8388
8389 try
8390 {
8391 gl::Context *context = gl::getNonLostContext();
8392
8393 if (context)
8394 {
8395 if (context->getClientVersion() < 3)
8396 {
8397 return gl::error(GL_INVALID_OPERATION);
8398 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008399
Geoff Lang42359ca2013-08-21 13:25:17 -04008400 switch (buffer)
8401 {
8402 case GL_COLOR:
8403 if (drawbuffer < 0 || drawbuffer >= static_cast<GLint>(context->getMaximumRenderTargets()))
8404 {
8405 return gl::error(GL_INVALID_VALUE);
8406 }
8407 break;
8408 case GL_DEPTH:
8409 if (drawbuffer != 0)
8410 {
8411 return gl::error(GL_INVALID_VALUE);
8412 }
8413 break;
8414 default:
8415 return gl::error(GL_INVALID_ENUM);
8416 }
8417
8418 context->clearBufferfv(buffer, drawbuffer, value);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008419 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008420 }
8421 catch(std::bad_alloc&)
8422 {
8423 return gl::error(GL_OUT_OF_MEMORY);
8424 }
8425}
8426
8427void __stdcall glClearBufferfi(GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil)
8428{
8429 EVENT("(GLenum buffer = 0x%X, GLint drawbuffer = %d, GLfloat depth, GLint stencil = %d)",
8430 buffer, drawbuffer, depth, stencil);
8431
8432 try
8433 {
8434 gl::Context *context = gl::getNonLostContext();
8435
8436 if (context)
8437 {
8438 if (context->getClientVersion() < 3)
8439 {
8440 return gl::error(GL_INVALID_OPERATION);
8441 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008442
Geoff Lang42359ca2013-08-21 13:25:17 -04008443 switch (buffer)
8444 {
8445 case GL_DEPTH_STENCIL:
8446 if (drawbuffer != 0)
8447 {
8448 return gl::error(GL_INVALID_VALUE);
8449 }
8450 break;
8451 default:
8452 return gl::error(GL_INVALID_ENUM);
8453 }
8454
8455 context->clearBufferfi(buffer, drawbuffer, depth, stencil);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008456 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008457 }
8458 catch(std::bad_alloc&)
8459 {
8460 return gl::error(GL_OUT_OF_MEMORY);
8461 }
8462}
8463
8464const GLubyte* __stdcall glGetStringi(GLenum name, GLuint index)
8465{
8466 EVENT("(GLenum name = 0x%X, GLuint index = %u)", name, index);
8467
8468 try
8469 {
8470 gl::Context *context = gl::getNonLostContext();
8471
8472 if (context)
8473 {
8474 if (context->getClientVersion() < 3)
8475 {
8476 return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLubyte*>(NULL));
8477 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008478
shannonwoods@chromium.org302df742013-05-30 00:05:54 +00008479 if (name != GL_EXTENSIONS)
8480 {
8481 return gl::error(GL_INVALID_ENUM, reinterpret_cast<GLubyte*>(NULL));
8482 }
8483
8484 if (index >= context->getNumExtensions())
8485 {
8486 return gl::error(GL_INVALID_VALUE, reinterpret_cast<GLubyte*>(NULL));
8487 }
8488
8489 return reinterpret_cast<const GLubyte*>(context->getExtensionString(index));
8490 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008491 }
8492 catch(std::bad_alloc&)
8493 {
8494 return gl::error(GL_OUT_OF_MEMORY, reinterpret_cast<GLubyte*>(NULL));
8495 }
8496
8497 return NULL;
8498}
8499
8500void __stdcall glCopyBufferSubData(GLenum readTarget, GLenum writeTarget, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size)
8501{
8502 EVENT("(GLenum readTarget = 0x%X, GLenum writeTarget = 0x%X, GLintptr readOffset = %d, GLintptr writeOffset = %d, GLsizeiptr size = %d)",
8503 readTarget, writeTarget, readOffset, writeOffset, size);
8504
8505 try
8506 {
8507 gl::Context *context = gl::getNonLostContext();
8508
8509 if (context)
8510 {
8511 if (context->getClientVersion() < 3)
8512 {
8513 return gl::error(GL_INVALID_OPERATION);
8514 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008515
shannon.woods%transgaming.com@gtempaccount.com296c3f22013-04-13 03:39:39 +00008516 gl::Buffer *readBuffer = NULL;
8517 switch (readTarget)
8518 {
8519 case GL_ARRAY_BUFFER:
8520 readBuffer = context->getArrayBuffer();
8521 break;
8522 case GL_COPY_READ_BUFFER:
8523 readBuffer = context->getCopyReadBuffer();
8524 break;
8525 case GL_COPY_WRITE_BUFFER:
8526 readBuffer = context->getCopyWriteBuffer();
8527 break;
8528 case GL_ELEMENT_ARRAY_BUFFER:
8529 readBuffer = context->getElementArrayBuffer();
8530 break;
8531 case GL_PIXEL_PACK_BUFFER:
8532 readBuffer = context->getPixelPackBuffer();
8533 break;
8534 case GL_PIXEL_UNPACK_BUFFER:
8535 readBuffer = context->getPixelUnpackBuffer();
8536 break;
8537 case GL_TRANSFORM_FEEDBACK_BUFFER:
8538 readBuffer = context->getGenericTransformFeedbackBuffer();
8539 break;
8540 case GL_UNIFORM_BUFFER:
8541 readBuffer = context->getGenericUniformBuffer();
8542 break;
8543 default:
8544 return gl::error(GL_INVALID_ENUM);
8545 }
8546
8547 gl::Buffer *writeBuffer = NULL;
8548 switch (writeTarget)
8549 {
8550 case GL_ARRAY_BUFFER:
8551 writeBuffer = context->getArrayBuffer();
8552 break;
8553 case GL_COPY_READ_BUFFER:
8554 writeBuffer = context->getCopyReadBuffer();
8555 break;
8556 case GL_COPY_WRITE_BUFFER:
8557 writeBuffer = context->getCopyWriteBuffer();
8558 break;
8559 case GL_ELEMENT_ARRAY_BUFFER:
8560 writeBuffer = context->getElementArrayBuffer();
8561 break;
8562 case GL_PIXEL_PACK_BUFFER:
8563 writeBuffer = context->getPixelPackBuffer();
8564 break;
8565 case GL_PIXEL_UNPACK_BUFFER:
8566 writeBuffer = context->getPixelUnpackBuffer();
8567 break;
8568 case GL_TRANSFORM_FEEDBACK_BUFFER:
8569 writeBuffer = context->getGenericTransformFeedbackBuffer();
8570 break;
8571 case GL_UNIFORM_BUFFER:
8572 writeBuffer = context->getGenericUniformBuffer();
8573 break;
8574 default:
8575 return gl::error(GL_INVALID_ENUM);
8576 }
8577
8578 if (!readBuffer || !writeBuffer)
8579 {
8580 return gl::error(GL_INVALID_OPERATION);
8581 }
8582
8583 if (readOffset < 0 || writeOffset < 0 || size < 0 ||
8584 static_cast<unsigned int>(readOffset + size) > readBuffer->size() ||
8585 static_cast<unsigned int>(writeOffset + size) > writeBuffer->size())
8586 {
8587 return gl::error(GL_INVALID_VALUE);
8588 }
8589
8590 if (readBuffer == writeBuffer && abs(readOffset - writeOffset) < size)
8591 {
8592 return gl::error(GL_INVALID_VALUE);
8593 }
8594
8595 // TODO: Verify that readBuffer and writeBuffer are not currently mapped (GL_INVALID_OPERATION)
8596
shannon.woods%transgaming.com@gtempaccount.comc53376a2013-04-13 03:41:23 +00008597 // if size is zero, the copy is a successful no-op
8598 if (size > 0)
8599 {
8600 writeBuffer->copyBufferSubData(readBuffer, readOffset, writeOffset, size);
8601 }
shannon.woods%transgaming.com@gtempaccount.com296c3f22013-04-13 03:39:39 +00008602 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008603 }
8604 catch(std::bad_alloc&)
8605 {
8606 return gl::error(GL_OUT_OF_MEMORY);
8607 }
8608}
8609
8610void __stdcall glGetUniformIndices(GLuint program, GLsizei uniformCount, const GLchar* const* uniformNames, GLuint* uniformIndices)
8611{
8612 EVENT("(GLuint program = %u, GLsizei uniformCount = %d, const GLchar* const* uniformNames = 0x%0.8p, GLuint* uniformIndices = 0x%0.8p)",
8613 program, uniformCount, uniformNames, uniformIndices);
8614
8615 try
8616 {
8617 gl::Context *context = gl::getNonLostContext();
8618
8619 if (context)
8620 {
8621 if (context->getClientVersion() < 3)
8622 {
8623 return gl::error(GL_INVALID_OPERATION);
8624 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008625
shannonwoods@chromium.orgc2ed9912013-05-30 00:05:33 +00008626 if (uniformCount < 0)
8627 {
8628 return gl::error(GL_INVALID_VALUE);
8629 }
8630
8631 gl::Program *programObject = context->getProgram(program);
8632
8633 if (!programObject)
8634 {
8635 if (context->getShader(program))
8636 {
8637 return gl::error(GL_INVALID_OPERATION);
8638 }
8639 else
8640 {
8641 return gl::error(GL_INVALID_VALUE);
8642 }
8643 }
8644
8645 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
8646 if (!programObject->isLinked() || !programBinary)
8647 {
8648 for (int uniformId = 0; uniformId < uniformCount; uniformId++)
8649 {
8650 uniformIndices[uniformId] = GL_INVALID_INDEX;
8651 }
8652 }
8653 else
8654 {
8655 for (int uniformId = 0; uniformId < uniformCount; uniformId++)
8656 {
8657 uniformIndices[uniformId] = programBinary->getUniformIndex(uniformNames[uniformId]);
8658 }
8659 }
8660 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008661 }
8662 catch(std::bad_alloc&)
8663 {
8664 return gl::error(GL_OUT_OF_MEMORY);
8665 }
8666}
8667
8668void __stdcall glGetActiveUniformsiv(GLuint program, GLsizei uniformCount, const GLuint* uniformIndices, GLenum pname, GLint* params)
8669{
8670 EVENT("(GLuint program = %u, GLsizei uniformCount = %d, const GLuint* uniformIndices = 0x%0.8p, GLenum pname = 0x%X, GLint* params = 0x%0.8p)",
8671 program, uniformCount, uniformIndices, pname, params);
8672
8673 try
8674 {
8675 gl::Context *context = gl::getNonLostContext();
8676
8677 if (context)
8678 {
8679 if (context->getClientVersion() < 3)
8680 {
8681 return gl::error(GL_INVALID_OPERATION);
8682 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008683
shannonwoods@chromium.org2a9a9d22013-05-30 00:05:40 +00008684 if (uniformCount < 0)
8685 {
8686 return gl::error(GL_INVALID_VALUE);
8687 }
8688
8689 gl::Program *programObject = context->getProgram(program);
8690
8691 if (!programObject)
8692 {
8693 if (context->getShader(program))
8694 {
8695 return gl::error(GL_INVALID_OPERATION);
8696 }
8697 else
8698 {
8699 return gl::error(GL_INVALID_VALUE);
8700 }
8701 }
8702
8703 switch (pname)
8704 {
8705 case GL_UNIFORM_TYPE:
8706 case GL_UNIFORM_SIZE:
8707 case GL_UNIFORM_NAME_LENGTH:
8708 case GL_UNIFORM_BLOCK_INDEX:
8709 case GL_UNIFORM_OFFSET:
8710 case GL_UNIFORM_ARRAY_STRIDE:
8711 case GL_UNIFORM_MATRIX_STRIDE:
8712 case GL_UNIFORM_IS_ROW_MAJOR:
8713 break;
8714 default:
8715 return gl::error(GL_INVALID_ENUM);
8716 }
8717
8718 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
8719
8720 if (!programBinary && uniformCount > 0)
8721 {
8722 return gl::error(GL_INVALID_VALUE);
8723 }
8724
8725 for (int uniformId = 0; uniformId < uniformCount; uniformId++)
8726 {
8727 const GLuint index = uniformIndices[uniformId];
8728
8729 if (index >= (GLuint)programBinary->getActiveUniformCount())
8730 {
8731 return gl::error(GL_INVALID_VALUE);
8732 }
8733 }
8734
8735 for (int uniformId = 0; uniformId < uniformCount; uniformId++)
8736 {
8737 const GLuint index = uniformIndices[uniformId];
8738 params[uniformId] = programBinary->getActiveUniformi(index, pname);
8739 }
8740 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008741 }
8742 catch(std::bad_alloc&)
8743 {
8744 return gl::error(GL_OUT_OF_MEMORY);
8745 }
8746}
8747
8748GLuint __stdcall glGetUniformBlockIndex(GLuint program, const GLchar* uniformBlockName)
8749{
8750 EVENT("(GLuint program = %u, const GLchar* uniformBlockName = 0x%0.8p)", program, uniformBlockName);
8751
8752 try
8753 {
8754 gl::Context *context = gl::getNonLostContext();
8755
8756 if (context)
8757 {
8758 if (context->getClientVersion() < 3)
8759 {
shannonwoods@chromium.org42766252013-05-30 00:07:12 +00008760 return gl::error(GL_INVALID_OPERATION, GL_INVALID_INDEX);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008761 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008762
shannonwoods@chromium.org42766252013-05-30 00:07:12 +00008763 gl::Program *programObject = context->getProgram(program);
8764
8765 if (!programObject)
8766 {
8767 if (context->getShader(program))
8768 {
8769 return gl::error(GL_INVALID_OPERATION, GL_INVALID_INDEX);
8770 }
8771 else
8772 {
8773 return gl::error(GL_INVALID_VALUE, GL_INVALID_INDEX);
8774 }
8775 }
8776
8777 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
8778 if (!programBinary)
8779 {
8780 return GL_INVALID_INDEX;
8781 }
8782
8783 return programBinary->getUniformBlockIndex(uniformBlockName);
8784 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008785 }
8786 catch(std::bad_alloc&)
8787 {
8788 return gl::error(GL_OUT_OF_MEMORY, 0);
8789 }
8790
8791 return 0;
8792}
8793
8794void __stdcall glGetActiveUniformBlockiv(GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint* params)
8795{
8796 EVENT("(GLuint program = %u, GLuint uniformBlockIndex = %u, GLenum pname = 0x%X, GLint* params = 0x%0.8p)",
8797 program, uniformBlockIndex, pname, params);
8798
8799 try
8800 {
8801 gl::Context *context = gl::getNonLostContext();
8802
8803 if (context)
8804 {
8805 if (context->getClientVersion() < 3)
8806 {
8807 return gl::error(GL_INVALID_OPERATION);
8808 }
shannonwoods@chromium.orge7317ca2013-05-30 00:07:35 +00008809 gl::Program *programObject = context->getProgram(program);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008810
shannonwoods@chromium.orge7317ca2013-05-30 00:07:35 +00008811 if (!programObject)
8812 {
8813 if (context->getShader(program))
8814 {
8815 return gl::error(GL_INVALID_OPERATION);
8816 }
8817 else
8818 {
8819 return gl::error(GL_INVALID_VALUE);
8820 }
8821 }
8822
8823 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
8824
8825 if (!programBinary || uniformBlockIndex >= programBinary->getActiveUniformBlockCount())
8826 {
8827 return gl::error(GL_INVALID_VALUE);
8828 }
8829
8830 switch (pname)
8831 {
8832 case GL_UNIFORM_BLOCK_BINDING:
8833 *params = static_cast<GLint>(programObject->getUniformBlockBinding(uniformBlockIndex));
8834 break;
8835
8836 case GL_UNIFORM_BLOCK_DATA_SIZE:
8837 case GL_UNIFORM_BLOCK_NAME_LENGTH:
8838 case GL_UNIFORM_BLOCK_ACTIVE_UNIFORMS:
8839 case GL_UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES:
8840 case GL_UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER:
8841 case GL_UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER:
8842 programBinary->getActiveUniformBlockiv(uniformBlockIndex, pname, params);
8843 break;
8844
8845 default:
8846 return gl::error(GL_INVALID_ENUM);
8847 }
8848 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008849 }
8850 catch(std::bad_alloc&)
8851 {
8852 return gl::error(GL_OUT_OF_MEMORY);
8853 }
8854}
8855
8856void __stdcall glGetActiveUniformBlockName(GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei* length, GLchar* uniformBlockName)
8857{
8858 EVENT("(GLuint program = %u, GLuint uniformBlockIndex = %u, GLsizei bufSize = %d, GLsizei* length = 0x%0.8p, GLchar* uniformBlockName = 0x%0.8p)",
8859 program, uniformBlockIndex, bufSize, length, uniformBlockName);
8860
8861 try
8862 {
8863 gl::Context *context = gl::getNonLostContext();
8864
8865 if (context)
8866 {
8867 if (context->getClientVersion() < 3)
8868 {
8869 return gl::error(GL_INVALID_OPERATION);
8870 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008871
shannonwoods@chromium.orgbeb02782013-05-30 00:07:28 +00008872 gl::Program *programObject = context->getProgram(program);
8873
8874 if (!programObject)
8875 {
8876 if (context->getShader(program))
8877 {
8878 return gl::error(GL_INVALID_OPERATION);
8879 }
8880 else
8881 {
8882 return gl::error(GL_INVALID_VALUE);
8883 }
8884 }
8885
8886 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
8887
8888 if (!programBinary || uniformBlockIndex >= programBinary->getActiveUniformBlockCount())
8889 {
8890 return gl::error(GL_INVALID_VALUE);
8891 }
8892
8893 programBinary->getActiveUniformBlockName(uniformBlockIndex, bufSize, length, uniformBlockName);
8894 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008895 }
8896 catch(std::bad_alloc&)
8897 {
8898 return gl::error(GL_OUT_OF_MEMORY);
8899 }
8900}
8901
8902void __stdcall glUniformBlockBinding(GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding)
8903{
8904 EVENT("(GLuint program = %u, GLuint uniformBlockIndex = %u, GLuint uniformBlockBinding = %u)",
8905 program, uniformBlockIndex, uniformBlockBinding);
8906
8907 try
8908 {
8909 gl::Context *context = gl::getNonLostContext();
8910
8911 if (context)
8912 {
8913 if (context->getClientVersion() < 3)
8914 {
8915 return gl::error(GL_INVALID_OPERATION);
8916 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008917
shannonwoods@chromium.org70eb1ea2013-05-30 00:07:20 +00008918 if (uniformBlockBinding >= context->getMaximumCombinedUniformBufferBindings())
8919 {
8920 return gl::error(GL_INVALID_VALUE);
8921 }
8922
8923 gl::Program *programObject = context->getProgram(program);
8924
8925 if (!programObject)
8926 {
8927 if (context->getShader(program))
8928 {
8929 return gl::error(GL_INVALID_OPERATION);
8930 }
8931 else
8932 {
8933 return gl::error(GL_INVALID_VALUE);
8934 }
8935 }
8936
8937 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
8938
8939 // if never linked, there won't be any uniform blocks
8940 if (!programBinary || uniformBlockIndex >= programBinary->getActiveUniformBlockCount())
8941 {
8942 return gl::error(GL_INVALID_VALUE);
8943 }
8944
8945 programObject->bindUniformBlock(uniformBlockIndex, uniformBlockBinding);
8946 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008947 }
8948 catch(std::bad_alloc&)
8949 {
8950 return gl::error(GL_OUT_OF_MEMORY);
8951 }
8952}
8953
8954void __stdcall glDrawArraysInstanced(GLenum mode, GLint first, GLsizei count, GLsizei instanceCount)
8955{
8956 EVENT("(GLenum mode = 0x%X, GLint first = %d, GLsizei count = %d, GLsizei instanceCount = %d)",
8957 mode, first, count, instanceCount);
8958
8959 try
8960 {
8961 gl::Context *context = gl::getNonLostContext();
8962
8963 if (context)
8964 {
8965 if (context->getClientVersion() < 3)
8966 {
8967 return gl::error(GL_INVALID_OPERATION);
8968 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008969
Jamie Madill54133512013-06-21 09:33:07 -04008970 // glDrawArraysInstanced
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008971 UNIMPLEMENTED();
8972 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008973 }
8974 catch(std::bad_alloc&)
8975 {
8976 return gl::error(GL_OUT_OF_MEMORY);
8977 }
8978}
8979
8980void __stdcall glDrawElementsInstanced(GLenum mode, GLsizei count, GLenum type, const GLvoid* indices, GLsizei instanceCount)
8981{
8982 EVENT("(GLenum mode = 0x%X, GLsizei count = %d, GLenum type = 0x%X, const GLvoid* indices = 0x%0.8p, GLsizei instanceCount = %d)",
8983 mode, count, type, indices, instanceCount);
8984
8985 try
8986 {
8987 gl::Context *context = gl::getNonLostContext();
8988
8989 if (context)
8990 {
8991 if (context->getClientVersion() < 3)
8992 {
8993 return gl::error(GL_INVALID_OPERATION);
8994 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008995
Jamie Madill54133512013-06-21 09:33:07 -04008996 // glDrawElementsInstanced
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008997 UNIMPLEMENTED();
8998 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008999 }
9000 catch(std::bad_alloc&)
9001 {
9002 return gl::error(GL_OUT_OF_MEMORY);
9003 }
9004}
9005
9006GLsync __stdcall glFenceSync(GLenum condition, GLbitfield flags)
9007{
9008 EVENT("(GLenum condition = 0x%X, GLbitfield flags = 0x%X)", condition, flags);
9009
9010 try
9011 {
9012 gl::Context *context = gl::getNonLostContext();
9013
9014 if (context)
9015 {
9016 if (context->getClientVersion() < 3)
9017 {
Jamie Madill5215e1a2013-07-26 11:55:19 -04009018 return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLsync>(0));
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009019 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009020
Jamie Madill5215e1a2013-07-26 11:55:19 -04009021 if (condition != GL_SYNC_GPU_COMMANDS_COMPLETE)
9022 {
9023 return gl::error(GL_INVALID_ENUM, reinterpret_cast<GLsync>(0));
9024 }
9025
9026 if (flags != 0)
9027 {
9028 return gl::error(GL_INVALID_VALUE, reinterpret_cast<GLsync>(0));
9029 }
9030
9031 return context->createFenceSync(condition);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009032 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009033 }
9034 catch(std::bad_alloc&)
9035 {
9036 return gl::error(GL_OUT_OF_MEMORY, reinterpret_cast<GLsync>(NULL));
9037 }
9038
9039 return NULL;
9040}
9041
9042GLboolean __stdcall glIsSync(GLsync sync)
9043{
9044 EVENT("(GLsync sync = 0x%0.8p)", sync);
9045
9046 try
9047 {
9048 gl::Context *context = gl::getNonLostContext();
9049
9050 if (context)
9051 {
9052 if (context->getClientVersion() < 3)
9053 {
9054 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
9055 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009056
Jamie Madill5215e1a2013-07-26 11:55:19 -04009057 return (context->getFenceSync(sync) != NULL);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009058 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009059 }
9060 catch(std::bad_alloc&)
9061 {
9062 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
9063 }
9064
9065 return GL_FALSE;
9066}
9067
9068void __stdcall glDeleteSync(GLsync sync)
9069{
9070 EVENT("(GLsync sync = 0x%0.8p)", sync);
9071
9072 try
9073 {
9074 gl::Context *context = gl::getNonLostContext();
9075
9076 if (context)
9077 {
9078 if (context->getClientVersion() < 3)
9079 {
9080 return gl::error(GL_INVALID_OPERATION);
9081 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009082
Jamie Madill5215e1a2013-07-26 11:55:19 -04009083 if (sync != static_cast<GLsync>(0) && !context->getFenceSync(sync))
9084 {
9085 return gl::error(GL_INVALID_VALUE);
9086 }
9087
9088 context->deleteFenceSync(sync);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009089 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009090 }
9091 catch(std::bad_alloc&)
9092 {
9093 return gl::error(GL_OUT_OF_MEMORY);
9094 }
9095}
9096
9097GLenum __stdcall glClientWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout)
9098{
9099 EVENT("(GLsync sync = 0x%0.8p, GLbitfield flags = 0x%X, GLuint64 timeout = %llu)",
9100 sync, flags, timeout);
9101
9102 try
9103 {
9104 gl::Context *context = gl::getNonLostContext();
9105
9106 if (context)
9107 {
9108 if (context->getClientVersion() < 3)
9109 {
Jamie Madill5215e1a2013-07-26 11:55:19 -04009110 return gl::error(GL_INVALID_OPERATION, GL_WAIT_FAILED);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009111 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009112
Jamie Madill5215e1a2013-07-26 11:55:19 -04009113 if ((flags & ~(GL_SYNC_FLUSH_COMMANDS_BIT)) != 0)
9114 {
9115 return gl::error(GL_INVALID_VALUE, GL_WAIT_FAILED);
9116 }
9117
9118 gl::FenceSync *fenceSync = context->getFenceSync(sync);
9119
9120 if (!fenceSync)
9121 {
9122 return gl::error(GL_INVALID_VALUE, GL_WAIT_FAILED);
9123 }
9124
9125 return fenceSync->clientWait(flags, timeout);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009126 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009127 }
9128 catch(std::bad_alloc&)
9129 {
9130 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
9131 }
9132
9133 return GL_FALSE;
9134}
9135
9136void __stdcall glWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout)
9137{
9138 EVENT("(GLsync sync = 0x%0.8p, GLbitfield flags = 0x%X, GLuint64 timeout = %llu)",
9139 sync, flags, timeout);
9140
9141 try
9142 {
9143 gl::Context *context = gl::getNonLostContext();
9144
9145 if (context)
9146 {
9147 if (context->getClientVersion() < 3)
9148 {
9149 return gl::error(GL_INVALID_OPERATION);
9150 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009151
Jamie Madill5215e1a2013-07-26 11:55:19 -04009152 if (flags != 0)
9153 {
9154 return gl::error(GL_INVALID_VALUE);
9155 }
9156
9157 if (timeout != GL_TIMEOUT_IGNORED)
9158 {
9159 return gl::error(GL_INVALID_VALUE);
9160 }
9161
9162 gl::FenceSync *fenceSync = context->getFenceSync(sync);
9163
9164 if (!fenceSync)
9165 {
9166 return gl::error(GL_INVALID_VALUE);
9167 }
9168
9169 fenceSync->serverWait();
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009170 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009171 }
9172 catch(std::bad_alloc&)
9173 {
9174 return gl::error(GL_OUT_OF_MEMORY);
9175 }
9176}
9177
9178void __stdcall glGetInteger64v(GLenum pname, GLint64* params)
9179{
9180 EVENT("(GLenum pname = 0x%X, GLint64* params = 0x%0.8p)",
9181 pname, params);
9182
9183 try
9184 {
9185 gl::Context *context = gl::getNonLostContext();
9186
9187 if (context)
9188 {
9189 if (context->getClientVersion() < 3)
9190 {
9191 return gl::error(GL_INVALID_OPERATION);
9192 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009193
Jamie Madill71fbd602013-07-19 16:36:55 -04009194 if (!(context->getInteger64v(pname, params)))
9195 {
9196 GLenum nativeType;
9197 unsigned int numParams = 0;
9198 if (!context->getQueryParameterInfo(pname, &nativeType, &numParams))
9199 return gl::error(GL_INVALID_ENUM);
9200
9201 if (numParams == 0)
9202 return; // it is known that the pname is valid, but that there are no parameters to return.
9203
9204 if (nativeType == GL_BOOL)
9205 {
9206 GLboolean *boolParams = NULL;
9207 boolParams = new GLboolean[numParams];
9208
9209 context->getBooleanv(pname, boolParams);
9210
9211 for (unsigned int i = 0; i < numParams; ++i)
9212 {
9213 if (boolParams[i] == GL_FALSE)
9214 params[i] = 0;
9215 else
9216 params[i] = 1;
9217 }
9218
9219 delete [] boolParams;
9220 }
9221 else if (nativeType == GL_INT)
9222 {
9223 GLint *intParams = NULL;
9224 intParams = new GLint[numParams];
9225
9226 context->getIntegerv(pname, intParams);
9227
9228 for (unsigned int i = 0; i < numParams; ++i)
9229 {
9230 params[i] = static_cast<GLint64>(intParams[i]);
9231 }
9232
9233 delete [] intParams;
9234 }
9235 else if (nativeType == GL_FLOAT)
9236 {
9237 GLfloat *floatParams = NULL;
9238 floatParams = new GLfloat[numParams];
9239
9240 context->getFloatv(pname, floatParams);
9241
9242 for (unsigned int i = 0; i < numParams; ++i)
9243 {
9244 // RGBA color values and DepthRangeF values are converted to integer using Equation 2.4 from Table 4.5
9245 if (pname == GL_DEPTH_RANGE || pname == GL_COLOR_CLEAR_VALUE || pname == GL_DEPTH_CLEAR_VALUE || pname == GL_BLEND_COLOR)
9246 {
9247 params[i] = static_cast<GLint64>((static_cast<GLfloat>(0xFFFFFFFF) * floatParams[i] - 1.0f) / 2.0f);
9248 }
9249 else
9250 {
9251 params[i] = gl::iround<GLint64>(floatParams[i]);
9252 }
9253 }
9254
9255 delete [] floatParams;
9256 }
9257 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009258 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009259 }
9260 catch(std::bad_alloc&)
9261 {
9262 return gl::error(GL_OUT_OF_MEMORY);
9263 }
9264}
9265
9266void __stdcall glGetSynciv(GLsync sync, GLenum pname, GLsizei bufSize, GLsizei* length, GLint* values)
9267{
9268 EVENT("(GLsync sync = 0x%0.8p, GLenum pname = 0x%X, GLsizei bufSize = %d, GLsizei* length = 0x%0.8p, GLint* values = 0x%0.8p)",
9269 sync, pname, bufSize, length, values);
9270
9271 try
9272 {
9273 gl::Context *context = gl::getNonLostContext();
9274
9275 if (context)
9276 {
9277 if (context->getClientVersion() < 3)
9278 {
9279 return gl::error(GL_INVALID_OPERATION);
9280 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009281
Jamie Madill5215e1a2013-07-26 11:55:19 -04009282 if (bufSize < 0)
9283 {
9284 return gl::error(GL_INVALID_VALUE);
9285 }
9286
9287 gl::FenceSync *fenceSync = context->getFenceSync(sync);
9288
9289 if (!fenceSync)
9290 {
9291 return gl::error(GL_INVALID_VALUE);
9292 }
9293
9294 switch (pname)
9295 {
9296 case GL_OBJECT_TYPE: values[0] = static_cast<GLint>(GL_SYNC_FENCE); break;
9297 case GL_SYNC_STATUS: values[0] = static_cast<GLint>(fenceSync->getStatus()); break;
9298 case GL_SYNC_CONDITION: values[0] = static_cast<GLint>(fenceSync->getCondition()); break;
9299 case GL_SYNC_FLAGS: values[0] = 0; break;
9300
9301 default:
9302 return gl::error(GL_INVALID_ENUM);
9303 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009304 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009305 }
9306 catch(std::bad_alloc&)
9307 {
9308 return gl::error(GL_OUT_OF_MEMORY);
9309 }
9310}
9311
9312void __stdcall glGetInteger64i_v(GLenum target, GLuint index, GLint64* data)
9313{
9314 EVENT("(GLenum target = 0x%X, GLuint index = %u, GLint64* data = 0x%0.8p)",
9315 target, index, data);
9316
9317 try
9318 {
9319 gl::Context *context = gl::getNonLostContext();
9320
9321 if (context)
9322 {
9323 if (context->getClientVersion() < 3)
9324 {
9325 return gl::error(GL_INVALID_OPERATION);
9326 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009327
Shannon Woods15934d52013-08-19 14:28:49 -04009328 switch (target)
9329 {
9330 case GL_TRANSFORM_FEEDBACK_BUFFER_START:
9331 case GL_TRANSFORM_FEEDBACK_BUFFER_SIZE:
9332 case GL_TRANSFORM_FEEDBACK_BUFFER_BINDING:
9333 if (index >= context->getMaxTransformFeedbackBufferBindings())
9334 return gl::error(GL_INVALID_VALUE);
9335 break;
9336 case GL_UNIFORM_BUFFER_START:
9337 case GL_UNIFORM_BUFFER_SIZE:
9338 case GL_UNIFORM_BUFFER_BINDING:
9339 if (index >= context->getMaximumCombinedUniformBufferBindings())
9340 return gl::error(GL_INVALID_VALUE);
9341 break;
9342 default:
9343 return gl::error(GL_INVALID_ENUM);
9344 }
9345
9346 if (!(context->getIndexedInteger64v(target, index, data)))
9347 {
9348 GLenum nativeType;
9349 unsigned int numParams = 0;
9350 if (!context->getIndexedQueryParameterInfo(target, &nativeType, &numParams))
9351 return gl::error(GL_INVALID_ENUM);
9352
9353 if (numParams == 0)
9354 return; // it is known that pname is valid, but there are no parameters to return
9355
9356 if (nativeType == GL_INT)
9357 {
9358 GLint *intParams = new GLint[numParams];
9359
9360 context->getIndexedIntegerv(target, index, intParams);
9361
9362 for (unsigned int i = 0; i < numParams; ++i)
9363 {
9364 data[i] = static_cast<GLint64>(intParams[i]);
9365 }
9366
9367 delete [] intParams;
9368 }
9369 else
9370 {
9371 UNREACHABLE();
9372 }
9373 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009374 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009375 }
9376 catch(std::bad_alloc&)
9377 {
9378 return gl::error(GL_OUT_OF_MEMORY);
9379 }
9380}
9381
9382void __stdcall glGetBufferParameteri64v(GLenum target, GLenum pname, GLint64* params)
9383{
9384 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLint64* params = 0x%0.8p)",
9385 target, pname, params);
9386
9387 try
9388 {
9389 gl::Context *context = gl::getNonLostContext();
9390
9391 if (context)
9392 {
9393 if (context->getClientVersion() < 3)
9394 {
9395 return gl::error(GL_INVALID_OPERATION);
9396 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009397
Jamie Madill54133512013-06-21 09:33:07 -04009398 // glGetBufferParameteri64v
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009399 UNIMPLEMENTED();
9400 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009401 }
9402 catch(std::bad_alloc&)
9403 {
9404 return gl::error(GL_OUT_OF_MEMORY);
9405 }
9406}
9407
9408void __stdcall glGenSamplers(GLsizei count, GLuint* samplers)
9409{
9410 EVENT("(GLsizei count = %d, GLuint* samplers = 0x%0.8p)", count, samplers);
9411
9412 try
9413 {
9414 gl::Context *context = gl::getNonLostContext();
9415
9416 if (context)
9417 {
9418 if (context->getClientVersion() < 3)
9419 {
9420 return gl::error(GL_INVALID_OPERATION);
9421 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009422
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009423 if (count < 0)
9424 {
9425 return gl::error(GL_INVALID_VALUE);
9426 }
9427
9428 for (int i = 0; i < count; i++)
9429 {
9430 samplers[i] = context->createSampler();
9431 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009432 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009433 }
9434 catch(std::bad_alloc&)
9435 {
9436 return gl::error(GL_OUT_OF_MEMORY);
9437 }
9438}
9439
9440void __stdcall glDeleteSamplers(GLsizei count, const GLuint* samplers)
9441{
9442 EVENT("(GLsizei count = %d, const GLuint* samplers = 0x%0.8p)", count, samplers);
9443
9444 try
9445 {
9446 gl::Context *context = gl::getNonLostContext();
9447
9448 if (context)
9449 {
9450 if (context->getClientVersion() < 3)
9451 {
9452 return gl::error(GL_INVALID_OPERATION);
9453 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009454
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009455 if (count < 0)
9456 {
9457 return gl::error(GL_INVALID_VALUE);
9458 }
9459
9460 for (int i = 0; i < count; i++)
9461 {
9462 context->deleteSampler(samplers[i]);
9463 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009464 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009465 }
9466 catch(std::bad_alloc&)
9467 {
9468 return gl::error(GL_OUT_OF_MEMORY);
9469 }
9470}
9471
9472GLboolean __stdcall glIsSampler(GLuint sampler)
9473{
9474 EVENT("(GLuint sampler = %u)", sampler);
9475
9476 try
9477 {
9478 gl::Context *context = gl::getNonLostContext();
9479
9480 if (context)
9481 {
9482 if (context->getClientVersion() < 3)
9483 {
9484 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
9485 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009486
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009487 return context->isSampler(sampler);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009488 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009489 }
9490 catch(std::bad_alloc&)
9491 {
9492 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
9493 }
9494
9495 return GL_FALSE;
9496}
9497
9498void __stdcall glBindSampler(GLuint unit, GLuint sampler)
9499{
9500 EVENT("(GLuint unit = %u, GLuint sampler = %u)", unit, sampler);
9501
9502 try
9503 {
9504 gl::Context *context = gl::getNonLostContext();
9505
9506 if (context)
9507 {
9508 if (context->getClientVersion() < 3)
9509 {
9510 return gl::error(GL_INVALID_OPERATION);
9511 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009512
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009513 if (sampler != 0 && !context->isSampler(sampler))
9514 {
9515 return gl::error(GL_INVALID_OPERATION);
9516 }
9517
9518 if (unit >= context->getMaximumCombinedTextureImageUnits())
9519 {
9520 return gl::error(GL_INVALID_VALUE);
9521 }
9522
9523 context->bindSampler(unit, sampler);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009524 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009525 }
9526 catch(std::bad_alloc&)
9527 {
9528 return gl::error(GL_OUT_OF_MEMORY);
9529 }
9530}
9531
9532void __stdcall glSamplerParameteri(GLuint sampler, GLenum pname, GLint param)
9533{
9534 EVENT("(GLuint sampler = %u, GLenum pname = 0x%X, GLint param = %d)", sampler, pname, param);
9535
9536 try
9537 {
9538 gl::Context *context = gl::getNonLostContext();
9539
9540 if (context)
9541 {
9542 if (context->getClientVersion() < 3)
9543 {
9544 return gl::error(GL_INVALID_OPERATION);
9545 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009546
Geoff Lang34dbb6f2013-08-05 15:05:47 -04009547 if (!gl::ValidateSamplerObjectParameter(pname))
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009548 {
9549 return;
9550 }
9551
Geoff Lang34dbb6f2013-08-05 15:05:47 -04009552 if (!gl::ValidateTexParamParameters(context, pname, param))
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009553 {
9554 return;
9555 }
9556
9557 if (!context->isSampler(sampler))
9558 {
9559 return gl::error(GL_INVALID_OPERATION);
9560 }
9561
9562 context->samplerParameteri(sampler, pname, param);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009563 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009564 }
9565 catch(std::bad_alloc&)
9566 {
9567 return gl::error(GL_OUT_OF_MEMORY);
9568 }
9569}
9570
9571void __stdcall glSamplerParameteriv(GLuint sampler, GLenum pname, const GLint* param)
9572{
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009573 glSamplerParameteri(sampler, pname, *param);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009574}
9575
9576void __stdcall glSamplerParameterf(GLuint sampler, GLenum pname, GLfloat param)
9577{
9578 EVENT("(GLuint sampler = %u, GLenum pname = 0x%X, GLfloat param = %g)", sampler, pname, param);
9579
9580 try
9581 {
9582 gl::Context *context = gl::getNonLostContext();
9583
9584 if (context)
9585 {
9586 if (context->getClientVersion() < 3)
9587 {
9588 return gl::error(GL_INVALID_OPERATION);
9589 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009590
Geoff Lang34dbb6f2013-08-05 15:05:47 -04009591 if (!gl::ValidateSamplerObjectParameter(pname))
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009592 {
9593 return;
9594 }
9595
Geoff Lang34dbb6f2013-08-05 15:05:47 -04009596 if (!gl::ValidateTexParamParameters(context, pname, static_cast<GLint>(param)))
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009597 {
9598 return;
9599 }
9600
9601 if (!context->isSampler(sampler))
9602 {
9603 return gl::error(GL_INVALID_OPERATION);
9604 }
9605
9606 context->samplerParameterf(sampler, pname, param);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009607 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009608 }
9609 catch(std::bad_alloc&)
9610 {
9611 return gl::error(GL_OUT_OF_MEMORY);
9612 }
9613}
9614
9615void __stdcall glSamplerParameterfv(GLuint sampler, GLenum pname, const GLfloat* param)
9616{
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009617 glSamplerParameterf(sampler, pname, *param);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009618}
9619
9620void __stdcall glGetSamplerParameteriv(GLuint sampler, GLenum pname, GLint* params)
9621{
9622 EVENT("(GLuint sampler = %u, GLenum pname = 0x%X, GLint* params = 0x%0.8p)", sampler, pname, params);
9623
9624 try
9625 {
9626 gl::Context *context = gl::getNonLostContext();
9627
9628 if (context)
9629 {
9630 if (context->getClientVersion() < 3)
9631 {
9632 return gl::error(GL_INVALID_OPERATION);
9633 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009634
Geoff Lang34dbb6f2013-08-05 15:05:47 -04009635 if (!gl::ValidateSamplerObjectParameter(pname))
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009636 {
9637 return;
9638 }
9639
9640 if (!context->isSampler(sampler))
9641 {
9642 return gl::error(GL_INVALID_OPERATION);
9643 }
9644
9645 *params = context->getSamplerParameteri(sampler, pname);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009646 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009647 }
9648 catch(std::bad_alloc&)
9649 {
9650 return gl::error(GL_OUT_OF_MEMORY);
9651 }
9652}
9653
9654void __stdcall glGetSamplerParameterfv(GLuint sampler, GLenum pname, GLfloat* params)
9655{
9656 EVENT("(GLuint sample = %ur, GLenum pname = 0x%X, GLfloat* params = 0x%0.8p)", sampler, pname, params);
9657
9658 try
9659 {
9660 gl::Context *context = gl::getNonLostContext();
9661
9662 if (context)
9663 {
9664 if (context->getClientVersion() < 3)
9665 {
9666 return gl::error(GL_INVALID_OPERATION);
9667 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009668
Geoff Lang34dbb6f2013-08-05 15:05:47 -04009669 if (!gl::ValidateSamplerObjectParameter(pname))
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009670 {
9671 return;
9672 }
9673
9674 if (!context->isSampler(sampler))
9675 {
9676 return gl::error(GL_INVALID_OPERATION);
9677 }
9678
9679 *params = context->getSamplerParameterf(sampler, pname);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009680 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009681 }
9682 catch(std::bad_alloc&)
9683 {
9684 return gl::error(GL_OUT_OF_MEMORY);
9685 }
9686}
9687
9688void __stdcall glVertexAttribDivisor(GLuint index, GLuint divisor)
9689{
9690 EVENT("(GLuint index = %u, GLuint divisor = %u)", index, divisor);
9691
9692 try
9693 {
shannon.woods%transgaming.com@gtempaccount.com8736bd62013-04-13 03:35:41 +00009694 if (index >= gl::MAX_VERTEX_ATTRIBS)
9695 {
9696 return gl::error(GL_INVALID_VALUE);
9697 }
9698
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009699 gl::Context *context = gl::getNonLostContext();
9700
9701 if (context)
9702 {
9703 if (context->getClientVersion() < 3)
9704 {
9705 return gl::error(GL_INVALID_OPERATION);
9706 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009707
shannon.woods%transgaming.com@gtempaccount.com8736bd62013-04-13 03:35:41 +00009708 context->setVertexAttribDivisor(index, divisor);
9709 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009710 }
9711 catch(std::bad_alloc&)
9712 {
9713 return gl::error(GL_OUT_OF_MEMORY);
9714 }
9715}
9716
9717void __stdcall glBindTransformFeedback(GLenum target, GLuint id)
9718{
9719 EVENT("(GLenum target = 0x%X, GLuint id = %u)", target, id);
9720
9721 try
9722 {
9723 gl::Context *context = gl::getNonLostContext();
9724
9725 if (context)
9726 {
9727 if (context->getClientVersion() < 3)
9728 {
9729 return gl::error(GL_INVALID_OPERATION);
9730 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009731
Jamie Madill54133512013-06-21 09:33:07 -04009732 // glBindTransformFeedback
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009733 UNIMPLEMENTED();
9734 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009735 }
9736 catch(std::bad_alloc&)
9737 {
9738 return gl::error(GL_OUT_OF_MEMORY);
9739 }
9740}
9741
9742void __stdcall glDeleteTransformFeedbacks(GLsizei n, const GLuint* ids)
9743{
9744 EVENT("(GLsizei n = %d, const GLuint* ids = 0x%0.8p)", n, ids);
9745
9746 try
9747 {
9748 gl::Context *context = gl::getNonLostContext();
9749
9750 if (context)
9751 {
9752 if (context->getClientVersion() < 3)
9753 {
9754 return gl::error(GL_INVALID_OPERATION);
9755 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009756
Jamie Madill54133512013-06-21 09:33:07 -04009757 // glDeleteTransformFeedbacks
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009758 UNIMPLEMENTED();
9759 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009760 }
9761 catch(std::bad_alloc&)
9762 {
9763 return gl::error(GL_OUT_OF_MEMORY);
9764 }
9765}
9766
9767void __stdcall glGenTransformFeedbacks(GLsizei n, GLuint* ids)
9768{
9769 EVENT("(GLsizei n = %d, GLuint* ids = 0x%0.8p)", n, ids);
9770
9771 try
9772 {
9773 gl::Context *context = gl::getNonLostContext();
9774
9775 if (context)
9776 {
9777 if (context->getClientVersion() < 3)
9778 {
9779 return gl::error(GL_INVALID_OPERATION);
9780 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009781
Jamie Madill54133512013-06-21 09:33:07 -04009782 // glGenTransformFeedbacks
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009783 UNIMPLEMENTED();
9784 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009785 }
9786 catch(std::bad_alloc&)
9787 {
9788 return gl::error(GL_OUT_OF_MEMORY);
9789 }
9790}
9791
9792GLboolean __stdcall glIsTransformFeedback(GLuint id)
9793{
9794 EVENT("(GLuint id = %u)", id);
9795
9796 try
9797 {
9798 gl::Context *context = gl::getNonLostContext();
9799
9800 if (context)
9801 {
9802 if (context->getClientVersion() < 3)
9803 {
9804 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
9805 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009806
Jamie Madill54133512013-06-21 09:33:07 -04009807 // glIsTransformFeedback
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009808 UNIMPLEMENTED();
9809 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009810 }
9811 catch(std::bad_alloc&)
9812 {
9813 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
9814 }
9815
9816 return GL_FALSE;
9817}
9818
9819void __stdcall glPauseTransformFeedback(void)
9820{
9821 EVENT("(void)");
9822
9823 try
9824 {
9825 gl::Context *context = gl::getNonLostContext();
9826
9827 if (context)
9828 {
9829 if (context->getClientVersion() < 3)
9830 {
9831 return gl::error(GL_INVALID_OPERATION);
9832 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009833
Jamie Madill54133512013-06-21 09:33:07 -04009834 // glPauseTransformFeedback
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009835 UNIMPLEMENTED();
9836 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009837 }
9838 catch(std::bad_alloc&)
9839 {
9840 return gl::error(GL_OUT_OF_MEMORY);
9841 }
9842}
9843
9844void __stdcall glResumeTransformFeedback(void)
9845{
9846 EVENT("(void)");
9847
9848 try
9849 {
9850 gl::Context *context = gl::getNonLostContext();
9851
9852 if (context)
9853 {
9854 if (context->getClientVersion() < 3)
9855 {
9856 return gl::error(GL_INVALID_OPERATION);
9857 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009858
Jamie Madill54133512013-06-21 09:33:07 -04009859 // glResumeTransformFeedback
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009860 UNIMPLEMENTED();
9861 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009862 }
9863 catch(std::bad_alloc&)
9864 {
9865 return gl::error(GL_OUT_OF_MEMORY);
9866 }
9867}
9868
9869void __stdcall glGetProgramBinary(GLuint program, GLsizei bufSize, GLsizei* length, GLenum* binaryFormat, GLvoid* binary)
9870{
9871 EVENT("(GLuint program = %u, GLsizei bufSize = %d, GLsizei* length = 0x%0.8p, GLenum* binaryFormat = 0x%0.8p, GLvoid* binary = 0x%0.8p)",
9872 program, bufSize, length, binaryFormat, binary);
9873
9874 try
9875 {
9876 gl::Context *context = gl::getNonLostContext();
9877
9878 if (context)
9879 {
9880 if (context->getClientVersion() < 3)
9881 {
9882 return gl::error(GL_INVALID_OPERATION);
9883 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009884
Jamie Madill54133512013-06-21 09:33:07 -04009885 // glGetProgramBinary
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009886 UNIMPLEMENTED();
9887 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009888 }
9889 catch(std::bad_alloc&)
9890 {
9891 return gl::error(GL_OUT_OF_MEMORY);
9892 }
9893}
9894
9895void __stdcall glProgramBinary(GLuint program, GLenum binaryFormat, const GLvoid* binary, GLsizei length)
9896{
9897 EVENT("(GLuint program = %u, GLenum binaryFormat = 0x%X, const GLvoid* binary = 0x%0.8p, GLsizei length = %d)",
9898 program, binaryFormat, binary, length);
9899
9900 try
9901 {
9902 gl::Context *context = gl::getNonLostContext();
9903
9904 if (context)
9905 {
9906 if (context->getClientVersion() < 3)
9907 {
9908 return gl::error(GL_INVALID_OPERATION);
9909 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009910
Jamie Madill54133512013-06-21 09:33:07 -04009911 // glProgramBinary
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009912 UNIMPLEMENTED();
9913 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009914 }
9915 catch(std::bad_alloc&)
9916 {
9917 return gl::error(GL_OUT_OF_MEMORY);
9918 }
9919}
9920
9921void __stdcall glProgramParameteri(GLuint program, GLenum pname, GLint value)
9922{
9923 EVENT("(GLuint program = %u, GLenum pname = 0x%X, GLint value = %d)",
9924 program, pname, value);
9925
9926 try
9927 {
9928 gl::Context *context = gl::getNonLostContext();
9929
9930 if (context)
9931 {
9932 if (context->getClientVersion() < 3)
9933 {
9934 return gl::error(GL_INVALID_OPERATION);
9935 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009936
Jamie Madill54133512013-06-21 09:33:07 -04009937 // glProgramParameteri
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009938 UNIMPLEMENTED();
9939 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009940 }
9941 catch(std::bad_alloc&)
9942 {
9943 return gl::error(GL_OUT_OF_MEMORY);
9944 }
9945}
9946
9947void __stdcall glInvalidateFramebuffer(GLenum target, GLsizei numAttachments, const GLenum* attachments)
9948{
9949 EVENT("(GLenum target = 0x%X, GLsizei numAttachments = %d, const GLenum* attachments = 0x%0.8p)",
9950 target, numAttachments, attachments);
9951
9952 try
9953 {
9954 gl::Context *context = gl::getNonLostContext();
9955
9956 if (context)
9957 {
9958 if (context->getClientVersion() < 3)
9959 {
9960 return gl::error(GL_INVALID_OPERATION);
9961 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009962
Geoff Lang34dbb6f2013-08-05 15:05:47 -04009963 if (!ValidateInvalidateFramebufferParameters(context, target, numAttachments, attachments))
shannonwoods@chromium.orgd63ef892013-05-30 00:10:56 +00009964 {
9965 return;
9966 }
9967
9968 int maxDimension = context->getMaximumRenderbufferDimension();
9969 context->invalidateFrameBuffer(target, numAttachments, attachments, 0, 0, maxDimension, maxDimension);
9970 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009971 }
9972 catch(std::bad_alloc&)
9973 {
9974 return gl::error(GL_OUT_OF_MEMORY);
9975 }
9976}
9977
9978void __stdcall glInvalidateSubFramebuffer(GLenum target, GLsizei numAttachments, const GLenum* attachments, GLint x, GLint y, GLsizei width, GLsizei height)
9979{
9980 EVENT("(GLenum target = 0x%X, GLsizei numAttachments = %d, const GLenum* attachments = 0x%0.8p, GLint x = %d, "
9981 "GLint y = %d, GLsizei width = %d, GLsizei height = %d)",
9982 target, numAttachments, attachments, x, y, width, height);
9983
9984 try
9985 {
9986 gl::Context *context = gl::getNonLostContext();
9987
9988 if (context)
9989 {
9990 if (context->getClientVersion() < 3)
9991 {
9992 return gl::error(GL_INVALID_OPERATION);
9993 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009994
Geoff Lang34dbb6f2013-08-05 15:05:47 -04009995 if (!ValidateInvalidateFramebufferParameters(context, target, numAttachments, attachments))
shannonwoods@chromium.orgd63ef892013-05-30 00:10:56 +00009996 {
9997 return;
9998 }
9999
10000 context->invalidateFrameBuffer(target, numAttachments, attachments, x, y, width, height);
10001 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +000010002 }
10003 catch(std::bad_alloc&)
10004 {
10005 return gl::error(GL_OUT_OF_MEMORY);
10006 }
10007}
10008
10009void __stdcall glTexStorage2D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height)
10010{
10011 EVENT("(GLenum target = 0x%X, GLsizei levels = %d, GLenum internalformat = 0x%X, GLsizei width = %d, GLsizei height = %d)",
10012 target, levels, internalformat, width, height);
10013
10014 try
10015 {
10016 gl::Context *context = gl::getNonLostContext();
10017
10018 if (context)
10019 {
10020 if (context->getClientVersion() < 3)
10021 {
10022 return gl::error(GL_INVALID_OPERATION);
10023 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +000010024
Geoff Lang34dbb6f2013-08-05 15:05:47 -040010025 if (!ValidateES3TexStorageParameters(context, target, levels, internalformat, width, height, 1))
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +000010026 {
10027 return;
10028 }
10029
10030 switch (target)
10031 {
10032 case GL_TEXTURE_2D:
10033 {
10034 gl::Texture2D *texture2d = context->getTexture2D();
10035 texture2d->storage(levels, internalformat, width, height);
10036 }
10037 break;
10038
Geoff Lang01c21d22013-09-24 11:52:16 -040010039 case GL_TEXTURE_CUBE_MAP:
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +000010040 {
10041 gl::TextureCubeMap *textureCube = context->getTextureCubeMap();
10042 textureCube->storage(levels, internalformat, width);
10043 }
10044 break;
10045
10046 default:
10047 return gl::error(GL_INVALID_ENUM);
10048 }
10049 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +000010050 }
10051 catch(std::bad_alloc&)
10052 {
10053 return gl::error(GL_OUT_OF_MEMORY);
10054 }
10055}
10056
10057void __stdcall glTexStorage3D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth)
10058{
10059 EVENT("(GLenum target = 0x%X, GLsizei levels = %d, GLenum internalformat = 0x%X, GLsizei width = %d, "
10060 "GLsizei height = %d, GLsizei depth = %d)",
10061 target, levels, internalformat, width, height, depth);
10062
10063 try
10064 {
10065 gl::Context *context = gl::getNonLostContext();
10066
10067 if (context)
10068 {
10069 if (context->getClientVersion() < 3)
10070 {
10071 return gl::error(GL_INVALID_OPERATION);
10072 }
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +000010073
Geoff Lang34dbb6f2013-08-05 15:05:47 -040010074 if (!ValidateES3TexStorageParameters(context, target, levels, internalformat, width, height, depth))
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +000010075 {
10076 return;
10077 }
10078
10079 switch (target)
10080 {
10081 case GL_TEXTURE_3D:
10082 {
10083 gl::Texture3D *texture3d = context->getTexture3D();
10084 texture3d->storage(levels, internalformat, width, height, depth);
10085 }
10086 break;
10087
10088 case GL_TEXTURE_2D_ARRAY:
10089 {
10090 gl::Texture2DArray *texture2darray = context->getTexture2DArray();
10091 texture2darray->storage(levels, internalformat, width, height, depth);
10092 }
10093 break;
10094
10095 default:
Geoff Lang01c21d22013-09-24 11:52:16 -040010096 UNREACHABLE();
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +000010097 }
shannon.woods%transgaming.com@gtempaccount.com14eb55e2013-04-13 03:35:06 +000010098 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +000010099 }
10100 catch(std::bad_alloc&)
10101 {
10102 return gl::error(GL_OUT_OF_MEMORY);
10103 }
10104}
10105
10106void __stdcall glGetInternalformativ(GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize, GLint* params)
10107{
10108 EVENT("(GLenum target = 0x%X, GLenum internalformat = 0x%X, GLenum pname = 0x%X, GLsizei bufSize = %d, "
10109 "GLint* params = 0x%0.8p)",
10110 target, internalformat, pname, bufSize, params);
10111
10112 try
10113 {
10114 gl::Context *context = gl::getNonLostContext();
10115
10116 if (context)
10117 {
10118 if (context->getClientVersion() < 3)
10119 {
10120 return gl::error(GL_INVALID_OPERATION);
10121 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +000010122
Shannon Woods809d2502013-07-08 10:32:18 -040010123 if (!gl::IsColorRenderingSupported(internalformat, context) &&
10124 !gl::IsDepthRenderingSupported(internalformat, context) &&
10125 !gl::IsStencilRenderingSupported(internalformat, context))
10126 {
10127 return gl::error(GL_INVALID_ENUM);
10128 }
10129
10130 if (target != GL_RENDERBUFFER)
10131 {
10132 return gl::error(GL_INVALID_ENUM);
10133 }
10134
10135 if (bufSize < 0)
10136 {
10137 return gl::error(GL_INVALID_VALUE);
10138 }
10139
10140 switch (pname)
10141 {
10142 case GL_NUM_SAMPLE_COUNTS:
10143 if (bufSize != 0)
10144 *params = context->getNumSampleCounts(internalformat);
10145 break;
10146 case GL_SAMPLES:
10147 context->getSampleCounts(internalformat, bufSize, params);
10148 break;
10149 default:
10150 return gl::error(GL_INVALID_ENUM);
10151 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +000010152 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +000010153 }
10154 catch(std::bad_alloc&)
10155 {
10156 return gl::error(GL_OUT_OF_MEMORY);
10157 }
10158}
10159
10160// Extension functions
10161
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +000010162void __stdcall glBlitFramebufferANGLE(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1,
10163 GLbitfield mask, GLenum filter)
10164{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +000010165 EVENT("(GLint srcX0 = %d, GLint srcY0 = %d, GLint srcX1 = %d, GLint srcY1 = %d, "
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +000010166 "GLint dstX0 = %d, GLint dstY0 = %d, GLint dstX1 = %d, GLint dstY1 = %d, "
10167 "GLbitfield mask = 0x%X, GLenum filter = 0x%X)",
10168 srcX0, srcY0, srcX1, srcX1, dstX0, dstY0, dstX1, dstY1, mask, filter);
10169
10170 try
10171 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +000010172 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +000010173
10174 if (context)
10175 {
Geoff Lang34dbb6f2013-08-05 15:05:47 -040010176 if (!ValidateBlitFramebufferParameters(context, srcX0, srcY0, srcX1, srcY1,
Geoff Lang758d5b22013-06-11 11:42:50 -040010177 dstX0, dstY0, dstX1, dstY1, mask, filter,
10178 true))
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +000010179 {
Geoff Lang758d5b22013-06-11 11:42:50 -040010180 return;
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +000010181 }
10182
Geoff Lang758d5b22013-06-11 11:42:50 -040010183 context->blitFramebuffer(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1,
10184 mask, filter);
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +000010185 }
10186 }
10187 catch(std::bad_alloc&)
10188 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010189 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +000010190 }
10191}
10192
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +000010193void __stdcall glTexImage3DOES(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth,
10194 GLint border, GLenum format, GLenum type, const GLvoid* pixels)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000010195{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +000010196 EVENT("(GLenum target = 0x%X, GLint level = %d, GLenum internalformat = 0x%X, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +000010197 "GLsizei width = %d, GLsizei height = %d, GLsizei depth = %d, GLint border = %d, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +000010198 "GLenum format = 0x%X, GLenum type = 0x%x, const GLvoid* pixels = 0x%0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000010199 target, level, internalformat, width, height, depth, border, format, type, pixels);
10200
10201 try
10202 {
10203 UNIMPLEMENTED(); // FIXME
10204 }
10205 catch(std::bad_alloc&)
10206 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010207 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000010208 }
10209}
daniel@transgaming.comce3d0f22010-05-04 03:35:14 +000010210
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010211void __stdcall glGetProgramBinaryOES(GLuint program, GLsizei bufSize, GLsizei *length,
10212 GLenum *binaryFormat, void *binary)
10213{
apatrick@chromium.org90080e32012-07-09 22:15:33 +000010214 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 +000010215 program, bufSize, length, binaryFormat, binary);
10216
10217 try
10218 {
10219 gl::Context *context = gl::getNonLostContext();
10220
10221 if (context)
10222 {
10223 gl::Program *programObject = context->getProgram(program);
10224
daniel@transgaming.com716056c2012-07-24 18:38:59 +000010225 if (!programObject || !programObject->isLinked())
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010226 {
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
10230 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
10231
10232 if (!programBinary)
10233 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010234 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010235 }
10236
apatrick@chromium.org90080e32012-07-09 22:15:33 +000010237 if (!programBinary->save(binary, bufSize, length))
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010238 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010239 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010240 }
apatrick@chromium.org90080e32012-07-09 22:15:33 +000010241
10242 *binaryFormat = GL_PROGRAM_BINARY_ANGLE;
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010243 }
10244 }
10245 catch(std::bad_alloc&)
10246 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010247 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010248 }
10249}
10250
10251void __stdcall glProgramBinaryOES(GLuint program, GLenum binaryFormat,
10252 const void *binary, GLint length)
10253{
10254 EVENT("(GLenum program = 0x%X, binaryFormat = 0x%x, binary = 0x%0.8p, length = %d)",
10255 program, binaryFormat, binary, length);
10256
10257 try
10258 {
10259 gl::Context *context = gl::getNonLostContext();
10260
10261 if (context)
10262 {
10263 if (binaryFormat != GL_PROGRAM_BINARY_ANGLE)
10264 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010265 return gl::error(GL_INVALID_ENUM);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010266 }
10267
10268 gl::Program *programObject = context->getProgram(program);
10269
10270 if (!programObject)
10271 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010272 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010273 }
10274
daniel@transgaming.com95d29422012-07-24 18:36:10 +000010275 context->setProgramBinary(program, binary, length);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010276 }
10277 }
10278 catch(std::bad_alloc&)
10279 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010280 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010281 }
10282}
10283
shannon.woods%transgaming.com@gtempaccount.com4059a382013-04-13 03:31:16 +000010284void __stdcall glDrawBuffersEXT(GLsizei n, const GLenum *bufs)
10285{
10286 EVENT("(GLenum n = %d, bufs = 0x%0.8p)", n, bufs);
10287
10288 try
10289 {
10290 gl::Context *context = gl::getNonLostContext();
10291
10292 if (context)
10293 {
10294 if (n < 0 || (unsigned int)n > context->getMaximumRenderTargets())
10295 {
10296 return gl::error(GL_INVALID_VALUE);
10297 }
10298
10299 if (context->getDrawFramebufferHandle() == 0)
10300 {
shannon.woods%transgaming.com@gtempaccount.com2fa73c52013-04-13 03:37:20 +000010301 if (n != 1)
shannon.woods%transgaming.com@gtempaccount.com4059a382013-04-13 03:31:16 +000010302 {
10303 return gl::error(GL_INVALID_OPERATION);
10304 }
10305
shannon.woods%transgaming.com@gtempaccount.com2fa73c52013-04-13 03:37:20 +000010306 if (bufs[0] != GL_NONE && bufs[0] != GL_BACK)
shannon.woods%transgaming.com@gtempaccount.com4059a382013-04-13 03:31:16 +000010307 {
shannon.woods%transgaming.com@gtempaccount.com2fa73c52013-04-13 03:37:20 +000010308 return gl::error(GL_INVALID_OPERATION);
shannon.woods%transgaming.com@gtempaccount.com4059a382013-04-13 03:31:16 +000010309 }
10310 }
10311 else
10312 {
10313 for (int colorAttachment = 0; colorAttachment < n; colorAttachment++)
10314 {
10315 const GLenum attachment = GL_COLOR_ATTACHMENT0_EXT + colorAttachment;
10316 if (bufs[colorAttachment] != GL_NONE && bufs[colorAttachment] != attachment)
10317 {
10318 return gl::error(GL_INVALID_OPERATION);
10319 }
10320 }
10321 }
10322
10323 gl::Framebuffer *framebuffer = context->getDrawFramebuffer();
10324
10325 for (int colorAttachment = 0; colorAttachment < n; colorAttachment++)
10326 {
10327 framebuffer->setDrawBufferState(colorAttachment, bufs[colorAttachment]);
10328 }
shannon.woods%transgaming.com@gtempaccount.com2fa73c52013-04-13 03:37:20 +000010329
10330 for (int colorAttachment = n; colorAttachment < (int)context->getMaximumRenderTargets(); colorAttachment++)
10331 {
10332 framebuffer->setDrawBufferState(colorAttachment, GL_NONE);
10333 }
shannon.woods%transgaming.com@gtempaccount.com4059a382013-04-13 03:31:16 +000010334 }
10335 }
10336 catch (std::bad_alloc&)
10337 {
10338 return gl::error(GL_OUT_OF_MEMORY);
10339 }
10340}
10341
daniel@transgaming.comce3d0f22010-05-04 03:35:14 +000010342__eglMustCastToProperFunctionPointerType __stdcall glGetProcAddress(const char *procname)
10343{
10344 struct Extension
10345 {
10346 const char *name;
10347 __eglMustCastToProperFunctionPointerType address;
10348 };
10349
10350 static const Extension glExtensions[] =
10351 {
10352 {"glTexImage3DOES", (__eglMustCastToProperFunctionPointerType)glTexImage3DOES},
daniel@transgaming.com01868132010-08-24 19:21:17 +000010353 {"glBlitFramebufferANGLE", (__eglMustCastToProperFunctionPointerType)glBlitFramebufferANGLE},
daniel@transgaming.com1fe96c92011-01-14 15:08:44 +000010354 {"glRenderbufferStorageMultisampleANGLE", (__eglMustCastToProperFunctionPointerType)glRenderbufferStorageMultisampleANGLE},
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +000010355 {"glDeleteFencesNV", (__eglMustCastToProperFunctionPointerType)glDeleteFencesNV},
10356 {"glGenFencesNV", (__eglMustCastToProperFunctionPointerType)glGenFencesNV},
10357 {"glIsFenceNV", (__eglMustCastToProperFunctionPointerType)glIsFenceNV},
10358 {"glTestFenceNV", (__eglMustCastToProperFunctionPointerType)glTestFenceNV},
10359 {"glGetFenceivNV", (__eglMustCastToProperFunctionPointerType)glGetFenceivNV},
10360 {"glFinishFenceNV", (__eglMustCastToProperFunctionPointerType)glFinishFenceNV},
10361 {"glSetFenceNV", (__eglMustCastToProperFunctionPointerType)glSetFenceNV},
zmo@google.coma574f782011-10-03 21:45:23 +000010362 {"glGetTranslatedShaderSourceANGLE", (__eglMustCastToProperFunctionPointerType)glGetTranslatedShaderSourceANGLE},
daniel@transgaming.com0bd1f2f2011-11-11 04:19:03 +000010363 {"glTexStorage2DEXT", (__eglMustCastToProperFunctionPointerType)glTexStorage2DEXT},
daniel@transgaming.com709ed112011-11-12 03:18:10 +000010364 {"glGetGraphicsResetStatusEXT", (__eglMustCastToProperFunctionPointerType)glGetGraphicsResetStatusEXT},
10365 {"glReadnPixelsEXT", (__eglMustCastToProperFunctionPointerType)glReadnPixelsEXT},
10366 {"glGetnUniformfvEXT", (__eglMustCastToProperFunctionPointerType)glGetnUniformfvEXT},
10367 {"glGetnUniformivEXT", (__eglMustCastToProperFunctionPointerType)glGetnUniformivEXT},
daniel@transgaming.com86bdb822012-01-20 18:24:39 +000010368 {"glGenQueriesEXT", (__eglMustCastToProperFunctionPointerType)glGenQueriesEXT},
10369 {"glDeleteQueriesEXT", (__eglMustCastToProperFunctionPointerType)glDeleteQueriesEXT},
10370 {"glIsQueryEXT", (__eglMustCastToProperFunctionPointerType)glIsQueryEXT},
10371 {"glBeginQueryEXT", (__eglMustCastToProperFunctionPointerType)glBeginQueryEXT},
10372 {"glEndQueryEXT", (__eglMustCastToProperFunctionPointerType)glEndQueryEXT},
10373 {"glGetQueryivEXT", (__eglMustCastToProperFunctionPointerType)glGetQueryivEXT},
10374 {"glGetQueryObjectuivEXT", (__eglMustCastToProperFunctionPointerType)glGetQueryObjectuivEXT},
shannon.woods%transgaming.com@gtempaccount.com77d94722013-04-13 03:34:22 +000010375 {"glDrawBuffersEXT", (__eglMustCastToProperFunctionPointerType)glDrawBuffersEXT},
daniel@transgaming.comdce02fd2012-01-27 15:39:51 +000010376 {"glVertexAttribDivisorANGLE", (__eglMustCastToProperFunctionPointerType)glVertexAttribDivisorANGLE},
10377 {"glDrawArraysInstancedANGLE", (__eglMustCastToProperFunctionPointerType)glDrawArraysInstancedANGLE},
10378 {"glDrawElementsInstancedANGLE", (__eglMustCastToProperFunctionPointerType)glDrawElementsInstancedANGLE},
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010379 {"glGetProgramBinaryOES", (__eglMustCastToProperFunctionPointerType)glGetProgramBinaryOES},
10380 {"glProgramBinaryOES", (__eglMustCastToProperFunctionPointerType)glProgramBinaryOES}, };
daniel@transgaming.comce3d0f22010-05-04 03:35:14 +000010381
shannon.woods@transgaming.comd438fd42013-02-28 23:17:45 +000010382 for (unsigned int ext = 0; ext < ArraySize(glExtensions); ext++)
daniel@transgaming.comce3d0f22010-05-04 03:35:14 +000010383 {
10384 if (strcmp(procname, glExtensions[ext].name) == 0)
10385 {
10386 return (__eglMustCastToProperFunctionPointerType)glExtensions[ext].address;
10387 }
10388 }
10389
10390 return NULL;
10391}
10392
daniel@transgaming.com17f548c2011-11-09 17:47:02 +000010393// Non-public functions used by EGL
10394
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +000010395bool __stdcall glBindTexImage(egl::Surface *surface)
jbauman@chromium.orgae345802011-03-30 22:04:25 +000010396{
10397 EVENT("(egl::Surface* surface = 0x%0.8p)",
10398 surface);
10399
10400 try
10401 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +000010402 gl::Context *context = gl::getNonLostContext();
jbauman@chromium.orgae345802011-03-30 22:04:25 +000010403
10404 if (context)
10405 {
10406 gl::Texture2D *textureObject = context->getTexture2D();
10407
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +000010408 if (textureObject->isImmutable())
10409 {
10410 return false;
10411 }
10412
jbauman@chromium.orgae345802011-03-30 22:04:25 +000010413 if (textureObject)
10414 {
10415 textureObject->bindTexImage(surface);
10416 }
10417 }
10418 }
10419 catch(std::bad_alloc&)
10420 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010421 return gl::error(GL_OUT_OF_MEMORY, false);
jbauman@chromium.orgae345802011-03-30 22:04:25 +000010422 }
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +000010423
10424 return true;
jbauman@chromium.orgae345802011-03-30 22:04:25 +000010425}
10426
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000010427}