blob: 2834f21e926491530abd6e3b48e4f1571603ac7e [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"
Geoff Langc8058452014-02-03 12:04:11 -050025#include "libGLESv2/TransformFeedback.h"
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000026
Geoff Lange8ebe7f2013-08-05 15:03:13 -040027#include "libGLESv2/validationES.h"
28#include "libGLESv2/validationES2.h"
29#include "libGLESv2/validationES3.h"
Jamie Madill55856b12014-01-02 13:59:50 -050030#include "libGLESv2/queryconversions.h"
Jamie Madill478fdb22013-07-19 16:36:59 -040031
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000032extern "C"
33{
34
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +000035// OpenGL ES 2.0 functions
36
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000037void __stdcall glActiveTexture(GLenum texture)
38{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +000039 EVENT("(GLenum texture = 0x%X)", texture);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000040
41 try
42 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +000043 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000044
45 if (context)
46 {
daniel@transgaming.com3f74c7a2011-05-11 15:36:51 +000047 if (texture < GL_TEXTURE0 || texture > GL_TEXTURE0 + context->getMaximumCombinedTextureImageUnits() - 1)
48 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000049 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com3f74c7a2011-05-11 15:36:51 +000050 }
51
daniel@transgaming.com428d1582010-05-04 03:35:25 +000052 context->setActiveSampler(texture - GL_TEXTURE0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000053 }
54 }
55 catch(std::bad_alloc&)
56 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000057 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000058 }
59}
60
61void __stdcall glAttachShader(GLuint program, GLuint shader)
62{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +000063 EVENT("(GLuint program = %d, GLuint shader = %d)", program, shader);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000064
65 try
66 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +000067 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000068
69 if (context)
70 {
71 gl::Program *programObject = context->getProgram(program);
72 gl::Shader *shaderObject = context->getShader(shader);
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +000073
daniel@transgaming.come9d6ed02010-04-13 03:26:23 +000074 if (!programObject)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000075 {
daniel@transgaming.come9d6ed02010-04-13 03:26:23 +000076 if (context->getShader(program))
77 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000078 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.come9d6ed02010-04-13 03:26:23 +000079 }
80 else
81 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000082 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.come9d6ed02010-04-13 03:26:23 +000083 }
84 }
85
86 if (!shaderObject)
87 {
88 if (context->getProgram(shader))
89 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000090 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.come9d6ed02010-04-13 03:26:23 +000091 }
92 else
93 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000094 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.come9d6ed02010-04-13 03:26:23 +000095 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000096 }
97
98 if (!programObject->attachShader(shaderObject))
99 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000100 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000101 }
102 }
103 }
104 catch(std::bad_alloc&)
105 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000106 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000107 }
108}
109
daniel@transgaming.com86bdb822012-01-20 18:24:39 +0000110void __stdcall glBeginQueryEXT(GLenum target, GLuint id)
111{
112 EVENT("(GLenum target = 0x%X, GLuint %d)", target, id);
113
114 try
115 {
daniel@transgaming.com86bdb822012-01-20 18:24:39 +0000116 gl::Context *context = gl::getNonLostContext();
117
118 if (context)
119 {
Geoff Lang37dde692014-01-31 16:34:54 -0500120 if (!ValidQueryType(context, target))
121 {
122 return gl::error(GL_INVALID_ENUM);
123 }
124
125 if (id == 0)
126 {
127 return gl::error(GL_INVALID_OPERATION);
128 }
129
daniel@transgaming.com86bdb822012-01-20 18:24:39 +0000130 context->beginQuery(target, id);
131 }
132 }
133 catch(std::bad_alloc&)
134 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000135 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +0000136 }
137}
138
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +0000139void __stdcall glBindAttribLocation(GLuint program, GLuint index, const GLchar* name)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000140{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000141 EVENT("(GLuint program = %d, GLuint index = %d, const GLchar* name = 0x%0.8p)", program, index, name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000142
143 try
144 {
145 if (index >= gl::MAX_VERTEX_ATTRIBS)
146 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000147 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000148 }
149
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000150 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000151
152 if (context)
153 {
154 gl::Program *programObject = context->getProgram(program);
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +0000155
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000156 if (!programObject)
157 {
daniel@transgaming.com98079832010-04-13 03:26:29 +0000158 if (context->getShader(program))
159 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000160 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com98079832010-04-13 03:26:29 +0000161 }
162 else
163 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000164 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com98079832010-04-13 03:26:29 +0000165 }
166 }
167
168 if (strncmp(name, "gl_", 3) == 0)
169 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000170 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000171 }
172
173 programObject->bindAttributeLocation(index, name);
174 }
175 }
176 catch(std::bad_alloc&)
177 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000178 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000179 }
180}
181
182void __stdcall glBindBuffer(GLenum target, GLuint buffer)
183{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000184 EVENT("(GLenum target = 0x%X, GLuint buffer = %d)", target, buffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000185
186 try
187 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000188 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000189
190 if (context)
191 {
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +0000192 // Check ES3 specific targets
193 switch (target)
194 {
shannon.woods%transgaming.com@gtempaccount.com51171882013-04-13 03:39:10 +0000195 case GL_COPY_READ_BUFFER:
196 case GL_COPY_WRITE_BUFFER:
shannon.woods%transgaming.com@gtempaccount.comc926e5f2013-04-13 03:39:18 +0000197 case GL_PIXEL_PACK_BUFFER:
198 case GL_PIXEL_UNPACK_BUFFER:
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +0000199 case GL_UNIFORM_BUFFER:
200 case GL_TRANSFORM_FEEDBACK_BUFFER:
201 if (context->getClientVersion() < 3)
202 {
203 return gl::error(GL_INVALID_ENUM);
204 }
205 }
206
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000207 switch (target)
208 {
209 case GL_ARRAY_BUFFER:
210 context->bindArrayBuffer(buffer);
211 return;
212 case GL_ELEMENT_ARRAY_BUFFER:
213 context->bindElementArrayBuffer(buffer);
214 return;
shannon.woods%transgaming.com@gtempaccount.com51171882013-04-13 03:39:10 +0000215 case GL_COPY_READ_BUFFER:
216 context->bindCopyReadBuffer(buffer);
217 return;
218 case GL_COPY_WRITE_BUFFER:
219 context->bindCopyWriteBuffer(buffer);
220 return;
shannon.woods%transgaming.com@gtempaccount.comc926e5f2013-04-13 03:39:18 +0000221 case GL_PIXEL_PACK_BUFFER:
222 context->bindPixelPackBuffer(buffer);
223 return;
224 case GL_PIXEL_UNPACK_BUFFER:
225 context->bindPixelUnpackBuffer(buffer);
226 return;
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +0000227 case GL_UNIFORM_BUFFER:
228 context->bindGenericUniformBuffer(buffer);
229 return;
230 case GL_TRANSFORM_FEEDBACK_BUFFER:
shannonwoods@chromium.org7a1ebad2013-05-30 00:05:20 +0000231 context->bindGenericTransformFeedbackBuffer(buffer);
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +0000232 return;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000233 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000234 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000235 }
236 }
237 }
238 catch(std::bad_alloc&)
239 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000240 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000241 }
242}
243
244void __stdcall glBindFramebuffer(GLenum target, GLuint framebuffer)
245{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000246 EVENT("(GLenum target = 0x%X, GLuint framebuffer = %d)", target, framebuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000247
248 try
249 {
Jamie Madill1fc7e2c2014-01-21 16:47:10 -0500250 if (!gl::ValidFramebufferTarget(target))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000251 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000252 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000253 }
254
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000255 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000256
257 if (context)
258 {
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +0000259 if (target == GL_READ_FRAMEBUFFER_ANGLE || target == GL_FRAMEBUFFER)
260 {
261 context->bindReadFramebuffer(framebuffer);
262 }
263
264 if (target == GL_DRAW_FRAMEBUFFER_ANGLE || target == GL_FRAMEBUFFER)
265 {
266 context->bindDrawFramebuffer(framebuffer);
267 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000268 }
269 }
270 catch(std::bad_alloc&)
271 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000272 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000273 }
274}
275
276void __stdcall glBindRenderbuffer(GLenum target, GLuint renderbuffer)
277{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000278 EVENT("(GLenum target = 0x%X, GLuint renderbuffer = %d)", target, renderbuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000279
280 try
281 {
282 if (target != GL_RENDERBUFFER)
283 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000284 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000285 }
286
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000287 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000288
289 if (context)
290 {
291 context->bindRenderbuffer(renderbuffer);
292 }
293 }
294 catch(std::bad_alloc&)
295 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000296 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000297 }
298}
299
300void __stdcall glBindTexture(GLenum target, GLuint texture)
301{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000302 EVENT("(GLenum target = 0x%X, GLuint texture = %d)", target, texture);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000303
304 try
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 gl::Texture *textureObject = context->getTexture(texture);
311
312 if (textureObject && textureObject->getTarget() != target && texture != 0)
313 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000314 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000315 }
316
317 switch (target)
318 {
319 case GL_TEXTURE_2D:
320 context->bindTexture2D(texture);
321 return;
322 case GL_TEXTURE_CUBE_MAP:
323 context->bindTextureCubeMap(texture);
324 return;
shannon.woods%transgaming.com@gtempaccount.comc416e1c2013-04-13 03:45:05 +0000325 case GL_TEXTURE_3D:
326 if (context->getClientVersion() < 3)
327 {
328 return gl::error(GL_INVALID_ENUM);
329 }
330 context->bindTexture3D(texture);
331 return;
shannon.woods%transgaming.com@gtempaccount.com90dbc442013-04-13 03:46:14 +0000332 case GL_TEXTURE_2D_ARRAY:
333 if (context->getClientVersion() < 3)
334 {
335 return gl::error(GL_INVALID_ENUM);
336 }
337 context->bindTexture2DArray(texture);
338 return;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000339 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000340 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000341 }
342 }
343 }
344 catch(std::bad_alloc&)
345 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000346 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000347 }
348}
349
350void __stdcall glBlendColor(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha)
351{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000352 EVENT("(GLclampf red = %f, GLclampf green = %f, GLclampf blue = %f, GLclampf alpha = %f)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +0000353 red, green, blue, alpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000354
355 try
356 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000357 gl::Context* context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000358
359 if (context)
360 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +0000361 context->setBlendColor(gl::clamp01(red), gl::clamp01(green), gl::clamp01(blue), gl::clamp01(alpha));
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000362 }
363 }
364 catch(std::bad_alloc&)
365 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000366 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000367 }
368}
369
370void __stdcall glBlendEquation(GLenum mode)
371{
372 glBlendEquationSeparate(mode, mode);
373}
374
375void __stdcall glBlendEquationSeparate(GLenum modeRGB, GLenum modeAlpha)
376{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000377 EVENT("(GLenum modeRGB = 0x%X, GLenum modeAlpha = 0x%X)", modeRGB, modeAlpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000378
379 try
380 {
shannon.woods%transgaming.com@gtempaccount.com00b6a0e2013-04-13 03:38:00 +0000381 gl::Context *context = gl::getNonLostContext();
382
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000383 switch (modeRGB)
384 {
385 case GL_FUNC_ADD:
386 case GL_FUNC_SUBTRACT:
387 case GL_FUNC_REVERSE_SUBTRACT:
shannon.woods%transgaming.com@gtempaccount.com00b6a0e2013-04-13 03:38:00 +0000388 case GL_MIN:
389 case GL_MAX:
shannon.woods%transgaming.com@gtempaccount.com00b6a0e2013-04-13 03:38:00 +0000390 break;
391
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000392 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000393 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000394 }
395
396 switch (modeAlpha)
397 {
398 case GL_FUNC_ADD:
399 case GL_FUNC_SUBTRACT:
400 case GL_FUNC_REVERSE_SUBTRACT:
shannon.woods%transgaming.com@gtempaccount.com00b6a0e2013-04-13 03:38:00 +0000401 case GL_MIN:
402 case GL_MAX:
shannon.woods%transgaming.com@gtempaccount.com00b6a0e2013-04-13 03:38:00 +0000403 break;
404
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000405 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000406 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000407 }
408
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000409 if (context)
410 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +0000411 context->setBlendEquation(modeRGB, modeAlpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000412 }
413 }
414 catch(std::bad_alloc&)
415 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000416 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000417 }
418}
419
420void __stdcall glBlendFunc(GLenum sfactor, GLenum dfactor)
421{
422 glBlendFuncSeparate(sfactor, dfactor, sfactor, dfactor);
423}
424
425void __stdcall glBlendFuncSeparate(GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha)
426{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000427 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 +0000428 srcRGB, dstRGB, srcAlpha, dstAlpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000429
430 try
431 {
shannonwoods@chromium.org48ae0252013-05-30 00:13:22 +0000432 gl::Context *context = gl::getNonLostContext();
433
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000434 switch (srcRGB)
435 {
436 case GL_ZERO:
437 case GL_ONE:
438 case GL_SRC_COLOR:
439 case GL_ONE_MINUS_SRC_COLOR:
440 case GL_DST_COLOR:
441 case GL_ONE_MINUS_DST_COLOR:
442 case GL_SRC_ALPHA:
443 case GL_ONE_MINUS_SRC_ALPHA:
444 case GL_DST_ALPHA:
445 case GL_ONE_MINUS_DST_ALPHA:
446 case GL_CONSTANT_COLOR:
447 case GL_ONE_MINUS_CONSTANT_COLOR:
448 case GL_CONSTANT_ALPHA:
449 case GL_ONE_MINUS_CONSTANT_ALPHA:
450 case GL_SRC_ALPHA_SATURATE:
451 break;
452 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000453 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000454 }
455
456 switch (dstRGB)
457 {
458 case GL_ZERO:
459 case GL_ONE:
460 case GL_SRC_COLOR:
461 case GL_ONE_MINUS_SRC_COLOR:
462 case GL_DST_COLOR:
463 case GL_ONE_MINUS_DST_COLOR:
464 case GL_SRC_ALPHA:
465 case GL_ONE_MINUS_SRC_ALPHA:
466 case GL_DST_ALPHA:
467 case GL_ONE_MINUS_DST_ALPHA:
468 case GL_CONSTANT_COLOR:
469 case GL_ONE_MINUS_CONSTANT_COLOR:
470 case GL_CONSTANT_ALPHA:
471 case GL_ONE_MINUS_CONSTANT_ALPHA:
472 break;
shannonwoods@chromium.org48ae0252013-05-30 00:13:22 +0000473
474 case GL_SRC_ALPHA_SATURATE:
475 if (!context || context->getClientVersion() < 3)
476 {
477 return gl::error(GL_INVALID_ENUM);
478 }
479 break;
480
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000481 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000482 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000483 }
484
485 switch (srcAlpha)
486 {
487 case GL_ZERO:
488 case GL_ONE:
489 case GL_SRC_COLOR:
490 case GL_ONE_MINUS_SRC_COLOR:
491 case GL_DST_COLOR:
492 case GL_ONE_MINUS_DST_COLOR:
493 case GL_SRC_ALPHA:
494 case GL_ONE_MINUS_SRC_ALPHA:
495 case GL_DST_ALPHA:
496 case GL_ONE_MINUS_DST_ALPHA:
497 case GL_CONSTANT_COLOR:
498 case GL_ONE_MINUS_CONSTANT_COLOR:
499 case GL_CONSTANT_ALPHA:
500 case GL_ONE_MINUS_CONSTANT_ALPHA:
501 case GL_SRC_ALPHA_SATURATE:
502 break;
503 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000504 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000505 }
506
507 switch (dstAlpha)
508 {
509 case GL_ZERO:
510 case GL_ONE:
511 case GL_SRC_COLOR:
512 case GL_ONE_MINUS_SRC_COLOR:
513 case GL_DST_COLOR:
514 case GL_ONE_MINUS_DST_COLOR:
515 case GL_SRC_ALPHA:
516 case GL_ONE_MINUS_SRC_ALPHA:
517 case GL_DST_ALPHA:
518 case GL_ONE_MINUS_DST_ALPHA:
519 case GL_CONSTANT_COLOR:
520 case GL_ONE_MINUS_CONSTANT_COLOR:
521 case GL_CONSTANT_ALPHA:
522 case GL_ONE_MINUS_CONSTANT_ALPHA:
523 break;
shannonwoods@chromium.org48ae0252013-05-30 00:13:22 +0000524
525 case GL_SRC_ALPHA_SATURATE:
526 if (!context || context->getClientVersion() < 3)
527 {
528 return gl::error(GL_INVALID_ENUM);
529 }
530 break;
531
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000532 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000533 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000534 }
535
daniel@transgaming.comfe453652010-03-16 06:23:28 +0000536 bool constantColorUsed = (srcRGB == GL_CONSTANT_COLOR || srcRGB == GL_ONE_MINUS_CONSTANT_COLOR ||
537 dstRGB == GL_CONSTANT_COLOR || dstRGB == GL_ONE_MINUS_CONSTANT_COLOR);
538
539 bool constantAlphaUsed = (srcRGB == GL_CONSTANT_ALPHA || srcRGB == GL_ONE_MINUS_CONSTANT_ALPHA ||
540 dstRGB == GL_CONSTANT_ALPHA || dstRGB == GL_ONE_MINUS_CONSTANT_ALPHA);
541
542 if (constantColorUsed && constantAlphaUsed)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000543 {
daniel@transgaming.comfe453652010-03-16 06:23:28 +0000544 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 +0000545 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000546 }
547
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000548 if (context)
549 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +0000550 context->setBlendFactors(srcRGB, dstRGB, srcAlpha, dstAlpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000551 }
552 }
553 catch(std::bad_alloc&)
554 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000555 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000556 }
557}
558
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +0000559void __stdcall glBufferData(GLenum target, GLsizeiptr size, const GLvoid* data, GLenum usage)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000560{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000561 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 +0000562 target, size, data, usage);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000563
564 try
565 {
566 if (size < 0)
567 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000568 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000569 }
570
shannon.woods%transgaming.com@gtempaccount.comf2db40b2013-04-13 03:37:09 +0000571 gl::Context *context = gl::getNonLostContext();
572
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000573 switch (usage)
574 {
575 case GL_STREAM_DRAW:
576 case GL_STATIC_DRAW:
577 case GL_DYNAMIC_DRAW:
578 break;
shannon.woods%transgaming.com@gtempaccount.comf2db40b2013-04-13 03:37:09 +0000579
580 case GL_STREAM_READ:
581 case GL_STREAM_COPY:
582 case GL_STATIC_READ:
583 case GL_STATIC_COPY:
584 case GL_DYNAMIC_READ:
585 case GL_DYNAMIC_COPY:
586 if (context && context->getClientVersion() < 3)
587 {
588 return gl::error(GL_INVALID_ENUM);
589 }
590 break;
591
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000592 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000593 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000594 }
595
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000596 if (context)
597 {
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +0000598 // Check ES3 specific targets
599 switch (target)
600 {
shannon.woods%transgaming.com@gtempaccount.com51171882013-04-13 03:39:10 +0000601 case GL_COPY_READ_BUFFER:
602 case GL_COPY_WRITE_BUFFER:
shannon.woods%transgaming.com@gtempaccount.comc926e5f2013-04-13 03:39:18 +0000603 case GL_PIXEL_PACK_BUFFER:
604 case GL_PIXEL_UNPACK_BUFFER:
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +0000605 case GL_UNIFORM_BUFFER:
606 case GL_TRANSFORM_FEEDBACK_BUFFER:
607 if (context->getClientVersion() < 3)
608 {
609 return gl::error(GL_INVALID_ENUM);
610 }
611 }
612
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000613 gl::Buffer *buffer;
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +0000614
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000615 switch (target)
616 {
617 case GL_ARRAY_BUFFER:
618 buffer = context->getArrayBuffer();
619 break;
620 case GL_ELEMENT_ARRAY_BUFFER:
621 buffer = context->getElementArrayBuffer();
622 break;
shannon.woods%transgaming.com@gtempaccount.com51171882013-04-13 03:39:10 +0000623 case GL_COPY_READ_BUFFER:
624 buffer = context->getCopyReadBuffer();
625 break;
626 case GL_COPY_WRITE_BUFFER:
627 buffer = context->getCopyWriteBuffer();
628 break;
shannon.woods%transgaming.com@gtempaccount.comc926e5f2013-04-13 03:39:18 +0000629 case GL_PIXEL_PACK_BUFFER:
630 buffer = context->getPixelPackBuffer();
631 break;
632 case GL_PIXEL_UNPACK_BUFFER:
633 buffer = context->getPixelUnpackBuffer();
634 break;
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +0000635 case GL_TRANSFORM_FEEDBACK_BUFFER:
636 buffer = context->getGenericTransformFeedbackBuffer();
637 break;
638 case GL_UNIFORM_BUFFER:
639 buffer = context->getGenericUniformBuffer();
640 break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000641 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000642 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000643 }
644
645 if (!buffer)
646 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000647 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000648 }
649
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +0000650 buffer->bufferData(data, size, usage);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000651 }
652 }
653 catch(std::bad_alloc&)
654 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000655 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000656 }
657}
658
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +0000659void __stdcall glBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid* data)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000660{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000661 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 +0000662 target, offset, size, data);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000663
664 try
665 {
daniel@transgaming.comdefa1c32010-05-18 18:51:45 +0000666 if (size < 0 || offset < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000667 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000668 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000669 }
670
daniel@transgaming.comd4620a32010-03-21 04:31:28 +0000671 if (data == NULL)
672 {
673 return;
674 }
675
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000676 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +0000677
678 if (context)
679 {
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +0000680 // Check ES3 specific targets
681 switch (target)
682 {
shannon.woods%transgaming.com@gtempaccount.com51171882013-04-13 03:39:10 +0000683 case GL_COPY_READ_BUFFER:
684 case GL_COPY_WRITE_BUFFER:
shannon.woods%transgaming.com@gtempaccount.comc926e5f2013-04-13 03:39:18 +0000685 case GL_PIXEL_PACK_BUFFER:
686 case GL_PIXEL_UNPACK_BUFFER:
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +0000687 case GL_UNIFORM_BUFFER:
688 case GL_TRANSFORM_FEEDBACK_BUFFER:
689 if (context->getClientVersion() < 3)
690 {
691 return gl::error(GL_INVALID_ENUM);
692 }
693 }
694
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +0000695 gl::Buffer *buffer;
696
697 switch (target)
698 {
699 case GL_ARRAY_BUFFER:
700 buffer = context->getArrayBuffer();
701 break;
702 case GL_ELEMENT_ARRAY_BUFFER:
703 buffer = context->getElementArrayBuffer();
704 break;
shannon.woods%transgaming.com@gtempaccount.com51171882013-04-13 03:39:10 +0000705 case GL_COPY_READ_BUFFER:
706 buffer = context->getCopyReadBuffer();
707 break;
708 case GL_COPY_WRITE_BUFFER:
709 buffer = context->getCopyWriteBuffer();
710 break;
shannon.woods%transgaming.com@gtempaccount.comc926e5f2013-04-13 03:39:18 +0000711 case GL_PIXEL_PACK_BUFFER:
712 buffer = context->getPixelPackBuffer();
713 break;
714 case GL_PIXEL_UNPACK_BUFFER:
715 buffer = context->getPixelUnpackBuffer();
716 break;
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +0000717 case GL_TRANSFORM_FEEDBACK_BUFFER:
718 buffer = context->getGenericTransformFeedbackBuffer();
719 break;
720 case GL_UNIFORM_BUFFER:
721 buffer = context->getGenericUniformBuffer();
722 break;
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +0000723 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000724 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +0000725 }
726
727 if (!buffer)
728 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000729 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +0000730 }
731
daniel@transgaming.comdefa1c32010-05-18 18:51:45 +0000732 if ((size_t)size + offset > buffer->size())
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +0000733 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000734 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +0000735 }
daniel@transgaming.comdefa1c32010-05-18 18:51:45 +0000736
737 buffer->bufferSubData(data, size, offset);
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +0000738 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000739 }
740 catch(std::bad_alloc&)
741 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000742 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000743 }
744}
745
746GLenum __stdcall glCheckFramebufferStatus(GLenum target)
747{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000748 EVENT("(GLenum target = 0x%X)", target);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000749
750 try
751 {
Jamie Madill1fc7e2c2014-01-21 16:47:10 -0500752 if (!gl::ValidFramebufferTarget(target))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000753 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000754 return gl::error(GL_INVALID_ENUM, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000755 }
756
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000757 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000758
759 if (context)
760 {
Jamie Madill1fc7e2c2014-01-21 16:47:10 -0500761 gl::Framebuffer *framebuffer = context->getTargetFramebuffer(target);
762 ASSERT(framebuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000763 return framebuffer->completeness();
764 }
765 }
766 catch(std::bad_alloc&)
767 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000768 return gl::error(GL_OUT_OF_MEMORY, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000769 }
770
771 return 0;
772}
773
774void __stdcall glClear(GLbitfield mask)
775{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +0000776 EVENT("(GLbitfield mask = 0x%X)", mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000777
778 try
779 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000780 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000781
782 if (context)
783 {
Geoff Lang0b833232013-08-21 10:13:29 -0400784 gl::Framebuffer *framebufferObject = context->getDrawFramebuffer();
785
786 if (!framebufferObject || framebufferObject->completeness() != GL_FRAMEBUFFER_COMPLETE)
787 {
788 return gl::error(GL_INVALID_FRAMEBUFFER_OPERATION);
789 }
790
791 if ((mask & ~(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT)) != 0)
792 {
793 return gl::error(GL_INVALID_VALUE);
794 }
795
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000796 context->clear(mask);
797 }
798 }
799 catch(std::bad_alloc&)
800 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000801 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000802 }
803}
804
805void __stdcall glClearColor(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha)
806{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000807 EVENT("(GLclampf red = %f, GLclampf green = %f, GLclampf blue = %f, GLclampf alpha = %f)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +0000808 red, green, blue, alpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000809
810 try
811 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000812 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000813
814 if (context)
815 {
816 context->setClearColor(red, green, blue, alpha);
817 }
818 }
819 catch(std::bad_alloc&)
820 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000821 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000822 }
823}
824
825void __stdcall glClearDepthf(GLclampf depth)
826{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000827 EVENT("(GLclampf depth = %f)", depth);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000828
829 try
830 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000831 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000832
833 if (context)
834 {
835 context->setClearDepth(depth);
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 glClearStencil(GLint s)
845{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000846 EVENT("(GLint s = %d)", s);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000847
848 try
849 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000850 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000851
852 if (context)
853 {
854 context->setClearStencil(s);
855 }
856 }
857 catch(std::bad_alloc&)
858 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000859 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000860 }
861}
862
863void __stdcall glColorMask(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha)
864{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +0000865 EVENT("(GLboolean red = %d, GLboolean green = %u, GLboolean blue = %u, GLboolean alpha = %u)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +0000866 red, green, blue, alpha);
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 {
daniel@transgaming.coma36f98e2010-05-18 18:51:09 +0000874 context->setColorMask(red == GL_TRUE, green == GL_TRUE, blue == GL_TRUE, alpha == GL_TRUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000875 }
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 glCompileShader(GLuint shader)
884{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000885 EVENT("(GLuint shader = %d)", shader);
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 gl::Shader *shaderObject = context->getShader(shader);
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +0000894
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000895 if (!shaderObject)
896 {
daniel@transgaming.com0cefaf42010-04-13 03:26:36 +0000897 if (context->getProgram(shader))
898 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000899 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com0cefaf42010-04-13 03:26:36 +0000900 }
901 else
902 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000903 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com0cefaf42010-04-13 03:26:36 +0000904 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000905 }
906
907 shaderObject->compile();
908 }
909 }
910 catch(std::bad_alloc&)
911 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000912 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000913 }
914}
915
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +0000916void __stdcall glCompressedTexImage2D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height,
917 GLint border, GLsizei imageSize, const GLvoid* data)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000918{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000919 EVENT("(GLenum target = 0x%X, GLint level = %d, GLenum internalformat = 0x%X, GLsizei width = %d, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +0000920 "GLsizei height = %d, GLint border = %d, GLsizei imageSize = %d, const GLvoid* data = 0x%0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000921 target, level, internalformat, width, height, border, imageSize, data);
922
923 try
924 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000925 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com01868132010-08-24 19:21:17 +0000926
927 if (context)
928 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000929 if (context->getClientVersion() < 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -0400930 !ValidateES2TexImageParameters(context, target, level, internalformat, true, false,
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000931 0, 0, width, height, 0, GL_NONE, GL_NONE, data))
932 {
933 return;
934 }
935
936 if (context->getClientVersion() >= 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -0400937 !ValidateES3TexImageParameters(context, target, level, internalformat, true, false,
Jamie Madillefb2a6f2013-09-24 10:22:42 -0400938 0, 0, 0, width, height, 1, 0, GL_NONE, GL_NONE, data))
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000939 {
940 return;
941 }
942
943 if (imageSize < 0 || imageSize != (GLsizei)gl::GetBlockSize(internalformat, GL_UNSIGNED_BYTE, context->getClientVersion(), width, height))
daniel@transgaming.com5d752f22010-10-07 13:37:20 +0000944 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000945 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +0000946 }
947
948 switch (target)
949 {
950 case GL_TEXTURE_2D:
daniel@transgaming.com5d752f22010-10-07 13:37:20 +0000951 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000952 gl::Texture2D *texture = context->getTexture2D();
953 texture->setCompressedImage(level, internalformat, width, height, imageSize, data);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +0000954 }
955 break;
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000956
daniel@transgaming.com5d752f22010-10-07 13:37:20 +0000957 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
958 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
959 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
960 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
961 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
962 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
daniel@transgaming.com5d752f22010-10-07 13:37:20 +0000963 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000964 gl::TextureCubeMap *texture = context->getTextureCubeMap();
965 texture->setCompressedImage(target, level, internalformat, width, height, imageSize, data);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +0000966 }
967 break;
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000968
daniel@transgaming.com5d752f22010-10-07 13:37:20 +0000969 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000970 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +0000971 }
daniel@transgaming.com01868132010-08-24 19:21:17 +0000972 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000973 }
974 catch(std::bad_alloc&)
975 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000976 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000977 }
978}
979
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +0000980void __stdcall glCompressedTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height,
981 GLenum format, GLsizei imageSize, const GLvoid* data)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000982{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000983 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +0000984 "GLsizei width = %d, GLsizei height = %d, GLenum format = 0x%X, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +0000985 "GLsizei imageSize = %d, const GLvoid* data = 0x%0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000986 target, level, xoffset, yoffset, width, height, format, imageSize, data);
987
988 try
989 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000990 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com01868132010-08-24 19:21:17 +0000991
992 if (context)
993 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000994 if (context->getClientVersion() < 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -0400995 !ValidateES2TexImageParameters(context, target, level, GL_NONE, true, true,
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000996 xoffset, yoffset, width, height, 0, GL_NONE, GL_NONE, data))
997 {
998 return;
999 }
1000
1001 if (context->getClientVersion() >= 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -04001002 !ValidateES3TexImageParameters(context, target, level, GL_NONE, true, true,
Jamie Madillefb2a6f2013-09-24 10:22:42 -04001003 xoffset, yoffset, 0, width, height, 1, 0, GL_NONE, GL_NONE, data))
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001004 {
1005 return;
1006 }
1007
1008 if (imageSize < 0 || imageSize != (GLsizei)gl::GetBlockSize(format, GL_UNSIGNED_BYTE, context->getClientVersion(), width, height))
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001009 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001010 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001011 }
1012
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001013 switch (target)
daniel@transgaming.com01868132010-08-24 19:21:17 +00001014 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001015 case GL_TEXTURE_2D:
daniel@transgaming.com01868132010-08-24 19:21:17 +00001016 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001017 gl::Texture2D *texture = context->getTexture2D();
daniel@transgaming.com343373a2011-11-29 19:42:32 +00001018 texture->subImageCompressed(level, xoffset, yoffset, width, height, format, imageSize, data);
daniel@transgaming.com01868132010-08-24 19:21:17 +00001019 }
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001020 break;
1021
1022 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
1023 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
1024 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
1025 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
1026 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
1027 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
daniel@transgaming.com01868132010-08-24 19:21:17 +00001028 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001029 gl::TextureCubeMap *texture = context->getTextureCubeMap();
daniel@transgaming.com343373a2011-11-29 19:42:32 +00001030 texture->subImageCompressed(target, level, xoffset, yoffset, width, height, format, imageSize, data);
daniel@transgaming.com01868132010-08-24 19:21:17 +00001031 }
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001032 break;
1033
1034 default:
1035 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com01868132010-08-24 19:21:17 +00001036 }
1037 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001038 }
1039 catch(std::bad_alloc&)
1040 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001041 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001042 }
1043}
1044
1045void __stdcall glCopyTexImage2D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border)
1046{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001047 EVENT("(GLenum target = 0x%X, GLint level = %d, GLenum internalformat = 0x%X, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001048 "GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d, GLint border = %d)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001049 target, level, internalformat, x, y, width, height, border);
1050
1051 try
1052 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001053 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001054
1055 if (context)
1056 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001057 if (context->getClientVersion() < 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -04001058 !ValidateES2CopyTexImageParameters(context, target, level, internalformat, false,
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001059 0, 0, x, y, width, height, border))
daniel@transgaming.com32b11442011-11-19 02:42:48 +00001060 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001061 return;
daniel@transgaming.com32b11442011-11-19 02:42:48 +00001062 }
1063
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001064 if (context->getClientVersion() >= 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -04001065 !ValidateES3CopyTexImageParameters(context, target, level, internalformat, false,
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001066 0, 0, 0, x, y, width, height, border))
1067 {
1068 return;
1069 }
1070
1071 gl::Framebuffer *framebuffer = context->getReadFramebuffer();
1072
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001073 switch (target)
1074 {
1075 case GL_TEXTURE_2D:
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001076 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001077 gl::Texture2D *texture = context->getTexture2D();
1078 texture->copyImage(level, internalformat, x, y, width, height, framebuffer);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001079 }
1080 break;
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001081
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001082 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
1083 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
1084 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
1085 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
1086 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
1087 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001088 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001089 gl::TextureCubeMap *texture = context->getTextureCubeMap();
1090 texture->copyImage(target, level, internalformat, x, y, width, height, framebuffer);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001091 }
1092 break;
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001093
1094 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001095 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001096 }
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001097 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001098 }
1099 catch(std::bad_alloc&)
1100 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001101 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001102 }
1103}
1104
1105void __stdcall glCopyTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height)
1106{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001107 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001108 "GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001109 target, level, xoffset, yoffset, x, y, width, height);
1110
1111 try
1112 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001113 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001114
1115 if (context)
1116 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001117 if (context->getClientVersion() < 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -04001118 !ValidateES2CopyTexImageParameters(context, target, level, GL_NONE, true,
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001119 xoffset, yoffset, x, y, width, height, 0))
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001120 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001121 return;
1122 }
1123
1124 if (context->getClientVersion() >= 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -04001125 !ValidateES3CopyTexImageParameters(context, target, level, GL_NONE, true,
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001126 xoffset, yoffset, 0, x, y, width, height, 0))
1127 {
1128 return;
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001129 }
1130
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00001131 gl::Framebuffer *framebuffer = context->getReadFramebuffer();
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001132
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001133 switch (target)
daniel@transgaming.combbc57792010-07-28 19:21:05 +00001134 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001135 case GL_TEXTURE_2D:
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +00001136 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001137 gl::Texture2D *texture = context->getTexture2D();
1138 texture->copySubImage(target, level, xoffset, yoffset, 0, x, y, width, height, framebuffer);
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001139 }
1140 break;
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001141
1142 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
1143 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
1144 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
1145 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
1146 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
1147 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00001148 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001149 gl::TextureCubeMap *texture = context->getTextureCubeMap();
1150 texture->copySubImage(target, level, xoffset, yoffset, 0, x, y, width, height, framebuffer);
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00001151 }
1152 break;
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001153
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001154 default:
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001155 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001156 }
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001157 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001158 }
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001159
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001160 catch(std::bad_alloc&)
1161 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001162 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001163 }
1164}
1165
1166GLuint __stdcall glCreateProgram(void)
1167{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001168 EVENT("()");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001169
1170 try
1171 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001172 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001173
1174 if (context)
1175 {
1176 return context->createProgram();
1177 }
1178 }
1179 catch(std::bad_alloc&)
1180 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001181 return gl::error(GL_OUT_OF_MEMORY, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001182 }
1183
1184 return 0;
1185}
1186
1187GLuint __stdcall glCreateShader(GLenum type)
1188{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001189 EVENT("(GLenum type = 0x%X)", type);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001190
1191 try
1192 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001193 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001194
1195 if (context)
1196 {
1197 switch (type)
1198 {
1199 case GL_FRAGMENT_SHADER:
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00001200 case GL_VERTEX_SHADER:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001201 return context->createShader(type);
1202 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001203 return gl::error(GL_INVALID_ENUM, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001204 }
1205 }
1206 }
1207 catch(std::bad_alloc&)
1208 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001209 return gl::error(GL_OUT_OF_MEMORY, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001210 }
1211
1212 return 0;
1213}
1214
1215void __stdcall glCullFace(GLenum mode)
1216{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001217 EVENT("(GLenum mode = 0x%X)", mode);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001218
1219 try
1220 {
1221 switch (mode)
1222 {
1223 case GL_FRONT:
1224 case GL_BACK:
1225 case GL_FRONT_AND_BACK:
1226 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001227 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001228
1229 if (context)
1230 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00001231 context->setCullMode(mode);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001232 }
1233 }
1234 break;
1235 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001236 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001237 }
1238 }
1239 catch(std::bad_alloc&)
1240 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001241 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001242 }
1243}
1244
1245void __stdcall glDeleteBuffers(GLsizei n, const GLuint* buffers)
1246{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001247 EVENT("(GLsizei n = %d, const GLuint* buffers = 0x%0.8p)", n, buffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001248
1249 try
1250 {
1251 if (n < 0)
1252 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001253 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001254 }
1255
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001256 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001257
1258 if (context)
1259 {
1260 for (int i = 0; i < n; i++)
1261 {
1262 context->deleteBuffer(buffers[i]);
1263 }
1264 }
1265 }
1266 catch(std::bad_alloc&)
1267 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001268 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001269 }
1270}
1271
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001272void __stdcall glDeleteFencesNV(GLsizei n, const GLuint* fences)
1273{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001274 EVENT("(GLsizei n = %d, const GLuint* fences = 0x%0.8p)", n, fences);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001275
1276 try
1277 {
1278 if (n < 0)
1279 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001280 return gl::error(GL_INVALID_VALUE);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001281 }
1282
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001283 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001284
1285 if (context)
1286 {
1287 for (int i = 0; i < n; i++)
1288 {
Jamie Madill33dc8432013-07-26 11:55:05 -04001289 context->deleteFenceNV(fences[i]);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001290 }
1291 }
1292 }
1293 catch(std::bad_alloc&)
1294 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001295 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001296 }
1297}
1298
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001299void __stdcall glDeleteFramebuffers(GLsizei n, const GLuint* framebuffers)
1300{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001301 EVENT("(GLsizei n = %d, const GLuint* framebuffers = 0x%0.8p)", n, framebuffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001302
1303 try
1304 {
1305 if (n < 0)
1306 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001307 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001308 }
1309
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001310 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001311
1312 if (context)
1313 {
1314 for (int i = 0; i < n; i++)
1315 {
1316 if (framebuffers[i] != 0)
1317 {
1318 context->deleteFramebuffer(framebuffers[i]);
1319 }
1320 }
1321 }
1322 }
1323 catch(std::bad_alloc&)
1324 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001325 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001326 }
1327}
1328
1329void __stdcall glDeleteProgram(GLuint program)
1330{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001331 EVENT("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001332
1333 try
1334 {
daniel@transgaming.com75401e62010-04-13 03:26:39 +00001335 if (program == 0)
1336 {
1337 return;
1338 }
1339
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001340 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001341
1342 if (context)
1343 {
daniel@transgaming.com75401e62010-04-13 03:26:39 +00001344 if (!context->getProgram(program))
1345 {
1346 if(context->getShader(program))
1347 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001348 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com75401e62010-04-13 03:26:39 +00001349 }
1350 else
1351 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001352 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com75401e62010-04-13 03:26:39 +00001353 }
1354 }
1355
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001356 context->deleteProgram(program);
1357 }
1358 }
1359 catch(std::bad_alloc&)
1360 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001361 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001362 }
1363}
1364
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00001365void __stdcall glDeleteQueriesEXT(GLsizei n, const GLuint *ids)
1366{
1367 EVENT("(GLsizei n = %d, const GLuint *ids = 0x%0.8p)", n, ids);
1368
1369 try
1370 {
1371 if (n < 0)
1372 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001373 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00001374 }
1375
1376 gl::Context *context = gl::getNonLostContext();
1377
1378 if (context)
1379 {
1380 for (int i = 0; i < n; i++)
1381 {
1382 context->deleteQuery(ids[i]);
1383 }
1384 }
1385 }
1386 catch(std::bad_alloc&)
1387 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001388 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00001389 }
1390}
1391
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001392void __stdcall glDeleteRenderbuffers(GLsizei n, const GLuint* renderbuffers)
1393{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001394 EVENT("(GLsizei n = %d, const GLuint* renderbuffers = 0x%0.8p)", n, renderbuffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001395
1396 try
1397 {
1398 if (n < 0)
1399 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001400 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001401 }
1402
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001403 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001404
1405 if (context)
1406 {
daniel@transgaming.come2b22122010-03-11 19:22:14 +00001407 for (int i = 0; i < n; i++)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001408 {
1409 context->deleteRenderbuffer(renderbuffers[i]);
1410 }
1411 }
1412 }
1413 catch(std::bad_alloc&)
1414 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001415 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001416 }
1417}
1418
1419void __stdcall glDeleteShader(GLuint shader)
1420{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001421 EVENT("(GLuint shader = %d)", shader);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001422
1423 try
1424 {
daniel@transgaming.com75401e62010-04-13 03:26:39 +00001425 if (shader == 0)
1426 {
1427 return;
1428 }
1429
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001430 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001431
1432 if (context)
1433 {
daniel@transgaming.com75401e62010-04-13 03:26:39 +00001434 if (!context->getShader(shader))
1435 {
1436 if(context->getProgram(shader))
1437 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001438 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com75401e62010-04-13 03:26:39 +00001439 }
1440 else
1441 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001442 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com75401e62010-04-13 03:26:39 +00001443 }
1444 }
1445
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001446 context->deleteShader(shader);
1447 }
1448 }
1449 catch(std::bad_alloc&)
1450 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001451 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001452 }
1453}
1454
1455void __stdcall glDeleteTextures(GLsizei n, const GLuint* textures)
1456{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001457 EVENT("(GLsizei n = %d, const GLuint* textures = 0x%0.8p)", n, textures);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001458
1459 try
1460 {
1461 if (n < 0)
1462 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001463 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001464 }
1465
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001466 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001467
1468 if (context)
1469 {
1470 for (int i = 0; i < n; i++)
1471 {
1472 if (textures[i] != 0)
1473 {
1474 context->deleteTexture(textures[i]);
1475 }
1476 }
1477 }
1478 }
1479 catch(std::bad_alloc&)
1480 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001481 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001482 }
1483}
1484
1485void __stdcall glDepthFunc(GLenum func)
1486{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001487 EVENT("(GLenum func = 0x%X)", func);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001488
1489 try
1490 {
1491 switch (func)
1492 {
1493 case GL_NEVER:
1494 case GL_ALWAYS:
1495 case GL_LESS:
1496 case GL_LEQUAL:
1497 case GL_EQUAL:
1498 case GL_GREATER:
1499 case GL_GEQUAL:
1500 case GL_NOTEQUAL:
1501 break;
1502 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001503 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001504 }
1505
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001506 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001507
1508 if (context)
1509 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00001510 context->setDepthFunc(func);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001511 }
1512 }
1513 catch(std::bad_alloc&)
1514 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001515 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001516 }
1517}
1518
1519void __stdcall glDepthMask(GLboolean flag)
1520{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00001521 EVENT("(GLboolean flag = %u)", flag);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001522
1523 try
1524 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001525 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001526
1527 if (context)
1528 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00001529 context->setDepthMask(flag != GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001530 }
1531 }
1532 catch(std::bad_alloc&)
1533 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001534 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001535 }
1536}
1537
1538void __stdcall glDepthRangef(GLclampf zNear, GLclampf zFar)
1539{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001540 EVENT("(GLclampf zNear = %f, GLclampf zFar = %f)", zNear, zFar);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001541
1542 try
1543 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001544 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001545
1546 if (context)
1547 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00001548 context->setDepthRange(zNear, zFar);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001549 }
1550 }
1551 catch(std::bad_alloc&)
1552 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001553 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001554 }
1555}
1556
1557void __stdcall glDetachShader(GLuint program, GLuint shader)
1558{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001559 EVENT("(GLuint program = %d, GLuint shader = %d)", program, shader);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001560
1561 try
1562 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001563 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001564
1565 if (context)
1566 {
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00001567
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001568 gl::Program *programObject = context->getProgram(program);
1569 gl::Shader *shaderObject = context->getShader(shader);
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00001570
1571 if (!programObject)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001572 {
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00001573 gl::Shader *shaderByProgramHandle;
1574 shaderByProgramHandle = context->getShader(program);
1575 if (!shaderByProgramHandle)
1576 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001577 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00001578 }
1579 else
1580 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001581 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00001582 }
1583 }
1584
1585 if (!shaderObject)
1586 {
1587 gl::Program *programByShaderHandle = context->getProgram(shader);
1588 if (!programByShaderHandle)
1589 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001590 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00001591 }
1592 else
1593 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001594 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00001595 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001596 }
1597
1598 if (!programObject->detachShader(shaderObject))
1599 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001600 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001601 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001602 }
1603 }
1604 catch(std::bad_alloc&)
1605 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001606 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001607 }
1608}
1609
1610void __stdcall glDisable(GLenum cap)
1611{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001612 EVENT("(GLenum cap = 0x%X)", cap);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001613
1614 try
1615 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001616 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001617
1618 if (context)
1619 {
Geoff Lang0550d032014-01-30 11:29:07 -05001620 if (!ValidCap(context, cap))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001621 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001622 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001623 }
Geoff Lang0550d032014-01-30 11:29:07 -05001624
1625 context->setCap(cap, false);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001626 }
1627 }
1628 catch(std::bad_alloc&)
1629 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001630 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001631 }
1632}
1633
1634void __stdcall glDisableVertexAttribArray(GLuint index)
1635{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001636 EVENT("(GLuint index = %d)", index);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001637
1638 try
1639 {
1640 if (index >= gl::MAX_VERTEX_ATTRIBS)
1641 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001642 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001643 }
1644
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001645 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001646
1647 if (context)
1648 {
daniel@transgaming.com83921382011-01-08 05:46:00 +00001649 context->setEnableVertexAttribArray(index, false);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001650 }
1651 }
1652 catch(std::bad_alloc&)
1653 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001654 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001655 }
1656}
1657
1658void __stdcall glDrawArrays(GLenum mode, GLint first, GLsizei count)
1659{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001660 EVENT("(GLenum mode = 0x%X, GLint first = %d, GLsizei count = %d)", mode, first, count);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001661
1662 try
1663 {
1664 if (count < 0 || first < 0)
1665 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001666 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001667 }
1668
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001669 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001670
1671 if (context)
1672 {
Geoff Langeeba6e12014-02-03 13:12:30 -05001673 gl::TransformFeedback *curTransformFeedback = context->getCurrentTransformFeedback();
1674 if (curTransformFeedback && curTransformFeedback->isStarted() && !curTransformFeedback->isPaused() &&
1675 curTransformFeedback->getDrawMode() != mode)
1676 {
1677 // It is an invalid operation to call DrawArrays or DrawArraysInstanced with a draw mode
1678 // that does not match the current transform feedback object's draw mode (if transform feedback
1679 // is active), (3.0.2, section 2.14, pg 86)
1680 return gl::error(GL_INVALID_OPERATION);
1681 }
1682
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00001683 context->drawArrays(mode, first, count, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001684 }
1685 }
1686 catch(std::bad_alloc&)
1687 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001688 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001689 }
1690}
1691
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001692void __stdcall glDrawArraysInstancedANGLE(GLenum mode, GLint first, GLsizei count, GLsizei primcount)
1693{
1694 EVENT("(GLenum mode = 0x%X, GLint first = %d, GLsizei count = %d, GLsizei primcount = %d)", mode, first, count, primcount);
1695
1696 try
1697 {
1698 if (count < 0 || first < 0 || primcount < 0)
1699 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001700 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001701 }
1702
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00001703 if (primcount > 0)
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001704 {
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00001705 gl::Context *context = gl::getNonLostContext();
1706
1707 if (context)
1708 {
Geoff Langeeba6e12014-02-03 13:12:30 -05001709 gl::TransformFeedback *curTransformFeedback = context->getCurrentTransformFeedback();
1710 if (curTransformFeedback && curTransformFeedback->isStarted() && !curTransformFeedback->isPaused() &&
1711 curTransformFeedback->getDrawMode() != mode)
1712 {
1713 // It is an invalid operation to call DrawArrays or DrawArraysInstanced with a draw mode
1714 // that does not match the current transform feedback object's draw mode (if transform feedback
1715 // is active), (3.0.2, section 2.14, pg 86)
1716 return gl::error(GL_INVALID_OPERATION);
1717 }
1718
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00001719 context->drawArrays(mode, first, count, primcount);
1720 }
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001721 }
1722 }
1723 catch(std::bad_alloc&)
1724 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001725 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001726 }
1727}
1728
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00001729void __stdcall glDrawElements(GLenum mode, GLsizei count, GLenum type, const GLvoid* indices)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001730{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001731 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 +00001732 mode, count, type, indices);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001733
1734 try
1735 {
1736 if (count < 0)
1737 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001738 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001739 }
1740
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001741 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001742
1743 if (context)
1744 {
daniel@transgaming.com83921382011-01-08 05:46:00 +00001745 switch (type)
1746 {
1747 case GL_UNSIGNED_BYTE:
1748 case GL_UNSIGNED_SHORT:
1749 break;
1750 case GL_UNSIGNED_INT:
1751 if (!context->supports32bitIndices())
1752 {
Geoff Langeeba6e12014-02-03 13:12:30 -05001753 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com83921382011-01-08 05:46:00 +00001754 }
1755 break;
1756 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001757 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com83921382011-01-08 05:46:00 +00001758 }
Geoff Langeeba6e12014-02-03 13:12:30 -05001759
1760 gl::TransformFeedback *curTransformFeedback = context->getCurrentTransformFeedback();
1761 if (curTransformFeedback && curTransformFeedback->isStarted() && !curTransformFeedback->isPaused())
1762 {
1763 // It is an invalid operation to call DrawElements, DrawRangeElements or DrawElementsInstanced
1764 // while transform feedback is active, (3.0.2, section 2.14, pg 86)
1765 return gl::error(GL_INVALID_OPERATION);
1766 }
1767
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00001768 context->drawElements(mode, count, type, indices, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001769 }
1770 }
1771 catch(std::bad_alloc&)
1772 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001773 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001774 }
1775}
1776
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001777void __stdcall glDrawElementsInstancedANGLE(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLsizei primcount)
1778{
1779 EVENT("(GLenum mode = 0x%X, GLsizei count = %d, GLenum type = 0x%X, const GLvoid* indices = 0x%0.8p, GLsizei primcount = %d)",
1780 mode, count, type, indices, primcount);
1781
1782 try
1783 {
1784 if (count < 0 || primcount < 0)
1785 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001786 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001787 }
1788
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00001789 if (primcount > 0)
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001790 {
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00001791 gl::Context *context = gl::getNonLostContext();
1792
1793 if (context)
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001794 {
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00001795 switch (type)
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001796 {
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00001797 case GL_UNSIGNED_BYTE:
1798 case GL_UNSIGNED_SHORT:
1799 break;
1800 case GL_UNSIGNED_INT:
1801 if (!context->supports32bitIndices())
1802 {
Geoff Langeeba6e12014-02-03 13:12:30 -05001803 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00001804 }
1805 break;
1806 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001807 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001808 }
Geoff Langeeba6e12014-02-03 13:12:30 -05001809
1810 gl::TransformFeedback *curTransformFeedback = context->getCurrentTransformFeedback();
1811 if (curTransformFeedback && curTransformFeedback->isStarted() && !curTransformFeedback->isPaused())
1812 {
1813 // It is an invalid operation to call DrawElements, DrawRangeElements or DrawElementsInstanced
1814 // while transform feedback is active, (3.0.2, section 2.14, pg 86)
1815 return gl::error(GL_INVALID_OPERATION);
1816 }
1817
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00001818 context->drawElements(mode, count, type, indices, primcount);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001819 }
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001820 }
1821 }
1822 catch(std::bad_alloc&)
1823 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001824 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001825 }
1826}
1827
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001828void __stdcall glEnable(GLenum cap)
1829{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001830 EVENT("(GLenum cap = 0x%X)", cap);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001831
1832 try
1833 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001834 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001835
1836 if (context)
1837 {
Geoff Lang0550d032014-01-30 11:29:07 -05001838 if (!ValidCap(context, cap))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001839 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001840 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001841 }
Geoff Lang0550d032014-01-30 11:29:07 -05001842
1843 context->setCap(cap, true);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001844 }
1845 }
1846 catch(std::bad_alloc&)
1847 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001848 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001849 }
1850}
1851
1852void __stdcall glEnableVertexAttribArray(GLuint index)
1853{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001854 EVENT("(GLuint index = %d)", index);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001855
1856 try
1857 {
1858 if (index >= gl::MAX_VERTEX_ATTRIBS)
1859 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001860 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001861 }
1862
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001863 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001864
1865 if (context)
1866 {
daniel@transgaming.com83921382011-01-08 05:46:00 +00001867 context->setEnableVertexAttribArray(index, true);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001868 }
1869 }
1870 catch(std::bad_alloc&)
1871 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001872 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001873 }
1874}
1875
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00001876void __stdcall glEndQueryEXT(GLenum target)
1877{
1878 EVENT("GLenum target = 0x%X)", target);
1879
1880 try
1881 {
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00001882 gl::Context *context = gl::getNonLostContext();
1883
1884 if (context)
1885 {
Geoff Lang37dde692014-01-31 16:34:54 -05001886 if (!ValidQueryType(context, target))
1887 {
1888 return gl::error(GL_INVALID_ENUM);
1889 }
1890
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00001891 context->endQuery(target);
1892 }
1893 }
1894 catch(std::bad_alloc&)
1895 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001896 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00001897 }
1898}
1899
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001900void __stdcall glFinishFenceNV(GLuint fence)
1901{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001902 EVENT("(GLuint fence = %d)", fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001903
1904 try
1905 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001906 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001907
1908 if (context)
1909 {
Jamie Madill33dc8432013-07-26 11:55:05 -04001910 gl::FenceNV *fenceObject = context->getFenceNV(fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001911
1912 if (fenceObject == NULL)
1913 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001914 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001915 }
1916
Jamie Madillfb9a7402013-07-26 11:55:01 -04001917 if (fenceObject->isFence() != GL_TRUE)
1918 {
1919 return gl::error(GL_INVALID_OPERATION);
1920 }
1921
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001922 fenceObject->finishFence();
1923 }
1924 }
1925 catch(std::bad_alloc&)
1926 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001927 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001928 }
1929}
1930
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001931void __stdcall glFinish(void)
1932{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001933 EVENT("()");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001934
1935 try
1936 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001937 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001938
1939 if (context)
1940 {
daniel@transgaming.com0d86aa72011-10-26 02:35:10 +00001941 context->sync(true);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001942 }
1943 }
1944 catch(std::bad_alloc&)
1945 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001946 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001947 }
1948}
1949
1950void __stdcall glFlush(void)
1951{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001952 EVENT("()");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001953
1954 try
1955 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001956 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001957
1958 if (context)
1959 {
daniel@transgaming.com0d86aa72011-10-26 02:35:10 +00001960 context->sync(false);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001961 }
1962 }
1963 catch(std::bad_alloc&)
1964 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001965 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001966 }
1967}
1968
1969void __stdcall glFramebufferRenderbuffer(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer)
1970{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001971 EVENT("(GLenum target = 0x%X, GLenum attachment = 0x%X, GLenum renderbuffertarget = 0x%X, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001972 "GLuint renderbuffer = %d)", target, attachment, renderbuffertarget, renderbuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001973
1974 try
1975 {
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05001976 if (!gl::ValidFramebufferTarget(target) || (renderbuffertarget != GL_RENDERBUFFER && renderbuffer != 0))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001977 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001978 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001979 }
1980
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001981 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001982
1983 if (context)
1984 {
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05001985 if (!gl::ValidateFramebufferRenderbufferParameters(context, target, attachment, renderbuffertarget, renderbuffer))
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00001986 {
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05001987 return;
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00001988 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001989
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05001990 gl::Framebuffer *framebuffer = context->getTargetFramebuffer(target);
1991 ASSERT(framebuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001992
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00001993 if (attachment >= GL_COLOR_ATTACHMENT0_EXT && attachment <= GL_COLOR_ATTACHMENT15_EXT)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001994 {
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05001995 unsigned int colorAttachment = (attachment - GL_COLOR_ATTACHMENT0_EXT);
Geoff Lang309c92a2013-07-25 16:23:19 -04001996 framebuffer->setColorbuffer(colorAttachment, GL_RENDERBUFFER, renderbuffer, 0, 0);
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00001997 }
1998 else
1999 {
2000 switch (attachment)
2001 {
2002 case GL_DEPTH_ATTACHMENT:
Geoff Lang309c92a2013-07-25 16:23:19 -04002003 framebuffer->setDepthbuffer(GL_RENDERBUFFER, renderbuffer, 0, 0);
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002004 break;
2005 case GL_STENCIL_ATTACHMENT:
Geoff Lang309c92a2013-07-25 16:23:19 -04002006 framebuffer->setStencilbuffer(GL_RENDERBUFFER, renderbuffer, 0, 0);
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002007 break;
Geoff Lang7e9ee232013-08-05 10:18:42 -04002008 case GL_DEPTH_STENCIL_ATTACHMENT:
Geoff Lang7e9ee232013-08-05 10:18:42 -04002009 framebuffer->setDepthStencilBuffer(GL_RENDERBUFFER, renderbuffer, 0, 0);
2010 break;
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002011 default:
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05002012 UNREACHABLE();
2013 break;
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002014 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002015 }
2016 }
2017 }
2018 catch(std::bad_alloc&)
2019 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002020 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002021 }
2022}
2023
2024void __stdcall glFramebufferTexture2D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level)
2025{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002026 EVENT("(GLenum target = 0x%X, GLenum attachment = 0x%X, GLenum textarget = 0x%X, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00002027 "GLuint texture = %d, GLint level = %d)", target, attachment, textarget, texture, level);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002028
2029 try
2030 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002031 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002032 if (context)
2033 {
Geoff Lang3ed0c482013-07-25 17:03:18 -04002034 if (context->getClientVersion() < 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -04002035 !ValidateES2FramebufferTextureParameters(context, target, attachment, textarget, texture, level))
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002036 {
Geoff Lang3ed0c482013-07-25 17:03:18 -04002037 return;
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002038 }
Geoff Lang3ed0c482013-07-25 17:03:18 -04002039
2040 if (context->getClientVersion() >= 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -04002041 !ValidateES3FramebufferTextureParameters(context, target, attachment, textarget, texture, level, 0, false))
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002042 {
Geoff Lang3ed0c482013-07-25 17:03:18 -04002043 return;
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002044 }
2045
daniel@transgaming.com93a81472010-04-20 18:52:58 +00002046 if (texture == 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002047 {
daniel@transgaming.com93a81472010-04-20 18:52:58 +00002048 textarget = GL_NONE;
2049 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002050
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05002051 gl::Framebuffer *framebuffer = context->getTargetFramebuffer(target);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002052
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002053 if (attachment >= GL_COLOR_ATTACHMENT0_EXT && attachment <= GL_COLOR_ATTACHMENT15_EXT)
daniel@transgaming.comfbc09532010-04-26 15:33:41 +00002054 {
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002055 const unsigned int colorAttachment = (attachment - GL_COLOR_ATTACHMENT0_EXT);
Geoff Lang309c92a2013-07-25 16:23:19 -04002056 framebuffer->setColorbuffer(colorAttachment, textarget, texture, level, 0);
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002057 }
2058 else
2059 {
2060 switch (attachment)
2061 {
Geoff Lang309c92a2013-07-25 16:23:19 -04002062 case GL_DEPTH_ATTACHMENT: framebuffer->setDepthbuffer(textarget, texture, level, 0); break;
2063 case GL_STENCIL_ATTACHMENT: framebuffer->setStencilbuffer(textarget, texture, level, 0); break;
2064 case GL_DEPTH_STENCIL_ATTACHMENT: framebuffer->setDepthStencilBuffer(textarget, texture, level, 0); break;
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002065 }
daniel@transgaming.comfbc09532010-04-26 15:33:41 +00002066 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002067 }
2068 }
2069 catch(std::bad_alloc&)
2070 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002071 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002072 }
2073}
2074
2075void __stdcall glFrontFace(GLenum mode)
2076{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002077 EVENT("(GLenum mode = 0x%X)", mode);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002078
2079 try
2080 {
2081 switch (mode)
2082 {
2083 case GL_CW:
2084 case GL_CCW:
2085 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002086 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002087
2088 if (context)
2089 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00002090 context->setFrontFace(mode);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002091 }
2092 }
2093 break;
2094 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002095 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002096 }
2097 }
2098 catch(std::bad_alloc&)
2099 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002100 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002101 }
2102}
2103
2104void __stdcall glGenBuffers(GLsizei n, GLuint* buffers)
2105{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002106 EVENT("(GLsizei n = %d, GLuint* buffers = 0x%0.8p)", n, buffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002107
2108 try
2109 {
2110 if (n < 0)
2111 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002112 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002113 }
2114
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002115 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002116
2117 if (context)
2118 {
2119 for (int i = 0; i < n; i++)
2120 {
2121 buffers[i] = context->createBuffer();
2122 }
2123 }
2124 }
2125 catch(std::bad_alloc&)
2126 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002127 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002128 }
2129}
2130
2131void __stdcall glGenerateMipmap(GLenum target)
2132{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002133 EVENT("(GLenum target = 0x%X)", target);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002134
2135 try
2136 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002137 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com8fd99e22010-04-20 18:52:00 +00002138
2139 if (context)
2140 {
Jamie Madill35d15012013-10-07 10:46:37 -04002141 if (!ValidTextureTarget(context, target))
daniel@transgaming.com8fd99e22010-04-20 18:52:00 +00002142 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002143 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com8fd99e22010-04-20 18:52:00 +00002144 }
Geoff Langae4852a2013-06-05 15:00:34 -04002145
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05002146 gl::Texture *texture = context->getTargetTexture(target);
Jamie Madill35d15012013-10-07 10:46:37 -04002147
2148 if (texture == NULL)
Geoff Langae4852a2013-06-05 15:00:34 -04002149 {
2150 return gl::error(GL_INVALID_OPERATION);
2151 }
2152
Geoff Lang005df412013-10-16 14:12:50 -04002153 GLenum internalFormat = texture->getBaseLevelInternalFormat();
Jamie Madill35d15012013-10-07 10:46:37 -04002154
Geoff Langae4852a2013-06-05 15:00:34 -04002155 // Internally, all texture formats are sized so checking if the format
2156 // is color renderable and filterable will not fail.
Jamie Madill61b54432014-02-18 15:27:19 -05002157
2158 bool validRenderable = (gl::IsColorRenderingSupported(internalFormat, context) ||
2159 gl::IsSizedInternalFormat(internalFormat, context->getClientVersion()));
2160
Jamie Madill33f9c2e2013-10-07 10:46:36 -04002161 if (gl::IsDepthRenderingSupported(internalFormat, context) ||
2162 gl::IsFormatCompressed(internalFormat, context->getClientVersion()) ||
Jamie Madill61b54432014-02-18 15:27:19 -05002163 !gl::IsTextureFilteringSupported(internalFormat, context) ||
2164 !validRenderable)
Geoff Langae4852a2013-06-05 15:00:34 -04002165 {
2166 return gl::error(GL_INVALID_OPERATION);
2167 }
2168
Jamie Madillc1f8b162013-10-07 10:46:38 -04002169 // Non-power of 2 ES2 check
2170 if (!context->supportsNonPower2Texture() && (!gl::isPow2(texture->getBaseLevelWidth()) || !gl::isPow2(texture->getBaseLevelHeight())))
2171 {
2172 ASSERT(context->getClientVersion() <= 2 && (target == GL_TEXTURE_2D || target == GL_TEXTURE_CUBE_MAP));
2173 return gl::error(GL_INVALID_OPERATION);
2174 }
2175
2176 // Cube completeness check
2177 if (target == GL_TEXTURE_CUBE_MAP)
2178 {
2179 gl::TextureCubeMap *textureCube = static_cast<gl::TextureCubeMap *>(texture);
2180 if (!textureCube->isCubeComplete())
2181 {
2182 return gl::error(GL_INVALID_OPERATION);
2183 }
2184 }
2185
Geoff Langae4852a2013-06-05 15:00:34 -04002186 texture->generateMipmaps();
daniel@transgaming.com8fd99e22010-04-20 18:52:00 +00002187 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002188 }
2189 catch(std::bad_alloc&)
2190 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002191 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002192 }
2193}
2194
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002195void __stdcall glGenFencesNV(GLsizei n, GLuint* fences)
2196{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002197 EVENT("(GLsizei n = %d, GLuint* fences = 0x%0.8p)", n, fences);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002198
2199 try
2200 {
2201 if (n < 0)
2202 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002203 return gl::error(GL_INVALID_VALUE);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002204 }
2205
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002206 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002207
2208 if (context)
2209 {
2210 for (int i = 0; i < n; i++)
2211 {
Jamie Madill33dc8432013-07-26 11:55:05 -04002212 fences[i] = context->createFenceNV();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002213 }
2214 }
2215 }
2216 catch(std::bad_alloc&)
2217 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002218 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002219 }
2220}
2221
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002222void __stdcall glGenFramebuffers(GLsizei n, GLuint* framebuffers)
2223{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002224 EVENT("(GLsizei n = %d, GLuint* framebuffers = 0x%0.8p)", n, framebuffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002225
2226 try
2227 {
2228 if (n < 0)
2229 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002230 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002231 }
2232
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002233 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002234
2235 if (context)
2236 {
2237 for (int i = 0; i < n; i++)
2238 {
2239 framebuffers[i] = context->createFramebuffer();
2240 }
2241 }
2242 }
2243 catch(std::bad_alloc&)
2244 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002245 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002246 }
2247}
2248
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00002249void __stdcall glGenQueriesEXT(GLsizei n, GLuint* ids)
2250{
2251 EVENT("(GLsizei n = %d, GLuint* ids = 0x%0.8p)", n, ids);
2252
2253 try
2254 {
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00002255 gl::Context *context = gl::getNonLostContext();
2256
2257 if (context)
2258 {
Geoff Lang37dde692014-01-31 16:34:54 -05002259 if (n < 0)
2260 {
2261 return gl::error(GL_INVALID_VALUE);
2262 }
2263
2264 for (GLsizei i = 0; i < n; i++)
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00002265 {
2266 ids[i] = context->createQuery();
2267 }
2268 }
2269 }
2270 catch(std::bad_alloc&)
2271 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002272 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00002273 }
2274}
2275
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002276void __stdcall glGenRenderbuffers(GLsizei n, GLuint* renderbuffers)
2277{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002278 EVENT("(GLsizei n = %d, GLuint* renderbuffers = 0x%0.8p)", n, renderbuffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002279
2280 try
2281 {
2282 if (n < 0)
2283 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002284 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002285 }
2286
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002287 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002288
2289 if (context)
2290 {
2291 for (int i = 0; i < n; i++)
2292 {
2293 renderbuffers[i] = context->createRenderbuffer();
2294 }
2295 }
2296 }
2297 catch(std::bad_alloc&)
2298 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002299 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002300 }
2301}
2302
2303void __stdcall glGenTextures(GLsizei n, GLuint* textures)
2304{
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05002305 EVENT("(GLsizei n = %d, GLuint* textures = 0x%0.8p)", n, textures);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002306
2307 try
2308 {
2309 if (n < 0)
2310 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002311 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002312 }
2313
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002314 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002315
2316 if (context)
2317 {
2318 for (int i = 0; i < n; i++)
2319 {
2320 textures[i] = context->createTexture();
2321 }
2322 }
2323 }
2324 catch(std::bad_alloc&)
2325 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002326 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002327 }
2328}
2329
daniel@transgaming.com85423182010-04-22 13:35:27 +00002330void __stdcall glGetActiveAttrib(GLuint program, GLuint index, GLsizei bufsize, GLsizei *length, GLint *size, GLenum *type, GLchar *name)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002331{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002332 EVENT("(GLuint program = %d, GLuint index = %d, GLsizei bufsize = %d, GLsizei *length = 0x%0.8p, "
daniel@transgaming.com85423182010-04-22 13:35:27 +00002333 "GLint *size = 0x%0.8p, GLenum *type = %0.8p, GLchar *name = %0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002334 program, index, bufsize, length, size, type, name);
2335
2336 try
2337 {
2338 if (bufsize < 0)
2339 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002340 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002341 }
2342
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002343 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com85423182010-04-22 13:35:27 +00002344
2345 if (context)
2346 {
2347 gl::Program *programObject = context->getProgram(program);
2348
2349 if (!programObject)
2350 {
2351 if (context->getShader(program))
2352 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002353 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com85423182010-04-22 13:35:27 +00002354 }
2355 else
2356 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002357 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com85423182010-04-22 13:35:27 +00002358 }
2359 }
2360
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00002361 if (index >= (GLuint)programObject->getActiveAttributeCount())
daniel@transgaming.com85423182010-04-22 13:35:27 +00002362 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002363 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com85423182010-04-22 13:35:27 +00002364 }
2365
2366 programObject->getActiveAttribute(index, bufsize, length, size, type, name);
2367 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002368 }
2369 catch(std::bad_alloc&)
2370 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002371 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002372 }
2373}
2374
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00002375void __stdcall glGetActiveUniform(GLuint program, GLuint index, GLsizei bufsize, GLsizei* length, GLint* size, GLenum* type, GLchar* name)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002376{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002377 EVENT("(GLuint program = %d, GLuint index = %d, GLsizei bufsize = %d, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00002378 "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 +00002379 program, index, bufsize, length, size, type, name);
2380
2381 try
2382 {
2383 if (bufsize < 0)
2384 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002385 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002386 }
2387
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002388 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00002389
2390 if (context)
2391 {
2392 gl::Program *programObject = context->getProgram(program);
2393
2394 if (!programObject)
2395 {
2396 if (context->getShader(program))
2397 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002398 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00002399 }
2400 else
2401 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002402 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00002403 }
2404 }
2405
2406 if (index >= (GLuint)programObject->getActiveUniformCount())
2407 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002408 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00002409 }
2410
2411 programObject->getActiveUniform(index, bufsize, length, size, type, name);
2412 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002413 }
2414 catch(std::bad_alloc&)
2415 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002416 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002417 }
2418}
2419
2420void __stdcall glGetAttachedShaders(GLuint program, GLsizei maxcount, GLsizei* count, GLuint* shaders)
2421{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002422 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 +00002423 program, maxcount, count, shaders);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002424
2425 try
2426 {
2427 if (maxcount < 0)
2428 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002429 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002430 }
2431
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002432 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com6c785212010-03-30 03:36:17 +00002433
2434 if (context)
2435 {
2436 gl::Program *programObject = context->getProgram(program);
2437
2438 if (!programObject)
2439 {
daniel@transgaming.com23953e32010-04-13 19:53:31 +00002440 if (context->getShader(program))
2441 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002442 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com23953e32010-04-13 19:53:31 +00002443 }
2444 else
2445 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002446 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com23953e32010-04-13 19:53:31 +00002447 }
daniel@transgaming.com6c785212010-03-30 03:36:17 +00002448 }
2449
2450 return programObject->getAttachedShaders(maxcount, count, shaders);
2451 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002452 }
2453 catch(std::bad_alloc&)
2454 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002455 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002456 }
2457}
2458
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00002459int __stdcall glGetAttribLocation(GLuint program, const GLchar* name)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002460{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002461 EVENT("(GLuint program = %d, const GLchar* name = %s)", program, name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002462
2463 try
2464 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002465 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002466
2467 if (context)
2468 {
daniel@transgaming.combb274c32010-04-13 03:26:21 +00002469
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002470 gl::Program *programObject = context->getProgram(program);
2471
2472 if (!programObject)
2473 {
daniel@transgaming.combb274c32010-04-13 03:26:21 +00002474 if (context->getShader(program))
2475 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002476 return gl::error(GL_INVALID_OPERATION, -1);
daniel@transgaming.combb274c32010-04-13 03:26:21 +00002477 }
2478 else
2479 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002480 return gl::error(GL_INVALID_VALUE, -1);
daniel@transgaming.combb274c32010-04-13 03:26:21 +00002481 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002482 }
2483
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00002484 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
daniel@transgaming.com716056c2012-07-24 18:38:59 +00002485 if (!programObject->isLinked() || !programBinary)
daniel@transgaming.comcf4aa872010-04-13 03:26:27 +00002486 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002487 return gl::error(GL_INVALID_OPERATION, -1);
daniel@transgaming.comcf4aa872010-04-13 03:26:27 +00002488 }
2489
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00002490 return programBinary->getAttributeLocation(name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002491 }
2492 }
2493 catch(std::bad_alloc&)
2494 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002495 return gl::error(GL_OUT_OF_MEMORY, -1);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002496 }
2497
2498 return -1;
2499}
2500
2501void __stdcall glGetBooleanv(GLenum pname, GLboolean* params)
2502{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002503 EVENT("(GLenum pname = 0x%X, GLboolean* params = 0x%0.8p)", pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002504
2505 try
2506 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002507 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com777f2672010-04-07 03:25:16 +00002508
2509 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002510 {
Jamie Madill79f2f452013-12-19 11:13:02 -05002511 GLenum nativeType;
2512 unsigned int numParams = 0;
2513 if (!context->getQueryParameterInfo(pname, &nativeType, &numParams))
2514 return gl::error(GL_INVALID_ENUM);
2515
2516 // pname is valid, but there are no parameters to return
2517 if (numParams == 0)
2518 return;
2519
2520 if (nativeType == GL_BOOL)
daniel@transgaming.com777f2672010-04-07 03:25:16 +00002521 {
Jamie Madill79f2f452013-12-19 11:13:02 -05002522 context->getBooleanv(pname, params);
2523 }
Jamie Madill55856b12014-01-02 13:59:50 -05002524 else
Jamie Madill79f2f452013-12-19 11:13:02 -05002525 {
Jamie Madill55856b12014-01-02 13:59:50 -05002526 CastStateValues(context, nativeType, pname, numParams, params);
daniel@transgaming.com777f2672010-04-07 03:25:16 +00002527 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002528 }
2529 }
2530 catch(std::bad_alloc&)
2531 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002532 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002533 }
2534}
2535
2536void __stdcall glGetBufferParameteriv(GLenum target, GLenum pname, GLint* params)
2537{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002538 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 +00002539
2540 try
2541 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002542 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comaa0ccbd2010-04-15 20:45:05 +00002543
2544 if (context)
2545 {
2546 gl::Buffer *buffer;
2547
2548 switch (target)
2549 {
2550 case GL_ARRAY_BUFFER:
2551 buffer = context->getArrayBuffer();
2552 break;
2553 case GL_ELEMENT_ARRAY_BUFFER:
2554 buffer = context->getElementArrayBuffer();
2555 break;
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002556 default: return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comaa0ccbd2010-04-15 20:45:05 +00002557 }
2558
2559 if (!buffer)
2560 {
2561 // A null buffer means that "0" is bound to the requested buffer target
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002562 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comaa0ccbd2010-04-15 20:45:05 +00002563 }
2564
2565 switch (pname)
2566 {
2567 case GL_BUFFER_USAGE:
2568 *params = buffer->usage();
2569 break;
2570 case GL_BUFFER_SIZE:
2571 *params = buffer->size();
2572 break;
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002573 default: return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comaa0ccbd2010-04-15 20:45:05 +00002574 }
2575 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002576 }
2577 catch(std::bad_alloc&)
2578 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002579 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002580 }
2581}
2582
2583GLenum __stdcall glGetError(void)
2584{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002585 EVENT("()");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002586
2587 gl::Context *context = gl::getContext();
2588
2589 if (context)
2590 {
daniel@transgaming.com82b28912011-12-12 21:01:35 +00002591 return context->getError();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002592 }
2593
2594 return GL_NO_ERROR;
2595}
2596
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002597void __stdcall glGetFenceivNV(GLuint fence, GLenum pname, GLint *params)
2598{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002599 EVENT("(GLuint fence = %d, GLenum pname = 0x%X, GLint *params = 0x%0.8p)", fence, pname, params);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002600
2601 try
2602 {
2603
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002604 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002605
2606 if (context)
2607 {
Jamie Madill33dc8432013-07-26 11:55:05 -04002608 gl::FenceNV *fenceObject = context->getFenceNV(fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002609
2610 if (fenceObject == NULL)
2611 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002612 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002613 }
2614
Jamie Madillfb9a7402013-07-26 11:55:01 -04002615 if (fenceObject->isFence() != GL_TRUE)
2616 {
2617 return gl::error(GL_INVALID_OPERATION);
2618 }
2619
2620 switch (pname)
2621 {
2622 case GL_FENCE_STATUS_NV:
2623 case GL_FENCE_CONDITION_NV:
2624 break;
2625
2626 default: return gl::error(GL_INVALID_ENUM);
2627 }
2628
2629 params[0] = fenceObject->getFencei(pname);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +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);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002635 }
2636}
2637
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002638void __stdcall glGetFloatv(GLenum pname, GLfloat* params)
2639{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002640 EVENT("(GLenum pname = 0x%X, GLfloat* params = 0x%0.8p)", 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.com32e58cd2010-03-24 09:44:10 +00002645
2646 if (context)
2647 {
Jamie Madill79f2f452013-12-19 11:13:02 -05002648 GLenum nativeType;
2649 unsigned int numParams = 0;
2650 if (!context->getQueryParameterInfo(pname, &nativeType, &numParams))
2651 return gl::error(GL_INVALID_ENUM);
2652
2653 // pname is valid, but that there are no parameters to return.
2654 if (numParams == 0)
2655 return;
2656
2657 if (nativeType == GL_FLOAT)
daniel@transgaming.com32e58cd2010-03-24 09:44:10 +00002658 {
Jamie Madill79f2f452013-12-19 11:13:02 -05002659 context->getFloatv(pname, params);
2660 }
Jamie Madill55856b12014-01-02 13:59:50 -05002661 else
Jamie Madill79f2f452013-12-19 11:13:02 -05002662 {
Jamie Madill55856b12014-01-02 13:59:50 -05002663 CastStateValues(context, nativeType, pname, numParams, params);
daniel@transgaming.com32e58cd2010-03-24 09:44:10 +00002664 }
2665 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002666 }
2667 catch(std::bad_alloc&)
2668 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002669 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002670 }
2671}
2672
2673void __stdcall glGetFramebufferAttachmentParameteriv(GLenum target, GLenum attachment, GLenum pname, GLint* params)
2674{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002675 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 +00002676 target, attachment, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002677
2678 try
2679 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002680 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002681
2682 if (context)
2683 {
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05002684 if (!gl::ValidFramebufferTarget(target))
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002685 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002686 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002687 }
2688
Geoff Lang646559f2013-08-15 11:08:15 -04002689 switch (pname)
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002690 {
Geoff Lang646559f2013-08-15 11:08:15 -04002691 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE:
2692 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME:
2693 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL:
2694 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE:
2695 break;
2696 case GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE:
2697 case GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE:
2698 case GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE:
2699 case GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE:
2700 case GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE:
2701 case GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE:
2702 case GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE:
2703 case GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING:
2704 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER:
2705 if (context->getClientVersion() >= 3)
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002706 {
Geoff Lang646559f2013-08-15 11:08:15 -04002707 break;
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002708 }
Geoff Lang646559f2013-08-15 11:08:15 -04002709 default:
2710 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002711 }
Geoff Lang646559f2013-08-15 11:08:15 -04002712
2713 // Determine if the attachment is a valid enum
2714 switch (attachment)
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002715 {
Geoff Lang646559f2013-08-15 11:08:15 -04002716 case GL_BACK:
2717 case GL_FRONT:
Jamie Madill3810bee2014-01-21 16:47:12 -05002718 case GL_DEPTH:
Geoff Lang646559f2013-08-15 11:08:15 -04002719 case GL_STENCIL:
2720 case GL_DEPTH_STENCIL_ATTACHMENT:
2721 if (context->getClientVersion() < 3)
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002722 {
Geoff Lang646559f2013-08-15 11:08:15 -04002723 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002724 }
Geoff Lang646559f2013-08-15 11:08:15 -04002725 break;
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002726
Geoff Lang646559f2013-08-15 11:08:15 -04002727 case GL_DEPTH_ATTACHMENT:
2728 case GL_STENCIL_ATTACHMENT:
2729 break;
2730
2731 default:
2732 if (attachment < GL_COLOR_ATTACHMENT0_EXT ||
2733 (attachment - GL_COLOR_ATTACHMENT0_EXT) >= context->getMaximumRenderTargets())
2734 {
2735 return gl::error(GL_INVALID_ENUM);
2736 }
2737 break;
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002738 }
2739
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05002740 GLuint framebufferHandle = context->getTargetFramebufferHandle(target);
2741 ASSERT(framebufferHandle != GL_INVALID_INDEX);
Geoff Lang646559f2013-08-15 11:08:15 -04002742 gl::Framebuffer *framebuffer = context->getFramebuffer(framebufferHandle);
2743
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002744 GLenum attachmentType;
2745 GLuint attachmentHandle;
Geoff Lang309c92a2013-07-25 16:23:19 -04002746 GLuint attachmentLevel;
2747 GLuint attachmentLayer;
Geoff Lang646559f2013-08-15 11:08:15 -04002748 gl::Renderbuffer *renderbuffer;
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002749
Geoff Lang646559f2013-08-15 11:08:15 -04002750 if(framebufferHandle == 0)
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002751 {
Geoff Lang646559f2013-08-15 11:08:15 -04002752 if(context->getClientVersion() < 3)
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002753 {
Geoff Lang646559f2013-08-15 11:08:15 -04002754 return gl::error(GL_INVALID_OPERATION);
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002755 }
2756
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002757 switch (attachment)
2758 {
Geoff Lang646559f2013-08-15 11:08:15 -04002759 case GL_BACK:
2760 attachmentType = framebuffer->getColorbufferType(0);
2761 attachmentHandle = framebuffer->getColorbufferHandle(0);
2762 attachmentLevel = framebuffer->getColorbufferMipLevel(0);
2763 attachmentLayer = framebuffer->getColorbufferLayer(0);
2764 renderbuffer = framebuffer->getColorbuffer(0);
2765 break;
2766 case GL_DEPTH:
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002767 attachmentType = framebuffer->getDepthbufferType();
2768 attachmentHandle = framebuffer->getDepthbufferHandle();
Geoff Lang309c92a2013-07-25 16:23:19 -04002769 attachmentLevel = framebuffer->getDepthbufferMipLevel();
2770 attachmentLayer = framebuffer->getDepthbufferLayer();
Geoff Lang646559f2013-08-15 11:08:15 -04002771 renderbuffer = framebuffer->getDepthbuffer();
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002772 break;
Geoff Lang646559f2013-08-15 11:08:15 -04002773 case GL_STENCIL:
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002774 attachmentType = framebuffer->getStencilbufferType();
2775 attachmentHandle = framebuffer->getStencilbufferHandle();
Geoff Lang309c92a2013-07-25 16:23:19 -04002776 attachmentLevel = framebuffer->getStencilbufferMipLevel();
2777 attachmentLayer = framebuffer->getStencilbufferLayer();
Geoff Lang646559f2013-08-15 11:08:15 -04002778 renderbuffer = framebuffer->getStencilbuffer();
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002779 break;
Geoff Lang646559f2013-08-15 11:08:15 -04002780 default:
2781 return gl::error(GL_INVALID_OPERATION);
2782 }
2783 }
2784 else
2785 {
2786 if (attachment >= GL_COLOR_ATTACHMENT0_EXT && attachment <= GL_COLOR_ATTACHMENT15_EXT)
2787 {
2788 const unsigned int colorAttachment = (attachment - GL_COLOR_ATTACHMENT0_EXT);
2789 attachmentType = framebuffer->getColorbufferType(colorAttachment);
2790 attachmentHandle = framebuffer->getColorbufferHandle(colorAttachment);
2791 attachmentLevel = framebuffer->getColorbufferMipLevel(colorAttachment);
2792 attachmentLayer = framebuffer->getColorbufferLayer(colorAttachment);
2793 renderbuffer = framebuffer->getColorbuffer(colorAttachment);
2794 }
2795 else
2796 {
2797 switch (attachment)
Geoff Lang55ba29c2013-07-11 16:57:53 -04002798 {
Geoff Lang646559f2013-08-15 11:08:15 -04002799 case GL_DEPTH_ATTACHMENT:
2800 attachmentType = framebuffer->getDepthbufferType();
2801 attachmentHandle = framebuffer->getDepthbufferHandle();
2802 attachmentLevel = framebuffer->getDepthbufferMipLevel();
2803 attachmentLayer = framebuffer->getDepthbufferLayer();
2804 renderbuffer = framebuffer->getDepthbuffer();
2805 break;
2806 case GL_STENCIL_ATTACHMENT:
2807 attachmentType = framebuffer->getStencilbufferType();
2808 attachmentHandle = framebuffer->getStencilbufferHandle();
2809 attachmentLevel = framebuffer->getStencilbufferMipLevel();
2810 attachmentLayer = framebuffer->getStencilbufferLayer();
2811 renderbuffer = framebuffer->getStencilbuffer();
2812 break;
2813 case GL_DEPTH_STENCIL_ATTACHMENT:
2814 if (framebuffer->getDepthbufferHandle() != framebuffer->getStencilbufferHandle())
2815 {
2816 return gl::error(GL_INVALID_OPERATION);
2817 }
2818 attachmentType = framebuffer->getDepthStencilbufferType();
2819 attachmentHandle = framebuffer->getDepthStencilbufferHandle();
2820 attachmentLevel = framebuffer->getDepthStencilbufferMipLevel();
2821 attachmentLayer = framebuffer->getDepthStencilbufferLayer();
2822 renderbuffer = framebuffer->getDepthStencilBuffer();
2823 break;
2824 default:
Geoff Lang55ba29c2013-07-11 16:57:53 -04002825 return gl::error(GL_INVALID_OPERATION);
2826 }
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002827 }
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002828 }
2829
2830 GLenum attachmentObjectType; // Type category
Geoff Lang646559f2013-08-15 11:08:15 -04002831 if (framebufferHandle == 0)
2832 {
2833 attachmentObjectType = GL_FRAMEBUFFER_DEFAULT;
2834 }
2835 else if (attachmentType == GL_NONE || attachmentType == GL_RENDERBUFFER)
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002836 {
2837 attachmentObjectType = attachmentType;
2838 }
Geoff Lang0fe19492013-07-25 17:04:31 -04002839 else if (gl::IsInternalTextureTarget(attachmentType, context->getClientVersion()))
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002840 {
2841 attachmentObjectType = GL_TEXTURE;
2842 }
apatrick@chromium.orga1d80592012-01-25 21:52:10 +00002843 else
2844 {
2845 UNREACHABLE();
2846 return;
2847 }
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002848
Geoff Lang646559f2013-08-15 11:08:15 -04002849 if (attachmentObjectType == GL_NONE)
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002850 {
Geoff Lang646559f2013-08-15 11:08:15 -04002851 // ES 2.0.25 spec pg 127 states that if the value of FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE
2852 // is NONE, then querying any other pname will generate INVALID_ENUM.
2853
2854 // ES 3.0.2 spec pg 235 states that if the attachment type is none,
2855 // GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME will return zero and be an
2856 // INVALID_OPERATION for all other pnames
2857
2858 switch (pname)
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002859 {
Geoff Lang646559f2013-08-15 11:08:15 -04002860 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE:
2861 *params = attachmentObjectType;
2862 break;
2863
2864 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME:
2865 if (context->getClientVersion() < 3)
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002866 {
Geoff Lang646559f2013-08-15 11:08:15 -04002867 return gl::error(GL_INVALID_ENUM);
2868 }
2869 *params = 0;
2870 break;
2871
2872 default:
2873 if (context->getClientVersion() < 3)
2874 {
2875 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002876 }
2877 else
2878 {
Geoff Lang646559f2013-08-15 11:08:15 -04002879 gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002880 }
2881 }
Geoff Lang646559f2013-08-15 11:08:15 -04002882 }
2883 else
2884 {
2885 ASSERT(attachmentObjectType == GL_RENDERBUFFER || attachmentObjectType == GL_TEXTURE ||
2886 attachmentObjectType == GL_FRAMEBUFFER_DEFAULT);
2887 ASSERT(renderbuffer != NULL);
2888
2889 switch (pname)
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002890 {
Geoff Lang646559f2013-08-15 11:08:15 -04002891 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE:
2892 *params = attachmentObjectType;
2893 break;
2894
2895 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME:
2896 if (attachmentObjectType != GL_RENDERBUFFER && attachmentObjectType != GL_TEXTURE)
2897 {
2898 return gl::error(GL_INVALID_ENUM);
2899 }
2900 *params = attachmentHandle;
2901 break;
2902
2903 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL:
2904 if (attachmentObjectType != GL_TEXTURE)
2905 {
2906 return gl::error(GL_INVALID_ENUM);
2907 }
2908 *params = attachmentLevel;
2909 break;
2910
2911 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE:
2912 if (attachmentObjectType != GL_TEXTURE)
2913 {
2914 return gl::error(GL_INVALID_ENUM);
2915 }
2916 *params = gl::IsCubemapTextureTarget(attachmentType) ? attachmentType : 0;
2917 break;
2918
2919 case GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE:
2920 *params = renderbuffer->getRedSize();
2921 break;
2922
2923 case GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE:
2924 *params = renderbuffer->getGreenSize();
2925 break;
2926
2927 case GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE:
2928 *params = renderbuffer->getBlueSize();
2929 break;
2930
2931 case GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE:
2932 *params = renderbuffer->getAlphaSize();
2933 break;
2934
2935 case GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE:
2936 *params = renderbuffer->getDepthSize();
2937 break;
2938
2939 case GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE:
2940 *params = renderbuffer->getStencilSize();
2941 break;
2942
2943 case GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE:
2944 if (attachment == GL_DEPTH_STENCIL)
2945 {
2946 gl::error(GL_INVALID_OPERATION);
2947 }
2948 *params = renderbuffer->getComponentType();
2949 break;
2950
2951 case GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING:
2952 *params = renderbuffer->getColorEncoding();
2953 break;
2954
2955 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER:
2956 if (attachmentObjectType != GL_TEXTURE)
2957 {
2958 return gl::error(GL_INVALID_ENUM);
2959 }
2960 *params = attachmentLayer;
2961 break;
2962
2963 default:
2964 UNREACHABLE();
2965 break;
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002966 }
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002967 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002968 }
2969 }
2970 catch(std::bad_alloc&)
2971 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002972 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002973 }
2974}
2975
daniel@transgaming.com17f548c2011-11-09 17:47:02 +00002976GLenum __stdcall glGetGraphicsResetStatusEXT(void)
2977{
2978 EVENT("()");
2979
2980 try
2981 {
2982 gl::Context *context = gl::getContext();
2983
2984 if (context)
2985 {
2986 return context->getResetStatus();
2987 }
2988
2989 return GL_NO_ERROR;
2990 }
2991 catch(std::bad_alloc&)
2992 {
2993 return GL_OUT_OF_MEMORY;
2994 }
2995}
2996
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002997void __stdcall glGetIntegerv(GLenum pname, GLint* params)
2998{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002999 EVENT("(GLenum pname = 0x%X, GLint* params = 0x%0.8p)", pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003000
3001 try
3002 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003003 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003004
3005 if (context)
3006 {
Jamie Madill79f2f452013-12-19 11:13:02 -05003007 GLenum nativeType;
3008 unsigned int numParams = 0;
3009 if (!context->getQueryParameterInfo(pname, &nativeType, &numParams))
3010 return gl::error(GL_INVALID_ENUM);
3011
3012 // pname is valid, but there are no parameters to return
3013 if (numParams == 0)
3014 return;
3015
3016 if (nativeType == GL_INT)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003017 {
Jamie Madill79f2f452013-12-19 11:13:02 -05003018 context->getIntegerv(pname, params);
3019 }
Jamie Madill55856b12014-01-02 13:59:50 -05003020 else
Jamie Madill79f2f452013-12-19 11:13:02 -05003021 {
Jamie Madill55856b12014-01-02 13:59:50 -05003022 CastStateValues(context, nativeType, pname, numParams, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003023 }
3024 }
3025 }
3026 catch(std::bad_alloc&)
3027 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003028 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003029 }
3030}
3031
3032void __stdcall glGetProgramiv(GLuint program, GLenum pname, GLint* params)
3033{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003034 EVENT("(GLuint program = %d, GLenum pname = %d, GLint* params = 0x%0.8p)", program, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003035
3036 try
3037 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003038 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003039
3040 if (context)
3041 {
3042 gl::Program *programObject = context->getProgram(program);
3043
3044 if (!programObject)
3045 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003046 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003047 }
3048
shannonwoods@chromium.orge684b582013-05-30 00:07:42 +00003049 if (context->getClientVersion() < 3)
3050 {
3051 switch (pname)
3052 {
3053 case GL_ACTIVE_UNIFORM_BLOCKS:
3054 case GL_ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH:
3055 return gl::error(GL_INVALID_ENUM);
3056 }
3057 }
3058
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003059 switch (pname)
3060 {
3061 case GL_DELETE_STATUS:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003062 *params = programObject->isFlaggedForDeletion();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003063 return;
3064 case GL_LINK_STATUS:
daniel@transgaming.com716056c2012-07-24 18:38:59 +00003065 *params = programObject->isLinked();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003066 return;
3067 case GL_VALIDATE_STATUS:
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00003068 *params = programObject->isValidated();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003069 return;
3070 case GL_INFO_LOG_LENGTH:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003071 *params = programObject->getInfoLogLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003072 return;
3073 case GL_ATTACHED_SHADERS:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003074 *params = programObject->getAttachedShadersCount();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003075 return;
3076 case GL_ACTIVE_ATTRIBUTES:
daniel@transgaming.com85423182010-04-22 13:35:27 +00003077 *params = programObject->getActiveAttributeCount();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003078 return;
3079 case GL_ACTIVE_ATTRIBUTE_MAX_LENGTH:
daniel@transgaming.com85423182010-04-22 13:35:27 +00003080 *params = programObject->getActiveAttributeMaxLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003081 return;
3082 case GL_ACTIVE_UNIFORMS:
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00003083 *params = programObject->getActiveUniformCount();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003084 return;
3085 case GL_ACTIVE_UNIFORM_MAX_LENGTH:
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00003086 *params = programObject->getActiveUniformMaxLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003087 return;
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00003088 case GL_PROGRAM_BINARY_LENGTH_OES:
apatrick@chromium.org90080e32012-07-09 22:15:33 +00003089 *params = programObject->getProgramBinaryLength();
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00003090 return;
shannonwoods@chromium.orge684b582013-05-30 00:07:42 +00003091 case GL_ACTIVE_UNIFORM_BLOCKS:
3092 *params = programObject->getActiveUniformBlockCount();
3093 return;
3094 case GL_ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH:
3095 *params = programObject->getActiveUniformBlockMaxLength();
3096 break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003097 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003098 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003099 }
3100 }
3101 }
3102 catch(std::bad_alloc&)
3103 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003104 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003105 }
3106}
3107
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00003108void __stdcall glGetProgramInfoLog(GLuint program, GLsizei bufsize, GLsizei* length, GLchar* infolog)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003109{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003110 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 +00003111 program, bufsize, length, infolog);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003112
3113 try
3114 {
3115 if (bufsize < 0)
3116 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003117 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003118 }
3119
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003120 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003121
3122 if (context)
3123 {
3124 gl::Program *programObject = context->getProgram(program);
3125
3126 if (!programObject)
3127 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003128 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003129 }
3130
3131 programObject->getInfoLog(bufsize, length, infolog);
3132 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003133 }
3134 catch(std::bad_alloc&)
3135 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003136 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003137 }
3138}
3139
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003140void __stdcall glGetQueryivEXT(GLenum target, GLenum pname, GLint *params)
3141{
3142 EVENT("GLenum target = 0x%X, GLenum pname = 0x%X, GLint *params = 0x%0.8p)", target, pname, params);
3143
3144 try
3145 {
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003146 gl::Context *context = gl::getNonLostContext();
3147
3148 if (context)
3149 {
Geoff Lang37dde692014-01-31 16:34:54 -05003150 if (!ValidQueryType(context, target))
3151 {
3152 return gl::error(GL_INVALID_ENUM);
3153 }
3154
3155 switch (pname)
3156 {
3157 case GL_CURRENT_QUERY_EXT:
3158 params[0] = context->getActiveQuery(target);
3159 break;
3160
3161 default:
3162 return gl::error(GL_INVALID_ENUM);
3163 }
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003164 }
3165 }
3166 catch(std::bad_alloc&)
3167 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003168 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003169 }
3170}
3171
3172void __stdcall glGetQueryObjectuivEXT(GLuint id, GLenum pname, GLuint *params)
3173{
3174 EVENT("(GLuint id = %d, GLenum pname = 0x%X, GLuint *params = 0x%0.8p)", id, pname, params);
3175
3176 try
3177 {
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003178 gl::Context *context = gl::getNonLostContext();
3179
3180 if (context)
3181 {
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003182 gl::Query *queryObject = context->getQuery(id, false, GL_NONE);
3183
3184 if (!queryObject)
3185 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003186 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003187 }
3188
3189 if (context->getActiveQuery(queryObject->getType()) == id)
3190 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003191 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003192 }
3193
3194 switch(pname)
3195 {
3196 case GL_QUERY_RESULT_EXT:
3197 params[0] = queryObject->getResult();
3198 break;
3199 case GL_QUERY_RESULT_AVAILABLE_EXT:
3200 params[0] = queryObject->isResultAvailable();
3201 break;
3202 default:
Geoff Lang37dde692014-01-31 16:34:54 -05003203 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003204 }
3205 }
3206 }
3207 catch(std::bad_alloc&)
3208 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003209 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003210 }
3211}
3212
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003213void __stdcall glGetRenderbufferParameteriv(GLenum target, GLenum pname, GLint* params)
3214{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003215 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 +00003216
3217 try
3218 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003219 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003220
3221 if (context)
3222 {
3223 if (target != GL_RENDERBUFFER)
3224 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003225 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003226 }
3227
daniel@transgaming.com428d1582010-05-04 03:35:25 +00003228 if (context->getRenderbufferHandle() == 0)
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003229 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003230 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003231 }
3232
daniel@transgaming.com428d1582010-05-04 03:35:25 +00003233 gl::Renderbuffer *renderbuffer = context->getRenderbuffer(context->getRenderbufferHandle());
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003234
3235 switch (pname)
3236 {
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +00003237 case GL_RENDERBUFFER_WIDTH: *params = renderbuffer->getWidth(); break;
3238 case GL_RENDERBUFFER_HEIGHT: *params = renderbuffer->getHeight(); break;
3239 case GL_RENDERBUFFER_INTERNAL_FORMAT: *params = renderbuffer->getInternalFormat(); break;
3240 case GL_RENDERBUFFER_RED_SIZE: *params = renderbuffer->getRedSize(); break;
3241 case GL_RENDERBUFFER_GREEN_SIZE: *params = renderbuffer->getGreenSize(); break;
3242 case GL_RENDERBUFFER_BLUE_SIZE: *params = renderbuffer->getBlueSize(); break;
3243 case GL_RENDERBUFFER_ALPHA_SIZE: *params = renderbuffer->getAlphaSize(); break;
3244 case GL_RENDERBUFFER_DEPTH_SIZE: *params = renderbuffer->getDepthSize(); break;
3245 case GL_RENDERBUFFER_STENCIL_SIZE: *params = renderbuffer->getStencilSize(); break;
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00003246 case GL_RENDERBUFFER_SAMPLES_ANGLE:
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +00003247 if (context->getMaxSupportedSamples() != 0)
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00003248 {
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +00003249 *params = renderbuffer->getSamples();
3250 }
3251 else
3252 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003253 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00003254 }
3255 break;
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003256 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003257 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003258 }
3259 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003260 }
3261 catch(std::bad_alloc&)
3262 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003263 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003264 }
3265}
3266
3267void __stdcall glGetShaderiv(GLuint shader, GLenum pname, GLint* params)
3268{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003269 EVENT("(GLuint shader = %d, GLenum pname = %d, GLint* params = 0x%0.8p)", shader, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003270
3271 try
3272 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003273 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003274
3275 if (context)
3276 {
3277 gl::Shader *shaderObject = context->getShader(shader);
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00003278
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003279 if (!shaderObject)
3280 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003281 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003282 }
3283
3284 switch (pname)
3285 {
3286 case GL_SHADER_TYPE:
3287 *params = shaderObject->getType();
3288 return;
3289 case GL_DELETE_STATUS:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003290 *params = shaderObject->isFlaggedForDeletion();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003291 return;
3292 case GL_COMPILE_STATUS:
3293 *params = shaderObject->isCompiled() ? GL_TRUE : GL_FALSE;
3294 return;
3295 case GL_INFO_LOG_LENGTH:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003296 *params = shaderObject->getInfoLogLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003297 return;
3298 case GL_SHADER_SOURCE_LENGTH:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003299 *params = shaderObject->getSourceLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003300 return;
zmo@google.coma574f782011-10-03 21:45:23 +00003301 case GL_TRANSLATED_SHADER_SOURCE_LENGTH_ANGLE:
3302 *params = shaderObject->getTranslatedSourceLength();
3303 return;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003304 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003305 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003306 }
3307 }
3308 }
3309 catch(std::bad_alloc&)
3310 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003311 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003312 }
3313}
3314
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00003315void __stdcall glGetShaderInfoLog(GLuint shader, GLsizei bufsize, GLsizei* length, GLchar* infolog)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003316{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003317 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 +00003318 shader, bufsize, length, infolog);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003319
3320 try
3321 {
3322 if (bufsize < 0)
3323 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003324 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003325 }
3326
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003327 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003328
3329 if (context)
3330 {
3331 gl::Shader *shaderObject = context->getShader(shader);
3332
3333 if (!shaderObject)
3334 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003335 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003336 }
3337
3338 shaderObject->getInfoLog(bufsize, length, infolog);
3339 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003340 }
3341 catch(std::bad_alloc&)
3342 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003343 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003344 }
3345}
3346
3347void __stdcall glGetShaderPrecisionFormat(GLenum shadertype, GLenum precisiontype, GLint* range, GLint* precision)
3348{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003349 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 +00003350 shadertype, precisiontype, range, precision);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003351
3352 try
3353 {
daniel@transgaming.com6c785212010-03-30 03:36:17 +00003354 switch (shadertype)
3355 {
3356 case GL_VERTEX_SHADER:
3357 case GL_FRAGMENT_SHADER:
3358 break;
3359 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003360 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com6c785212010-03-30 03:36:17 +00003361 }
3362
3363 switch (precisiontype)
3364 {
3365 case GL_LOW_FLOAT:
3366 case GL_MEDIUM_FLOAT:
3367 case GL_HIGH_FLOAT:
3368 // Assume IEEE 754 precision
3369 range[0] = 127;
3370 range[1] = 127;
daniel@transgaming.comc5c15382010-04-23 18:34:49 +00003371 *precision = 23;
daniel@transgaming.com6c785212010-03-30 03:36:17 +00003372 break;
3373 case GL_LOW_INT:
3374 case GL_MEDIUM_INT:
3375 case GL_HIGH_INT:
3376 // Some (most) hardware only supports single-precision floating-point numbers,
3377 // which can accurately represent integers up to +/-16777216
3378 range[0] = 24;
3379 range[1] = 24;
daniel@transgaming.comc5c15382010-04-23 18:34:49 +00003380 *precision = 0;
daniel@transgaming.com6c785212010-03-30 03:36:17 +00003381 break;
3382 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003383 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com6c785212010-03-30 03:36:17 +00003384 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003385 }
3386 catch(std::bad_alloc&)
3387 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003388 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003389 }
3390}
3391
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00003392void __stdcall glGetShaderSource(GLuint shader, GLsizei bufsize, GLsizei* length, GLchar* source)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003393{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003394 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 +00003395 shader, bufsize, length, source);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003396
3397 try
3398 {
3399 if (bufsize < 0)
3400 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003401 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003402 }
3403
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003404 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003405
3406 if (context)
3407 {
3408 gl::Shader *shaderObject = context->getShader(shader);
3409
3410 if (!shaderObject)
3411 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003412 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003413 }
3414
3415 shaderObject->getSource(bufsize, length, source);
3416 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003417 }
3418 catch(std::bad_alloc&)
3419 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003420 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003421 }
3422}
3423
zmo@google.coma574f782011-10-03 21:45:23 +00003424void __stdcall glGetTranslatedShaderSourceANGLE(GLuint shader, GLsizei bufsize, GLsizei* length, GLchar* source)
3425{
3426 EVENT("(GLuint shader = %d, GLsizei bufsize = %d, GLsizei* length = 0x%0.8p, GLchar* source = 0x%0.8p)",
3427 shader, bufsize, length, source);
3428
3429 try
3430 {
3431 if (bufsize < 0)
3432 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003433 return gl::error(GL_INVALID_VALUE);
zmo@google.coma574f782011-10-03 21:45:23 +00003434 }
3435
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003436 gl::Context *context = gl::getNonLostContext();
zmo@google.coma574f782011-10-03 21:45:23 +00003437
3438 if (context)
3439 {
3440 gl::Shader *shaderObject = context->getShader(shader);
3441
3442 if (!shaderObject)
3443 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003444 return gl::error(GL_INVALID_OPERATION);
zmo@google.coma574f782011-10-03 21:45:23 +00003445 }
3446
3447 shaderObject->getTranslatedSource(bufsize, length, source);
3448 }
3449 }
3450 catch(std::bad_alloc&)
3451 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003452 return gl::error(GL_OUT_OF_MEMORY);
zmo@google.coma574f782011-10-03 21:45:23 +00003453 }
3454}
3455
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003456const GLubyte* __stdcall glGetString(GLenum name)
3457{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003458 EVENT("(GLenum name = 0x%X)", name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003459
3460 try
3461 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003462 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com3e4c6002010-05-05 18:50:13 +00003463
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003464 switch (name)
3465 {
3466 case GL_VENDOR:
daniel@transgaming.coma0ce7e62011-01-25 14:47:16 +00003467 return (GLubyte*)"Google Inc.";
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003468 case GL_RENDERER:
daniel@transgaming.comc23ff642011-08-16 20:28:45 +00003469 return (GLubyte*)((context != NULL) ? context->getRendererString() : "ANGLE");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003470 case GL_VERSION:
shannonwoods@chromium.orge2865d02013-05-30 00:06:01 +00003471 if (context->getClientVersion() == 2)
3472 {
Jamie Madill0aa84f62014-02-13 13:17:23 -05003473 return (GLubyte*)"OpenGL ES 2.0 (ANGLE " ANGLE_VERSION_STRING ")";
shannonwoods@chromium.orge2865d02013-05-30 00:06:01 +00003474 }
3475 else
3476 {
Jamie Madill0aa84f62014-02-13 13:17:23 -05003477 return (GLubyte*)"OpenGL ES 3.0 (ANGLE " ANGLE_VERSION_STRING ")";
shannonwoods@chromium.orge2865d02013-05-30 00:06:01 +00003478 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003479 case GL_SHADING_LANGUAGE_VERSION:
shannonwoods@chromium.orge2865d02013-05-30 00:06:01 +00003480 if (context->getClientVersion() == 2)
3481 {
Jamie Madill0aa84f62014-02-13 13:17:23 -05003482 return (GLubyte*)"OpenGL ES GLSL ES 1.00 (ANGLE " ANGLE_VERSION_STRING ")";
shannonwoods@chromium.orge2865d02013-05-30 00:06:01 +00003483 }
3484 else
3485 {
Jamie Madill0aa84f62014-02-13 13:17:23 -05003486 return (GLubyte*)"OpenGL ES GLSL ES 3.00 (ANGLE " ANGLE_VERSION_STRING ")";
shannonwoods@chromium.orge2865d02013-05-30 00:06:01 +00003487 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003488 case GL_EXTENSIONS:
shannonwoods@chromium.org302df742013-05-30 00:05:54 +00003489 return (GLubyte*)((context != NULL) ? context->getCombinedExtensionsString() : "");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003490 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003491 return gl::error(GL_INVALID_ENUM, (GLubyte*)NULL);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003492 }
3493 }
3494 catch(std::bad_alloc&)
3495 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003496 return gl::error(GL_OUT_OF_MEMORY, (GLubyte*)NULL);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003497 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003498}
3499
3500void __stdcall glGetTexParameterfv(GLenum target, GLenum pname, GLfloat* params)
3501{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003502 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 +00003503
3504 try
3505 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003506 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003507
3508 if (context)
3509 {
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05003510 gl::Texture *texture = context->getTargetTexture(target);
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003511
Jamie Madillfb8a8302013-07-03 14:24:12 -04003512 if (!texture)
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003513 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003514 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003515 }
3516
3517 switch (pname)
3518 {
3519 case GL_TEXTURE_MAG_FILTER:
3520 *params = (GLfloat)texture->getMagFilter();
3521 break;
3522 case GL_TEXTURE_MIN_FILTER:
3523 *params = (GLfloat)texture->getMinFilter();
3524 break;
3525 case GL_TEXTURE_WRAP_S:
3526 *params = (GLfloat)texture->getWrapS();
3527 break;
3528 case GL_TEXTURE_WRAP_T:
3529 *params = (GLfloat)texture->getWrapT();
3530 break;
shannon.woods%transgaming.com@gtempaccount.com0b3a8df2013-04-13 03:44:51 +00003531 case GL_TEXTURE_WRAP_R:
3532 if (context->getClientVersion() < 3)
3533 {
3534 return gl::error(GL_INVALID_ENUM);
3535 }
3536 *params = (GLfloat)texture->getWrapR();
3537 break;
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00003538 case GL_TEXTURE_IMMUTABLE_FORMAT:
3539 // Exposed to ES2.0 through EXT_texture_storage, no client version validation.
daniel@transgaming.comd30bd0a2011-11-11 04:10:34 +00003540 *params = (GLfloat)(texture->isImmutable() ? GL_TRUE : GL_FALSE);
3541 break;
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00003542 case GL_TEXTURE_IMMUTABLE_LEVELS:
3543 if (context->getClientVersion() < 3)
3544 {
3545 return gl::error(GL_INVALID_ENUM);
3546 }
Jamie Madill51a94372013-10-24 17:49:43 -04003547 *params = (GLfloat)texture->immutableLevelCount();
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00003548 break;
daniel@transgaming.com7d18c172011-11-11 04:18:21 +00003549 case GL_TEXTURE_USAGE_ANGLE:
3550 *params = (GLfloat)texture->getUsage();
3551 break;
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00003552 case GL_TEXTURE_MAX_ANISOTROPY_EXT:
3553 if (!context->supportsTextureFilterAnisotropy())
3554 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003555 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00003556 }
3557 *params = (GLfloat)texture->getMaxAnisotropy();
3558 break;
Geoff Langbc90a482013-09-17 16:51:27 -04003559 case GL_TEXTURE_SWIZZLE_R:
3560 if (context->getClientVersion() < 3)
3561 {
3562 return gl::error(GL_INVALID_ENUM);
3563 }
3564 *params = (GLfloat)texture->getSwizzleRed();
3565 break;
3566 case GL_TEXTURE_SWIZZLE_G:
3567 if (context->getClientVersion() < 3)
3568 {
3569 return gl::error(GL_INVALID_ENUM);
3570 }
3571 *params = (GLfloat)texture->getSwizzleGreen();
3572 break;
3573 case GL_TEXTURE_SWIZZLE_B:
3574 if (context->getClientVersion() < 3)
3575 {
3576 return gl::error(GL_INVALID_ENUM);
3577 }
3578 *params = (GLfloat)texture->getSwizzleBlue();
3579 break;
3580 case GL_TEXTURE_SWIZZLE_A:
3581 if (context->getClientVersion() < 3)
3582 {
3583 return gl::error(GL_INVALID_ENUM);
3584 }
3585 *params = (GLfloat)texture->getSwizzleAlpha();
3586 break;
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003587 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003588 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003589 }
3590 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003591 }
3592 catch(std::bad_alloc&)
3593 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003594 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003595 }
3596}
3597
3598void __stdcall glGetTexParameteriv(GLenum target, GLenum pname, GLint* params)
3599{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003600 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 +00003601
3602 try
3603 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003604 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003605
3606 if (context)
3607 {
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05003608 gl::Texture *texture = context->getTargetTexture(target);
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003609
Jamie Madillfb8a8302013-07-03 14:24:12 -04003610 if (!texture)
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003611 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003612 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003613 }
3614
3615 switch (pname)
3616 {
3617 case GL_TEXTURE_MAG_FILTER:
3618 *params = texture->getMagFilter();
3619 break;
3620 case GL_TEXTURE_MIN_FILTER:
3621 *params = texture->getMinFilter();
3622 break;
3623 case GL_TEXTURE_WRAP_S:
3624 *params = texture->getWrapS();
3625 break;
3626 case GL_TEXTURE_WRAP_T:
3627 *params = texture->getWrapT();
3628 break;
shannon.woods%transgaming.com@gtempaccount.com0b3a8df2013-04-13 03:44:51 +00003629 case GL_TEXTURE_WRAP_R:
3630 if (context->getClientVersion() < 3)
3631 {
3632 return gl::error(GL_INVALID_ENUM);
3633 }
3634 *params = texture->getWrapR();
3635 break;
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00003636 case GL_TEXTURE_IMMUTABLE_FORMAT:
3637 // Exposed to ES2.0 through EXT_texture_storage, no client version validation.
daniel@transgaming.comd30bd0a2011-11-11 04:10:34 +00003638 *params = texture->isImmutable() ? GL_TRUE : GL_FALSE;
3639 break;
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00003640 case GL_TEXTURE_IMMUTABLE_LEVELS:
3641 if (context->getClientVersion() < 3)
3642 {
3643 return gl::error(GL_INVALID_ENUM);
3644 }
Jamie Madill51a94372013-10-24 17:49:43 -04003645 *params = texture->immutableLevelCount();
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00003646 break;
daniel@transgaming.com7d18c172011-11-11 04:18:21 +00003647 case GL_TEXTURE_USAGE_ANGLE:
3648 *params = texture->getUsage();
3649 break;
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00003650 case GL_TEXTURE_MAX_ANISOTROPY_EXT:
3651 if (!context->supportsTextureFilterAnisotropy())
3652 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003653 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00003654 }
3655 *params = (GLint)texture->getMaxAnisotropy();
3656 break;
Geoff Langbc90a482013-09-17 16:51:27 -04003657 case GL_TEXTURE_SWIZZLE_R:
3658 if (context->getClientVersion() < 3)
3659 {
3660 return gl::error(GL_INVALID_ENUM);
3661 }
3662 *params = texture->getSwizzleRed();
3663 break;
3664 case GL_TEXTURE_SWIZZLE_G:
3665 if (context->getClientVersion() < 3)
3666 {
3667 return gl::error(GL_INVALID_ENUM);
3668 }
3669 *params = texture->getSwizzleGreen();
3670 break;
3671 case GL_TEXTURE_SWIZZLE_B:
3672 if (context->getClientVersion() < 3)
3673 {
3674 return gl::error(GL_INVALID_ENUM);
3675 }
3676 *params = texture->getSwizzleBlue();
3677 break;
3678 case GL_TEXTURE_SWIZZLE_A:
3679 if (context->getClientVersion() < 3)
3680 {
3681 return gl::error(GL_INVALID_ENUM);
3682 }
3683 *params = texture->getSwizzleAlpha();
3684 break;
shannonwoods@chromium.orgabf14cc2013-05-30 00:20:58 +00003685
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003686 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003687 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003688 }
3689 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003690 }
3691 catch(std::bad_alloc&)
3692 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003693 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003694 }
3695}
3696
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003697void __stdcall glGetnUniformfvEXT(GLuint program, GLint location, GLsizei bufSize, GLfloat* params)
3698{
3699 EVENT("(GLuint program = %d, GLint location = %d, GLsizei bufSize = %d, GLfloat* params = 0x%0.8p)",
3700 program, location, bufSize, params);
3701
3702 try
3703 {
3704 if (bufSize < 0)
3705 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003706 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003707 }
3708
3709 gl::Context *context = gl::getNonLostContext();
3710
3711 if (context)
3712 {
3713 if (program == 0)
3714 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003715 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003716 }
3717
3718 gl::Program *programObject = context->getProgram(program);
3719
daniel@transgaming.com716056c2012-07-24 18:38:59 +00003720 if (!programObject || !programObject->isLinked())
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003721 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003722 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003723 }
3724
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003725 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
3726 if (!programBinary)
3727 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003728 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003729 }
3730
3731 if (!programBinary->getUniformfv(location, &bufSize, params))
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003732 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003733 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003734 }
3735 }
3736 }
3737 catch(std::bad_alloc&)
3738 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003739 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003740 }
3741}
3742
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003743void __stdcall glGetUniformfv(GLuint program, GLint location, GLfloat* params)
3744{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003745 EVENT("(GLuint program = %d, GLint location = %d, GLfloat* params = 0x%0.8p)", program, location, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003746
3747 try
3748 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003749 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003750
3751 if (context)
3752 {
3753 if (program == 0)
3754 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003755 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003756 }
3757
3758 gl::Program *programObject = context->getProgram(program);
3759
daniel@transgaming.com716056c2012-07-24 18:38:59 +00003760 if (!programObject || !programObject->isLinked())
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003761 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003762 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003763 }
3764
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003765 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
3766 if (!programBinary)
3767 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003768 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003769 }
3770
3771 if (!programBinary->getUniformfv(location, NULL, params))
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003772 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003773 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003774 }
3775 }
3776 }
3777 catch(std::bad_alloc&)
3778 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003779 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003780 }
3781}
3782
3783void __stdcall glGetnUniformivEXT(GLuint program, GLint location, GLsizei bufSize, GLint* params)
3784{
3785 EVENT("(GLuint program = %d, GLint location = %d, GLsizei bufSize = %d, GLint* params = 0x%0.8p)",
3786 program, location, bufSize, params);
3787
3788 try
3789 {
3790 if (bufSize < 0)
3791 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003792 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003793 }
3794
3795 gl::Context *context = gl::getNonLostContext();
3796
3797 if (context)
3798 {
3799 if (program == 0)
3800 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003801 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003802 }
3803
3804 gl::Program *programObject = context->getProgram(program);
3805
daniel@transgaming.com716056c2012-07-24 18:38:59 +00003806 if (!programObject || !programObject->isLinked())
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003807 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003808 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003809 }
3810
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003811 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
3812 if (!programBinary)
3813 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003814 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003815 }
3816
3817 if (!programBinary->getUniformiv(location, &bufSize, params))
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003818 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003819 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003820 }
3821 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003822 }
3823 catch(std::bad_alloc&)
3824 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003825 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003826 }
3827}
3828
3829void __stdcall glGetUniformiv(GLuint program, GLint location, GLint* params)
3830{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003831 EVENT("(GLuint program = %d, GLint location = %d, GLint* params = 0x%0.8p)", program, location, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003832
3833 try
3834 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003835 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003836
3837 if (context)
3838 {
3839 if (program == 0)
3840 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003841 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003842 }
3843
3844 gl::Program *programObject = context->getProgram(program);
3845
daniel@transgaming.com716056c2012-07-24 18:38:59 +00003846 if (!programObject || !programObject->isLinked())
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003847 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003848 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003849 }
3850
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003851 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
3852 if (!programBinary)
3853 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003854 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003855 }
3856
3857 if (!programBinary->getUniformiv(location, NULL, params))
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003858 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003859 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003860 }
3861 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003862 }
3863 catch(std::bad_alloc&)
3864 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003865 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003866 }
3867}
3868
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00003869int __stdcall glGetUniformLocation(GLuint program, const GLchar* name)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003870{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003871 EVENT("(GLuint program = %d, const GLchar* name = 0x%0.8p)", program, name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003872
3873 try
3874 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003875 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003876
3877 if (strstr(name, "gl_") == name)
3878 {
3879 return -1;
3880 }
3881
3882 if (context)
3883 {
3884 gl::Program *programObject = context->getProgram(program);
3885
3886 if (!programObject)
3887 {
daniel@transgaming.comd1abe5b2010-04-13 19:53:33 +00003888 if (context->getShader(program))
3889 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003890 return gl::error(GL_INVALID_OPERATION, -1);
daniel@transgaming.comd1abe5b2010-04-13 19:53:33 +00003891 }
3892 else
3893 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003894 return gl::error(GL_INVALID_VALUE, -1);
daniel@transgaming.comd1abe5b2010-04-13 19:53:33 +00003895 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003896 }
3897
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003898 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
daniel@transgaming.com716056c2012-07-24 18:38:59 +00003899 if (!programObject->isLinked() || !programBinary)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003900 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003901 return gl::error(GL_INVALID_OPERATION, -1);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003902 }
3903
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003904 return programBinary->getUniformLocation(name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003905 }
3906 }
3907 catch(std::bad_alloc&)
3908 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003909 return gl::error(GL_OUT_OF_MEMORY, -1);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003910 }
3911
3912 return -1;
3913}
3914
3915void __stdcall glGetVertexAttribfv(GLuint index, GLenum pname, GLfloat* params)
3916{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003917 EVENT("(GLuint index = %d, GLenum pname = 0x%X, GLfloat* params = 0x%0.8p)", index, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003918
3919 try
3920 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003921 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003922
daniel@transgaming.come0078962010-04-15 20:45:08 +00003923 if (context)
3924 {
3925 if (index >= gl::MAX_VERTEX_ATTRIBS)
3926 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003927 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.come0078962010-04-15 20:45:08 +00003928 }
3929
daniel@transgaming.com83921382011-01-08 05:46:00 +00003930 const gl::VertexAttribute &attribState = context->getVertexAttribState(index);
daniel@transgaming.com428d1582010-05-04 03:35:25 +00003931
Geoff Lang34dbb6f2013-08-05 15:05:47 -04003932 if (!gl::ValidateGetVertexAttribParameters(pname, context->getClientVersion()))
daniel@transgaming.come0078962010-04-15 20:45:08 +00003933 {
Jamie Madillaff71502013-07-02 11:57:05 -04003934 return;
3935 }
3936
3937 if (pname == GL_CURRENT_VERTEX_ATTRIB)
3938 {
3939 const gl::VertexAttribCurrentValueData &currentValueData = context->getVertexAttribCurrentValue(index);
3940 for (int i = 0; i < 4; ++i)
daniel@transgaming.come0078962010-04-15 20:45:08 +00003941 {
Jamie Madillaff71502013-07-02 11:57:05 -04003942 params[i] = currentValueData.FloatValues[i];
daniel@transgaming.come0078962010-04-15 20:45:08 +00003943 }
Jamie Madillaff71502013-07-02 11:57:05 -04003944 }
3945 else
3946 {
3947 *params = attribState.querySingleParameter<GLfloat>(pname);
daniel@transgaming.come0078962010-04-15 20:45:08 +00003948 }
3949 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003950 }
3951 catch(std::bad_alloc&)
3952 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003953 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003954 }
3955}
3956
3957void __stdcall glGetVertexAttribiv(GLuint index, GLenum pname, GLint* params)
3958{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003959 EVENT("(GLuint index = %d, GLenum pname = 0x%X, GLint* params = 0x%0.8p)", index, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003960
3961 try
3962 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003963 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003964
daniel@transgaming.come0078962010-04-15 20:45:08 +00003965 if (context)
3966 {
3967 if (index >= gl::MAX_VERTEX_ATTRIBS)
3968 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003969 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.come0078962010-04-15 20:45:08 +00003970 }
3971
daniel@transgaming.com83921382011-01-08 05:46:00 +00003972 const gl::VertexAttribute &attribState = context->getVertexAttribState(index);
daniel@transgaming.com428d1582010-05-04 03:35:25 +00003973
Geoff Lang34dbb6f2013-08-05 15:05:47 -04003974 if (!gl::ValidateGetVertexAttribParameters(pname, context->getClientVersion()))
daniel@transgaming.come0078962010-04-15 20:45:08 +00003975 {
Jamie Madillaff71502013-07-02 11:57:05 -04003976 return;
3977 }
3978
3979 if (pname == GL_CURRENT_VERTEX_ATTRIB)
3980 {
3981 const gl::VertexAttribCurrentValueData &currentValueData = context->getVertexAttribCurrentValue(index);
3982 for (int i = 0; i < 4; ++i)
daniel@transgaming.come0078962010-04-15 20:45:08 +00003983 {
Jamie Madillaff71502013-07-02 11:57:05 -04003984 float currentValue = currentValueData.FloatValues[i];
Jamie Madillaf496912013-07-19 16:36:54 -04003985 params[i] = gl::iround<GLint>(currentValue);
daniel@transgaming.come0078962010-04-15 20:45:08 +00003986 }
Jamie Madillaff71502013-07-02 11:57:05 -04003987 }
3988 else
3989 {
3990 *params = attribState.querySingleParameter<GLint>(pname);
daniel@transgaming.come0078962010-04-15 20:45:08 +00003991 }
3992 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003993 }
3994 catch(std::bad_alloc&)
3995 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003996 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003997 }
3998}
3999
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00004000void __stdcall glGetVertexAttribPointerv(GLuint index, GLenum pname, GLvoid** pointer)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004001{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004002 EVENT("(GLuint index = %d, GLenum pname = 0x%X, GLvoid** pointer = 0x%0.8p)", index, pname, pointer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004003
4004 try
4005 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004006 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004007
daniel@transgaming.come0078962010-04-15 20:45:08 +00004008 if (context)
4009 {
4010 if (index >= gl::MAX_VERTEX_ATTRIBS)
4011 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004012 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004013 }
4014
4015 if (pname != GL_VERTEX_ATTRIB_ARRAY_POINTER)
4016 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004017 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004018 }
4019
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004020 *pointer = const_cast<GLvoid*>(context->getVertexAttribPointer(index));
daniel@transgaming.come0078962010-04-15 20:45:08 +00004021 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004022 }
4023 catch(std::bad_alloc&)
4024 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004025 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004026 }
4027}
4028
4029void __stdcall glHint(GLenum target, GLenum mode)
4030{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004031 EVENT("(GLenum target = 0x%X, GLenum mode = 0x%X)", target, mode);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004032
4033 try
4034 {
alokp@chromium.orgd303ef92010-09-09 17:30:15 +00004035 switch (mode)
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00004036 {
alokp@chromium.orgd303ef92010-09-09 17:30:15 +00004037 case GL_FASTEST:
4038 case GL_NICEST:
4039 case GL_DONT_CARE:
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00004040 break;
4041 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004042 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00004043 }
4044
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004045 gl::Context *context = gl::getNonLostContext();
alokp@chromium.orgd303ef92010-09-09 17:30:15 +00004046 switch (target)
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00004047 {
alokp@chromium.orgd303ef92010-09-09 17:30:15 +00004048 case GL_GENERATE_MIPMAP_HINT:
4049 if (context) context->setGenerateMipmapHint(mode);
4050 break;
4051 case GL_FRAGMENT_SHADER_DERIVATIVE_HINT_OES:
4052 if (context) context->setFragmentShaderDerivativeHint(mode);
4053 break;
4054 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004055 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00004056 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004057 }
4058 catch(std::bad_alloc&)
4059 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004060 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004061 }
4062}
4063
4064GLboolean __stdcall glIsBuffer(GLuint buffer)
4065{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004066 EVENT("(GLuint buffer = %d)", buffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004067
4068 try
4069 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004070 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004071
4072 if (context && buffer)
4073 {
4074 gl::Buffer *bufferObject = context->getBuffer(buffer);
4075
4076 if (bufferObject)
4077 {
4078 return GL_TRUE;
4079 }
4080 }
4081 }
4082 catch(std::bad_alloc&)
4083 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004084 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004085 }
4086
4087 return GL_FALSE;
4088}
4089
4090GLboolean __stdcall glIsEnabled(GLenum cap)
4091{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004092 EVENT("(GLenum cap = 0x%X)", cap);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004093
4094 try
4095 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004096 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004097
4098 if (context)
4099 {
Geoff Lang0550d032014-01-30 11:29:07 -05004100 if (!ValidCap(context, cap))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004101 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004102 return gl::error(GL_INVALID_ENUM, false);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004103 }
Geoff Lang0550d032014-01-30 11:29:07 -05004104
4105 return context->getCap(cap);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004106 }
4107 }
4108 catch(std::bad_alloc&)
4109 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004110 return gl::error(GL_OUT_OF_MEMORY, false);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004111 }
4112
4113 return false;
4114}
4115
daniel@transgaming.comfe208882010-09-01 15:47:57 +00004116GLboolean __stdcall glIsFenceNV(GLuint fence)
4117{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004118 EVENT("(GLuint fence = %d)", fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004119
4120 try
4121 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004122 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004123
4124 if (context)
4125 {
Jamie Madill33dc8432013-07-26 11:55:05 -04004126 gl::FenceNV *fenceObject = context->getFenceNV(fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004127
4128 if (fenceObject == NULL)
4129 {
4130 return GL_FALSE;
4131 }
4132
4133 return fenceObject->isFence();
4134 }
4135 }
4136 catch(std::bad_alloc&)
4137 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004138 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004139 }
4140
4141 return GL_FALSE;
daniel@transgaming.comfe208882010-09-01 15:47:57 +00004142}
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004143
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004144GLboolean __stdcall glIsFramebuffer(GLuint framebuffer)
4145{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004146 EVENT("(GLuint framebuffer = %d)", framebuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004147
4148 try
4149 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004150 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004151
4152 if (context && framebuffer)
4153 {
4154 gl::Framebuffer *framebufferObject = context->getFramebuffer(framebuffer);
4155
4156 if (framebufferObject)
4157 {
4158 return GL_TRUE;
4159 }
4160 }
4161 }
4162 catch(std::bad_alloc&)
4163 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004164 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004165 }
4166
4167 return GL_FALSE;
4168}
4169
4170GLboolean __stdcall glIsProgram(GLuint program)
4171{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004172 EVENT("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004173
4174 try
4175 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004176 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004177
4178 if (context && program)
4179 {
4180 gl::Program *programObject = context->getProgram(program);
4181
4182 if (programObject)
4183 {
4184 return GL_TRUE;
4185 }
4186 }
4187 }
4188 catch(std::bad_alloc&)
4189 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004190 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004191 }
4192
4193 return GL_FALSE;
4194}
4195
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00004196GLboolean __stdcall glIsQueryEXT(GLuint id)
4197{
4198 EVENT("(GLuint id = %d)", id);
4199
4200 try
4201 {
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00004202 gl::Context *context = gl::getNonLostContext();
4203
4204 if (context)
4205 {
Geoff Lang37dde692014-01-31 16:34:54 -05004206 return (context->getQuery(id, false, GL_NONE) != NULL) ? GL_TRUE : GL_FALSE;
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00004207 }
4208 }
4209 catch(std::bad_alloc&)
4210 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004211 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00004212 }
4213
4214 return GL_FALSE;
4215}
4216
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004217GLboolean __stdcall glIsRenderbuffer(GLuint renderbuffer)
4218{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004219 EVENT("(GLuint renderbuffer = %d)", renderbuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004220
4221 try
4222 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004223 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004224
4225 if (context && renderbuffer)
4226 {
4227 gl::Renderbuffer *renderbufferObject = context->getRenderbuffer(renderbuffer);
4228
4229 if (renderbufferObject)
4230 {
4231 return GL_TRUE;
4232 }
4233 }
4234 }
4235 catch(std::bad_alloc&)
4236 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004237 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004238 }
4239
4240 return GL_FALSE;
4241}
4242
4243GLboolean __stdcall glIsShader(GLuint shader)
4244{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004245 EVENT("(GLuint shader = %d)", shader);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004246
4247 try
4248 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004249 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004250
4251 if (context && shader)
4252 {
4253 gl::Shader *shaderObject = context->getShader(shader);
4254
4255 if (shaderObject)
4256 {
4257 return GL_TRUE;
4258 }
4259 }
4260 }
4261 catch(std::bad_alloc&)
4262 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004263 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004264 }
4265
4266 return GL_FALSE;
4267}
4268
4269GLboolean __stdcall glIsTexture(GLuint texture)
4270{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004271 EVENT("(GLuint texture = %d)", texture);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004272
4273 try
4274 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004275 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004276
4277 if (context && texture)
4278 {
4279 gl::Texture *textureObject = context->getTexture(texture);
4280
4281 if (textureObject)
4282 {
4283 return GL_TRUE;
4284 }
4285 }
4286 }
4287 catch(std::bad_alloc&)
4288 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004289 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004290 }
4291
4292 return GL_FALSE;
4293}
4294
4295void __stdcall glLineWidth(GLfloat width)
4296{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004297 EVENT("(GLfloat width = %f)", width);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004298
4299 try
4300 {
4301 if (width <= 0.0f)
4302 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004303 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004304 }
4305
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004306 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com32e58cd2010-03-24 09:44:10 +00004307
4308 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004309 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004310 context->setLineWidth(width);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004311 }
4312 }
4313 catch(std::bad_alloc&)
4314 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004315 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004316 }
4317}
4318
4319void __stdcall glLinkProgram(GLuint program)
4320{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004321 EVENT("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004322
4323 try
4324 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004325 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004326
4327 if (context)
4328 {
4329 gl::Program *programObject = context->getProgram(program);
4330
4331 if (!programObject)
4332 {
daniel@transgaming.com277b7142010-04-13 03:26:44 +00004333 if (context->getShader(program))
4334 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004335 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com277b7142010-04-13 03:26:44 +00004336 }
4337 else
4338 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004339 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com277b7142010-04-13 03:26:44 +00004340 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004341 }
4342
daniel@transgaming.com95d29422012-07-24 18:36:10 +00004343 context->linkProgram(program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004344 }
4345 }
4346 catch(std::bad_alloc&)
4347 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004348 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004349 }
4350}
4351
4352void __stdcall glPixelStorei(GLenum pname, GLint param)
4353{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004354 EVENT("(GLenum pname = 0x%X, GLint param = %d)", pname, param);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004355
4356 try
4357 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004358 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004359
4360 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004361 {
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004362 switch (pname)
4363 {
4364 case GL_UNPACK_ALIGNMENT:
4365 if (param != 1 && param != 2 && param != 4 && param != 8)
4366 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004367 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004368 }
4369
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004370 context->setUnpackAlignment(param);
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004371 break;
4372
4373 case GL_PACK_ALIGNMENT:
4374 if (param != 1 && param != 2 && param != 4 && param != 8)
4375 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004376 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004377 }
4378
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004379 context->setPackAlignment(param);
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004380 break;
4381
bsalomon@google.com56d46ab2011-11-23 14:53:10 +00004382 case GL_PACK_REVERSE_ROW_ORDER_ANGLE:
4383 context->setPackReverseRowOrder(param != 0);
4384 break;
4385
shannonwoods@chromium.orgabf14cc2013-05-30 00:20:58 +00004386 case GL_UNPACK_IMAGE_HEIGHT:
4387 case GL_UNPACK_SKIP_IMAGES:
4388 case GL_UNPACK_ROW_LENGTH:
4389 case GL_UNPACK_SKIP_ROWS:
4390 case GL_UNPACK_SKIP_PIXELS:
4391 case GL_PACK_ROW_LENGTH:
4392 case GL_PACK_SKIP_ROWS:
4393 case GL_PACK_SKIP_PIXELS:
4394 if (context->getClientVersion() < 3)
4395 {
4396 return gl::error(GL_INVALID_ENUM);
4397 }
4398 UNIMPLEMENTED();
4399 break;
4400
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004401 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004402 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004403 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004404 }
4405 }
4406 catch(std::bad_alloc&)
4407 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004408 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004409 }
4410}
4411
4412void __stdcall glPolygonOffset(GLfloat factor, GLfloat units)
4413{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004414 EVENT("(GLfloat factor = %f, GLfloat units = %f)", factor, units);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004415
4416 try
4417 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004418 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comaede6302010-04-29 03:35:48 +00004419
4420 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004421 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004422 context->setPolygonOffsetParams(factor, units);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004423 }
4424 }
4425 catch(std::bad_alloc&)
4426 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004427 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004428 }
4429}
4430
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00004431void __stdcall glReadnPixelsEXT(GLint x, GLint y, GLsizei width, GLsizei height,
4432 GLenum format, GLenum type, GLsizei bufSize,
4433 GLvoid *data)
4434{
4435 EVENT("(GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d, "
4436 "GLenum format = 0x%X, GLenum type = 0x%X, GLsizei bufSize = 0x%d, GLvoid *data = 0x%0.8p)",
4437 x, y, width, height, format, type, bufSize, data);
4438
4439 try
4440 {
4441 if (width < 0 || height < 0 || bufSize < 0)
4442 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004443 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00004444 }
4445
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00004446 gl::Context *context = gl::getNonLostContext();
4447
4448 if (context)
4449 {
Geoff Lang005df412013-10-16 14:12:50 -04004450 GLenum currentInternalFormat, currentFormat, currentType;
shannonwoods@chromium.org44a4f982013-05-30 00:13:49 +00004451
daniel@transgaming.com42944b02012-09-27 17:45:57 +00004452 // Failure in getCurrentReadFormatType indicates that no color attachment is currently bound,
4453 // and attempting to read back if that's the case is an error. The error will be registered
4454 // by getCurrentReadFormat.
shannonwoods@chromium.org44a4f982013-05-30 00:13:49 +00004455 if (!context->getCurrentReadFormatType(&currentInternalFormat, &currentFormat, &currentType))
daniel@transgaming.com42944b02012-09-27 17:45:57 +00004456 return;
4457
Geoff Lang34dbb6f2013-08-05 15:05:47 -04004458 bool validReadFormat = (context->getClientVersion() < 3) ? gl::ValidES2ReadFormatType(format, type) :
4459 gl::ValidES3ReadFormatType(currentInternalFormat, format, type);
shannonwoods@chromium.org44a4f982013-05-30 00:13:49 +00004460
4461 if (!(currentFormat == format && currentType == type) && !validReadFormat)
daniel@transgaming.com42944b02012-09-27 17:45:57 +00004462 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004463 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com42944b02012-09-27 17:45:57 +00004464 }
4465
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00004466 context->readPixels(x, y, width, height, format, type, &bufSize, data);
4467 }
4468 }
4469 catch(std::bad_alloc&)
4470 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004471 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00004472 }
4473}
4474
4475void __stdcall glReadPixels(GLint x, GLint y, GLsizei width, GLsizei height,
4476 GLenum format, GLenum type, GLvoid* pixels)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004477{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004478 EVENT("(GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00004479 "GLenum format = 0x%X, GLenum type = 0x%X, GLvoid* pixels = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00004480 x, y, width, height, format, type, pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004481
4482 try
4483 {
4484 if (width < 0 || height < 0)
4485 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004486 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004487 }
4488
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004489 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004490
4491 if (context)
4492 {
Geoff Lang005df412013-10-16 14:12:50 -04004493 GLenum currentInternalFormat, currentFormat, currentType;
shannonwoods@chromium.org44a4f982013-05-30 00:13:49 +00004494
daniel@transgaming.com42944b02012-09-27 17:45:57 +00004495 // Failure in getCurrentReadFormatType indicates that no color attachment is currently bound,
4496 // and attempting to read back if that's the case is an error. The error will be registered
4497 // by getCurrentReadFormat.
shannonwoods@chromium.org44a4f982013-05-30 00:13:49 +00004498 if (!context->getCurrentReadFormatType(&currentInternalFormat, &currentFormat, &currentType))
daniel@transgaming.com42944b02012-09-27 17:45:57 +00004499 return;
4500
Geoff Lang34dbb6f2013-08-05 15:05:47 -04004501 bool validReadFormat = (context->getClientVersion() < 3) ? gl::ValidES2ReadFormatType(format, type) :
4502 gl::ValidES3ReadFormatType(currentInternalFormat, format, type);
shannonwoods@chromium.org44a4f982013-05-30 00:13:49 +00004503
4504 if (!(currentFormat == format && currentType == type) && !validReadFormat)
daniel@transgaming.com42944b02012-09-27 17:45:57 +00004505 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004506 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com42944b02012-09-27 17:45:57 +00004507 }
4508
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00004509 context->readPixels(x, y, width, height, format, type, NULL, pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004510 }
4511 }
4512 catch(std::bad_alloc&)
4513 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004514 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004515 }
4516}
4517
4518void __stdcall glReleaseShaderCompiler(void)
4519{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004520 EVENT("()");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004521
4522 try
4523 {
4524 gl::Shader::releaseCompiler();
4525 }
4526 catch(std::bad_alloc&)
4527 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004528 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004529 }
4530}
4531
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00004532void __stdcall glRenderbufferStorageMultisampleANGLE(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004533{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004534 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 +00004535 target, samples, internalformat, width, height);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004536
4537 try
4538 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004539 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004540
4541 if (context)
4542 {
Geoff Lang34dbb6f2013-08-05 15:05:47 -04004543 if (!ValidateRenderbufferStorageParameters(context, target, samples, internalformat,
Geoff Lang2e1dcd52013-05-29 10:34:08 -04004544 width, height, true))
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +00004545 {
Geoff Lang2e1dcd52013-05-29 10:34:08 -04004546 return;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004547 }
shannon.woods%transgaming.com@gtempaccount.com8dce6512013-04-13 03:42:19 +00004548
4549 context->setRenderbufferStorage(width, height, internalformat, samples);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004550 }
4551 }
4552 catch(std::bad_alloc&)
4553 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004554 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004555 }
4556}
4557
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00004558void __stdcall glRenderbufferStorage(GLenum target, GLenum internalformat, GLsizei width, GLsizei height)
4559{
4560 glRenderbufferStorageMultisampleANGLE(target, 0, internalformat, width, height);
4561}
4562
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004563void __stdcall glSampleCoverage(GLclampf value, GLboolean invert)
4564{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00004565 EVENT("(GLclampf value = %f, GLboolean invert = %u)", value, invert);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004566
4567 try
4568 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004569 gl::Context* context = gl::getNonLostContext();
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00004570
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004571 if (context)
4572 {
daniel@transgaming.coma36f98e2010-05-18 18:51:09 +00004573 context->setSampleCoverageParams(gl::clamp01(value), invert == GL_TRUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004574 }
4575 }
4576 catch(std::bad_alloc&)
4577 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004578 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004579 }
4580}
4581
daniel@transgaming.comfe208882010-09-01 15:47:57 +00004582void __stdcall glSetFenceNV(GLuint fence, GLenum condition)
4583{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004584 EVENT("(GLuint fence = %d, GLenum condition = 0x%X)", fence, condition);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004585
4586 try
4587 {
4588 if (condition != GL_ALL_COMPLETED_NV)
4589 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004590 return gl::error(GL_INVALID_ENUM);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004591 }
4592
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004593 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004594
4595 if (context)
4596 {
Jamie Madill33dc8432013-07-26 11:55:05 -04004597 gl::FenceNV *fenceObject = context->getFenceNV(fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004598
4599 if (fenceObject == NULL)
4600 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004601 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004602 }
4603
4604 fenceObject->setFence(condition);
4605 }
4606 }
4607 catch(std::bad_alloc&)
4608 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004609 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004610 }
daniel@transgaming.comfe208882010-09-01 15:47:57 +00004611}
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004612
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004613void __stdcall glScissor(GLint x, GLint y, GLsizei width, GLsizei height)
4614{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004615 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 +00004616
4617 try
4618 {
4619 if (width < 0 || height < 0)
4620 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004621 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004622 }
4623
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004624 gl::Context* context = gl::getNonLostContext();
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00004625
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004626 if (context)
4627 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004628 context->setScissorParams(x, y, width, height);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004629 }
4630 }
4631 catch(std::bad_alloc&)
4632 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004633 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004634 }
4635}
4636
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00004637void __stdcall glShaderBinary(GLsizei n, const GLuint* shaders, GLenum binaryformat, const GLvoid* binary, GLsizei length)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004638{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004639 EVENT("(GLsizei n = %d, const GLuint* shaders = 0x%0.8p, GLenum binaryformat = 0x%X, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00004640 "const GLvoid* binary = 0x%0.8p, GLsizei length = %d)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00004641 n, shaders, binaryformat, binary, length);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004642
4643 try
4644 {
daniel@transgaming.comd1f667f2010-04-29 03:38:52 +00004645 // No binary shader formats are supported.
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004646 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004647 }
4648 catch(std::bad_alloc&)
4649 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004650 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004651 }
4652}
4653
shannon.woods%transgaming.com@gtempaccount.com5f339332013-04-13 03:29:02 +00004654void __stdcall glShaderSource(GLuint shader, GLsizei count, const GLchar* const* string, const GLint* length)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004655{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004656 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 +00004657 shader, count, string, length);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004658
4659 try
4660 {
daniel@transgaming.com8e6a6be2010-04-13 03:26:41 +00004661 if (count < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004662 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004663 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004664 }
4665
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004666 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004667
4668 if (context)
4669 {
4670 gl::Shader *shaderObject = context->getShader(shader);
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00004671
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004672 if (!shaderObject)
4673 {
daniel@transgaming.com8e6a6be2010-04-13 03:26:41 +00004674 if (context->getProgram(shader))
4675 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004676 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com8e6a6be2010-04-13 03:26:41 +00004677 }
4678 else
4679 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004680 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com8e6a6be2010-04-13 03:26:41 +00004681 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004682 }
4683
4684 shaderObject->setSource(count, string, length);
4685 }
4686 }
4687 catch(std::bad_alloc&)
4688 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004689 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004690 }
4691}
4692
4693void __stdcall glStencilFunc(GLenum func, GLint ref, GLuint mask)
4694{
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00004695 glStencilFuncSeparate(GL_FRONT_AND_BACK, func, ref, mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004696}
4697
4698void __stdcall glStencilFuncSeparate(GLenum face, GLenum func, GLint ref, GLuint mask)
4699{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004700 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 +00004701
4702 try
4703 {
4704 switch (face)
4705 {
4706 case GL_FRONT:
4707 case GL_BACK:
4708 case GL_FRONT_AND_BACK:
4709 break;
4710 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004711 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004712 }
4713
4714 switch (func)
4715 {
4716 case GL_NEVER:
4717 case GL_ALWAYS:
4718 case GL_LESS:
4719 case GL_LEQUAL:
4720 case GL_EQUAL:
4721 case GL_GEQUAL:
4722 case GL_GREATER:
4723 case GL_NOTEQUAL:
4724 break;
4725 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004726 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004727 }
4728
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004729 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004730
4731 if (context)
4732 {
4733 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
4734 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004735 context->setStencilParams(func, ref, mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004736 }
4737
4738 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
4739 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004740 context->setStencilBackParams(func, ref, mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004741 }
4742 }
4743 }
4744 catch(std::bad_alloc&)
4745 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004746 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004747 }
4748}
4749
4750void __stdcall glStencilMask(GLuint mask)
4751{
4752 glStencilMaskSeparate(GL_FRONT_AND_BACK, mask);
4753}
4754
4755void __stdcall glStencilMaskSeparate(GLenum face, GLuint mask)
4756{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004757 EVENT("(GLenum face = 0x%X, GLuint mask = %d)", face, mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004758
4759 try
4760 {
4761 switch (face)
4762 {
4763 case GL_FRONT:
4764 case GL_BACK:
4765 case GL_FRONT_AND_BACK:
4766 break;
4767 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004768 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004769 }
4770
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004771 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004772
4773 if (context)
4774 {
4775 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
4776 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004777 context->setStencilWritemask(mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004778 }
4779
4780 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
4781 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004782 context->setStencilBackWritemask(mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004783 }
4784 }
4785 }
4786 catch(std::bad_alloc&)
4787 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004788 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004789 }
4790}
4791
4792void __stdcall glStencilOp(GLenum fail, GLenum zfail, GLenum zpass)
4793{
4794 glStencilOpSeparate(GL_FRONT_AND_BACK, fail, zfail, zpass);
4795}
4796
4797void __stdcall glStencilOpSeparate(GLenum face, GLenum fail, GLenum zfail, GLenum zpass)
4798{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004799 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 +00004800 face, fail, zfail, zpass);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004801
4802 try
4803 {
4804 switch (face)
4805 {
4806 case GL_FRONT:
4807 case GL_BACK:
4808 case GL_FRONT_AND_BACK:
4809 break;
4810 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004811 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004812 }
4813
4814 switch (fail)
4815 {
4816 case GL_ZERO:
4817 case GL_KEEP:
4818 case GL_REPLACE:
4819 case GL_INCR:
4820 case GL_DECR:
4821 case GL_INVERT:
4822 case GL_INCR_WRAP:
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00004823 case GL_DECR_WRAP:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004824 break;
4825 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004826 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004827 }
4828
4829 switch (zfail)
4830 {
4831 case GL_ZERO:
4832 case GL_KEEP:
4833 case GL_REPLACE:
4834 case GL_INCR:
4835 case GL_DECR:
4836 case GL_INVERT:
4837 case GL_INCR_WRAP:
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00004838 case GL_DECR_WRAP:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004839 break;
4840 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004841 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004842 }
4843
4844 switch (zpass)
4845 {
4846 case GL_ZERO:
4847 case GL_KEEP:
4848 case GL_REPLACE:
4849 case GL_INCR:
4850 case GL_DECR:
4851 case GL_INVERT:
4852 case GL_INCR_WRAP:
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00004853 case GL_DECR_WRAP:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004854 break;
4855 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004856 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004857 }
4858
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004859 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004860
4861 if (context)
4862 {
4863 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
4864 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004865 context->setStencilOperations(fail, zfail, zpass);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004866 }
4867
4868 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
4869 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004870 context->setStencilBackOperations(fail, zfail, zpass);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004871 }
4872 }
4873 }
4874 catch(std::bad_alloc&)
4875 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004876 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004877 }
4878}
4879
daniel@transgaming.comfe208882010-09-01 15:47:57 +00004880GLboolean __stdcall glTestFenceNV(GLuint fence)
4881{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004882 EVENT("(GLuint fence = %d)", fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004883
4884 try
4885 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004886 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004887
4888 if (context)
4889 {
Jamie Madill33dc8432013-07-26 11:55:05 -04004890 gl::FenceNV *fenceObject = context->getFenceNV(fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004891
4892 if (fenceObject == NULL)
4893 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004894 return gl::error(GL_INVALID_OPERATION, GL_TRUE);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004895 }
4896
Jamie Madillfb9a7402013-07-26 11:55:01 -04004897 if (fenceObject->isFence() != GL_TRUE)
4898 {
4899 return gl::error(GL_INVALID_OPERATION, GL_TRUE);
4900 }
4901
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004902 return fenceObject->testFence();
4903 }
4904 }
4905 catch(std::bad_alloc&)
4906 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004907 gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004908 }
4909
4910 return GL_TRUE;
daniel@transgaming.comfe208882010-09-01 15:47:57 +00004911}
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004912
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00004913void __stdcall glTexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height,
4914 GLint border, GLenum format, GLenum type, const GLvoid* pixels)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004915{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004916 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint internalformat = %d, GLsizei width = %d, GLsizei height = %d, "
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05004917 "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 +00004918 target, level, internalformat, width, height, border, format, type, pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004919
4920 try
4921 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004922 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004923
4924 if (context)
4925 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00004926 if (context->getClientVersion() < 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -04004927 !ValidateES2TexImageParameters(context, target, level, internalformat, false, false,
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00004928 0, 0, width, height, border, format, type, pixels))
daniel@transgaming.com32b11442011-11-19 02:42:48 +00004929 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00004930 return;
4931 }
4932
4933 if (context->getClientVersion() >= 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -04004934 !ValidateES3TexImageParameters(context, target, level, internalformat, false, false,
Jamie Madillefb2a6f2013-09-24 10:22:42 -04004935 0, 0, 0, width, height, 1, border, format, type, pixels))
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00004936 {
4937 return;
daniel@transgaming.com32b11442011-11-19 02:42:48 +00004938 }
4939
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00004940 switch (target)
4941 {
4942 case GL_TEXTURE_2D:
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00004943 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00004944 gl::Texture2D *texture = context->getTexture2D();
Jamie Madill88f18f42013-09-18 14:36:19 -04004945 texture->setImage(level, width, height, internalformat, format, type, context->getUnpackState(), pixels);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00004946 }
4947 break;
4948 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00004949 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00004950 gl::TextureCubeMap *texture = context->getTextureCubeMap();
Jamie Madill88f18f42013-09-18 14:36:19 -04004951 texture->setImagePosX(level, width, height, internalformat, format, type, context->getUnpackState(), pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004952 }
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00004953 break;
4954 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
4955 {
4956 gl::TextureCubeMap *texture = context->getTextureCubeMap();
Jamie Madill88f18f42013-09-18 14:36:19 -04004957 texture->setImageNegX(level, width, height, internalformat, format, type, context->getUnpackState(), pixels);
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00004958 }
4959 break;
4960 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
4961 {
4962 gl::TextureCubeMap *texture = context->getTextureCubeMap();
Jamie Madill88f18f42013-09-18 14:36:19 -04004963 texture->setImagePosY(level, width, height, internalformat, format, type, context->getUnpackState(), pixels);
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00004964 }
4965 break;
4966 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
4967 {
4968 gl::TextureCubeMap *texture = context->getTextureCubeMap();
Jamie Madill88f18f42013-09-18 14:36:19 -04004969 texture->setImageNegY(level, width, height, internalformat, format, type, context->getUnpackState(), pixels);
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00004970 }
4971 break;
4972 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
4973 {
4974 gl::TextureCubeMap *texture = context->getTextureCubeMap();
Jamie Madill88f18f42013-09-18 14:36:19 -04004975 texture->setImagePosZ(level, width, height, internalformat, format, type, context->getUnpackState(), pixels);
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00004976 }
4977 break;
4978 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
4979 {
4980 gl::TextureCubeMap *texture = context->getTextureCubeMap();
Jamie Madill88f18f42013-09-18 14:36:19 -04004981 texture->setImageNegZ(level, width, height, internalformat, format, type, context->getUnpackState(), pixels);
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00004982 }
4983 break;
4984 default: UNREACHABLE();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004985 }
4986 }
4987 }
4988 catch(std::bad_alloc&)
4989 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004990 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004991 }
4992}
4993
4994void __stdcall glTexParameterf(GLenum target, GLenum pname, GLfloat param)
4995{
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00004996 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLint param = %f)", target, pname, param);
4997
4998 try
4999 {
5000 gl::Context *context = gl::getNonLostContext();
5001
5002 if (context)
5003 {
Geoff Lang34dbb6f2013-08-05 15:05:47 -04005004 if (!ValidateTexParamParameters(context, pname, static_cast<GLint>(param)))
Jamie Madill478fdb22013-07-19 16:36:59 -04005005 {
5006 return;
5007 }
5008
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05005009 gl::Texture *texture = context->getTargetTexture(target);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005010
Jamie Madillfb8a8302013-07-03 14:24:12 -04005011 if (!texture)
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005012 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005013 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005014 }
5015
5016 switch (pname)
5017 {
Jamie Madill478fdb22013-07-19 16:36:59 -04005018 case GL_TEXTURE_WRAP_S: texture->setWrapS(gl::uiround<GLenum>(param)); break;
5019 case GL_TEXTURE_WRAP_T: texture->setWrapT(gl::uiround<GLenum>(param)); break;
5020 case GL_TEXTURE_WRAP_R: texture->setWrapR(gl::uiround<GLenum>(param)); break;
5021 case GL_TEXTURE_MIN_FILTER: texture->setMinFilter(gl::uiround<GLenum>(param)); break;
5022 case GL_TEXTURE_MAG_FILTER: texture->setMagFilter(gl::uiround<GLenum>(param)); break;
5023 case GL_TEXTURE_USAGE_ANGLE: texture->setUsage(gl::uiround<GLenum>(param)); break;
5024 case GL_TEXTURE_MAX_ANISOTROPY_EXT: texture->setMaxAnisotropy(static_cast<GLfloat>(param), context->getTextureMaxAnisotropy()); break;
5025 case GL_TEXTURE_COMPARE_MODE: texture->setCompareMode(gl::uiround<GLenum>(param)); break;
5026 case GL_TEXTURE_COMPARE_FUNC: texture->setCompareFunc(gl::uiround<GLenum>(param)); break;
Geoff Langbc90a482013-09-17 16:51:27 -04005027 case GL_TEXTURE_SWIZZLE_R: texture->setSwizzleRed(gl::uiround<GLenum>(param)); break;
5028 case GL_TEXTURE_SWIZZLE_G: texture->setSwizzleGreen(gl::uiround<GLenum>(param)); break;
5029 case GL_TEXTURE_SWIZZLE_B: texture->setSwizzleBlue(gl::uiround<GLenum>(param)); break;
5030 case GL_TEXTURE_SWIZZLE_A: texture->setSwizzleAlpha(gl::uiround<GLenum>(param)); break;
shannonwoods@chromium.orgabf14cc2013-05-30 00:20:58 +00005031
Jamie Madill478fdb22013-07-19 16:36:59 -04005032 case GL_TEXTURE_BASE_LEVEL:
5033 case GL_TEXTURE_MAX_LEVEL:
shannonwoods@chromium.orgabf14cc2013-05-30 00:20:58 +00005034 case GL_TEXTURE_MIN_LOD:
5035 case GL_TEXTURE_MAX_LOD:
shannonwoods@chromium.orgabf14cc2013-05-30 00:20:58 +00005036 UNIMPLEMENTED();
5037 break;
5038
Jamie Madill478fdb22013-07-19 16:36:59 -04005039 default: UNREACHABLE(); break;
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005040 }
5041 }
5042 }
5043 catch(std::bad_alloc&)
5044 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005045 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005046 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005047}
5048
5049void __stdcall glTexParameterfv(GLenum target, GLenum pname, const GLfloat* params)
5050{
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005051 glTexParameterf(target, pname, (GLfloat)*params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005052}
5053
5054void __stdcall glTexParameteri(GLenum target, GLenum pname, GLint param)
5055{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005056 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLint param = %d)", target, pname, param);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005057
5058 try
5059 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005060 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005061
5062 if (context)
5063 {
Geoff Lang34dbb6f2013-08-05 15:05:47 -04005064 if (!ValidateTexParamParameters(context, pname, param))
Jamie Madill478fdb22013-07-19 16:36:59 -04005065 {
5066 return;
5067 }
5068
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05005069 gl::Texture *texture = context->getTargetTexture(target);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005070
Jamie Madillfb8a8302013-07-03 14:24:12 -04005071 if (!texture)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005072 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005073 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005074 }
5075
5076 switch (pname)
5077 {
Jamie Madill478fdb22013-07-19 16:36:59 -04005078 case GL_TEXTURE_WRAP_S: texture->setWrapS((GLenum)param); break;
5079 case GL_TEXTURE_WRAP_T: texture->setWrapT((GLenum)param); break;
5080 case GL_TEXTURE_WRAP_R: texture->setWrapR((GLenum)param); break;
5081 case GL_TEXTURE_MIN_FILTER: texture->setMinFilter((GLenum)param); break;
5082 case GL_TEXTURE_MAG_FILTER: texture->setMagFilter((GLenum)param); break;
5083 case GL_TEXTURE_USAGE_ANGLE: texture->setUsage((GLenum)param); break;
5084 case GL_TEXTURE_MAX_ANISOTROPY_EXT: texture->setMaxAnisotropy((float)param, context->getTextureMaxAnisotropy()); break;
5085 case GL_TEXTURE_COMPARE_MODE: texture->setCompareMode((GLenum)param); break;
5086 case GL_TEXTURE_COMPARE_FUNC: texture->setCompareFunc((GLenum)param); break;
Geoff Langbc90a482013-09-17 16:51:27 -04005087 case GL_TEXTURE_SWIZZLE_R: texture->setSwizzleRed((GLenum)param); break;
5088 case GL_TEXTURE_SWIZZLE_G: texture->setSwizzleGreen((GLenum)param); break;
5089 case GL_TEXTURE_SWIZZLE_B: texture->setSwizzleBlue((GLenum)param); break;
5090 case GL_TEXTURE_SWIZZLE_A: texture->setSwizzleAlpha((GLenum)param); break;
shannonwoods@chromium.orgabf14cc2013-05-30 00:20:58 +00005091
shannonwoods@chromium.orgabf14cc2013-05-30 00:20:58 +00005092 case GL_TEXTURE_BASE_LEVEL:
5093 case GL_TEXTURE_MAX_LEVEL:
Jamie Madill478fdb22013-07-19 16:36:59 -04005094 case GL_TEXTURE_MIN_LOD:
5095 case GL_TEXTURE_MAX_LOD:
shannonwoods@chromium.orgabf14cc2013-05-30 00:20:58 +00005096 UNIMPLEMENTED();
5097 break;
5098
Jamie Madill478fdb22013-07-19 16:36:59 -04005099 default: UNREACHABLE(); break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005100 }
5101 }
5102 }
5103 catch(std::bad_alloc&)
5104 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005105 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005106 }
5107}
5108
5109void __stdcall glTexParameteriv(GLenum target, GLenum pname, const GLint* params)
5110{
5111 glTexParameteri(target, pname, *params);
5112}
5113
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005114void __stdcall glTexStorage2DEXT(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height)
5115{
5116 EVENT("(GLenum target = 0x%X, GLsizei levels = %d, GLenum internalformat = 0x%X, GLsizei width = %d, GLsizei height = %d)",
5117 target, levels, internalformat, width, height);
5118
5119 try
5120 {
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005121 gl::Context *context = gl::getNonLostContext();
5122
5123 if (context)
5124 {
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00005125 if (context->getClientVersion() < 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -04005126 !ValidateES2TexStorageParameters(context, target, levels, internalformat, width, height))
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +00005127 {
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00005128 return;
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +00005129 }
5130
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00005131 if (context->getClientVersion() >= 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -04005132 !ValidateES3TexStorageParameters(context, target, levels, internalformat, width, height, 1))
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +00005133 {
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00005134 return;
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +00005135 }
5136
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00005137 switch (target)
5138 {
5139 case GL_TEXTURE_2D:
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00005140 {
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00005141 gl::Texture2D *texture2d = context->getTexture2D();
5142 texture2d->storage(levels, internalformat, width, height);
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00005143 }
5144 break;
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00005145
Geoff Lang01c21d22013-09-24 11:52:16 -04005146 case GL_TEXTURE_CUBE_MAP:
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00005147 {
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00005148 gl::TextureCubeMap *textureCube = context->getTextureCubeMap();
5149 textureCube->storage(levels, internalformat, width);
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00005150 }
5151 break;
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00005152
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00005153 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005154 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00005155 }
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005156 }
5157 }
5158 catch(std::bad_alloc&)
5159 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005160 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005161 }
5162}
5163
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00005164void __stdcall glTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height,
5165 GLenum format, GLenum type, const GLvoid* pixels)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005166{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005167 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00005168 "GLsizei width = %d, GLsizei height = %d, GLenum format = 0x%X, GLenum type = 0x%X, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00005169 "const GLvoid* pixels = 0x%0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005170 target, level, xoffset, yoffset, width, height, format, type, pixels);
5171
5172 try
5173 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005174 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005175
5176 if (context)
5177 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005178 if (context->getClientVersion() < 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -04005179 !ValidateES2TexImageParameters(context, target, level, GL_NONE, false, true,
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005180 0, 0, width, height, 0, format, type, pixels))
daniel@transgaming.com1d2d3c42012-05-31 01:14:15 +00005181 {
5182 return;
5183 }
5184
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005185 if (context->getClientVersion() >= 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -04005186 !ValidateES3TexImageParameters(context, target, level, GL_NONE, false, true,
Jamie Madillefb2a6f2013-09-24 10:22:42 -04005187 0, 0, 0, width, height, 1, 0, format, type, pixels))
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005188 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005189 return;
5190 }
5191
5192 switch (target)
5193 {
5194 case GL_TEXTURE_2D:
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005195 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005196 gl::Texture2D *texture = context->getTexture2D();
Jamie Madill88f18f42013-09-18 14:36:19 -04005197 texture->subImage(level, xoffset, yoffset, width, height, format, type, context->getUnpackState(), pixels);
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005198 }
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005199 break;
5200
5201 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
5202 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
5203 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
5204 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
5205 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
5206 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005207 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005208 gl::TextureCubeMap *texture = context->getTextureCubeMap();
Jamie Madill88f18f42013-09-18 14:36:19 -04005209 texture->subImage(target, level, xoffset, yoffset, width, height, format, type, context->getUnpackState(), pixels);
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005210 }
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005211 break;
5212
5213 default:
Geoff Lang01c21d22013-09-24 11:52:16 -04005214 UNREACHABLE();
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005215 }
5216 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005217 }
5218 catch(std::bad_alloc&)
5219 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005220 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005221 }
5222}
5223
5224void __stdcall glUniform1f(GLint location, GLfloat x)
5225{
5226 glUniform1fv(location, 1, &x);
5227}
5228
5229void __stdcall glUniform1fv(GLint location, GLsizei count, const GLfloat* v)
5230{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005231 EVENT("(GLint location = %d, GLsizei count = %d, const GLfloat* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005232
5233 try
5234 {
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005235 if (count < 0)
5236 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005237 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005238 }
5239
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005240 if (location == -1)
5241 {
5242 return;
5243 }
5244
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005245 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005246
5247 if (context)
5248 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00005249 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005250 if (!programBinary)
5251 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005252 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005253 }
5254
5255 if (!programBinary->setUniform1fv(location, count, v))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005256 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005257 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005258 }
5259 }
5260 }
5261 catch(std::bad_alloc&)
5262 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005263 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005264 }
5265}
5266
5267void __stdcall glUniform1i(GLint location, GLint x)
5268{
5269 glUniform1iv(location, 1, &x);
5270}
5271
5272void __stdcall glUniform1iv(GLint location, GLsizei count, const GLint* v)
5273{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005274 EVENT("(GLint location = %d, GLsizei count = %d, const GLint* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005275
5276 try
5277 {
5278 if (count < 0)
5279 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005280 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005281 }
5282
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005283 if (location == -1)
5284 {
5285 return;
5286 }
5287
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005288 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005289
5290 if (context)
5291 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00005292 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005293 if (!programBinary)
5294 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005295 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005296 }
5297
5298 if (!programBinary->setUniform1iv(location, count, v))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005299 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005300 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005301 }
5302 }
5303 }
5304 catch(std::bad_alloc&)
5305 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005306 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005307 }
5308}
5309
5310void __stdcall glUniform2f(GLint location, GLfloat x, GLfloat y)
5311{
5312 GLfloat xy[2] = {x, y};
5313
5314 glUniform2fv(location, 1, (GLfloat*)&xy);
5315}
5316
5317void __stdcall glUniform2fv(GLint location, GLsizei count, const GLfloat* v)
5318{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005319 EVENT("(GLint location = %d, GLsizei count = %d, const GLfloat* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005320
5321 try
5322 {
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005323 if (count < 0)
5324 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005325 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005326 }
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005327
5328 if (location == -1)
5329 {
5330 return;
5331 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005332
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005333 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005334
5335 if (context)
5336 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00005337 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005338 if (!programBinary)
5339 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005340 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005341 }
5342
5343 if (!programBinary->setUniform2fv(location, count, v))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005344 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005345 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005346 }
5347 }
5348 }
5349 catch(std::bad_alloc&)
5350 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005351 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005352 }
5353}
5354
5355void __stdcall glUniform2i(GLint location, GLint x, GLint y)
5356{
5357 GLint xy[4] = {x, y};
5358
5359 glUniform2iv(location, 1, (GLint*)&xy);
5360}
5361
5362void __stdcall glUniform2iv(GLint location, GLsizei count, const GLint* v)
5363{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005364 EVENT("(GLint location = %d, GLsizei count = %d, const GLint* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005365
5366 try
5367 {
5368 if (count < 0)
5369 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005370 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005371 }
5372
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005373 if (location == -1)
5374 {
5375 return;
5376 }
5377
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005378 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005379
5380 if (context)
5381 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00005382 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005383 if (!programBinary)
5384 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005385 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005386 }
5387
5388 if (!programBinary->setUniform2iv(location, count, v))
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005389 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005390 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005391 }
5392 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005393 }
5394 catch(std::bad_alloc&)
5395 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005396 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005397 }
5398}
5399
5400void __stdcall glUniform3f(GLint location, GLfloat x, GLfloat y, GLfloat z)
5401{
5402 GLfloat xyz[3] = {x, y, z};
5403
5404 glUniform3fv(location, 1, (GLfloat*)&xyz);
5405}
5406
5407void __stdcall glUniform3fv(GLint location, GLsizei count, const GLfloat* v)
5408{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005409 EVENT("(GLint location = %d, GLsizei count = %d, const GLfloat* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005410
5411 try
5412 {
5413 if (count < 0)
5414 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005415 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005416 }
5417
5418 if (location == -1)
5419 {
5420 return;
5421 }
5422
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005423 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005424
5425 if (context)
5426 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00005427 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005428 if (!programBinary)
5429 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005430 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005431 }
5432
5433 if (!programBinary->setUniform3fv(location, count, v))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005434 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005435 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005436 }
5437 }
5438 }
5439 catch(std::bad_alloc&)
5440 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005441 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005442 }
5443}
5444
5445void __stdcall glUniform3i(GLint location, GLint x, GLint y, GLint z)
5446{
5447 GLint xyz[3] = {x, y, z};
5448
5449 glUniform3iv(location, 1, (GLint*)&xyz);
5450}
5451
5452void __stdcall glUniform3iv(GLint location, GLsizei count, const GLint* v)
5453{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005454 EVENT("(GLint location = %d, GLsizei count = %d, const GLint* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005455
5456 try
5457 {
5458 if (count < 0)
5459 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005460 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005461 }
5462
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005463 if (location == -1)
5464 {
5465 return;
5466 }
5467
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005468 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005469
5470 if (context)
5471 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00005472 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005473 if (!programBinary)
5474 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005475 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005476 }
5477
5478 if (!programBinary->setUniform3iv(location, count, v))
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005479 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005480 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005481 }
5482 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005483 }
5484 catch(std::bad_alloc&)
5485 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005486 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005487 }
5488}
5489
5490void __stdcall glUniform4f(GLint location, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
5491{
5492 GLfloat xyzw[4] = {x, y, z, w};
5493
5494 glUniform4fv(location, 1, (GLfloat*)&xyzw);
5495}
5496
5497void __stdcall glUniform4fv(GLint location, GLsizei count, const GLfloat* v)
5498{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005499 EVENT("(GLint location = %d, GLsizei count = %d, const GLfloat* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005500
5501 try
5502 {
5503 if (count < 0)
5504 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005505 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005506 }
5507
5508 if (location == -1)
5509 {
5510 return;
5511 }
5512
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005513 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005514
5515 if (context)
5516 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00005517 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005518 if (!programBinary)
5519 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005520 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005521 }
5522
5523 if (!programBinary->setUniform4fv(location, count, v))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005524 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005525 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005526 }
5527 }
5528 }
5529 catch(std::bad_alloc&)
5530 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005531 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005532 }
5533}
5534
5535void __stdcall glUniform4i(GLint location, GLint x, GLint y, GLint z, GLint w)
5536{
5537 GLint xyzw[4] = {x, y, z, w};
5538
5539 glUniform4iv(location, 1, (GLint*)&xyzw);
5540}
5541
5542void __stdcall glUniform4iv(GLint location, GLsizei count, const GLint* v)
5543{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005544 EVENT("(GLint location = %d, GLsizei count = %d, const GLint* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005545
5546 try
5547 {
5548 if (count < 0)
5549 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005550 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005551 }
5552
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005553 if (location == -1)
5554 {
5555 return;
5556 }
5557
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005558 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005559
5560 if (context)
5561 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00005562 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005563 if (!programBinary)
5564 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005565 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005566 }
5567
5568 if (!programBinary->setUniform4iv(location, count, v))
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005569 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005570 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005571 }
5572 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005573 }
5574 catch(std::bad_alloc&)
5575 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005576 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005577 }
5578}
5579
5580void __stdcall glUniformMatrix2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
5581{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005582 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00005583 location, count, transpose, value);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005584
5585 try
5586 {
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00005587 if (count < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005588 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005589 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005590 }
5591
5592 if (location == -1)
5593 {
5594 return;
5595 }
5596
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005597 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005598
5599 if (context)
5600 {
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00005601 if (transpose != GL_FALSE && context->getClientVersion() < 3)
5602 {
5603 return gl::error(GL_INVALID_VALUE);
5604 }
5605
daniel@transgaming.com62a28462012-07-24 18:33:59 +00005606 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005607 if (!programBinary)
5608 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005609 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005610 }
5611
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00005612 if (!programBinary->setUniformMatrix2fv(location, count, transpose, value))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005613 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005614 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005615 }
5616 }
5617 }
5618 catch(std::bad_alloc&)
5619 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005620 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005621 }
5622}
5623
5624void __stdcall glUniformMatrix3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
5625{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005626 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00005627 location, count, transpose, value);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005628
5629 try
5630 {
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00005631 if (count < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005632 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005633 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005634 }
5635
5636 if (location == -1)
5637 {
5638 return;
5639 }
5640
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005641 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005642
5643 if (context)
5644 {
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00005645 if (transpose != GL_FALSE && context->getClientVersion() < 3)
5646 {
5647 return gl::error(GL_INVALID_VALUE);
5648 }
5649
daniel@transgaming.com62a28462012-07-24 18:33:59 +00005650 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005651 if (!programBinary)
5652 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005653 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005654 }
5655
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00005656 if (!programBinary->setUniformMatrix3fv(location, count, transpose, value))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005657 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005658 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005659 }
5660 }
5661 }
5662 catch(std::bad_alloc&)
5663 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005664 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005665 }
5666}
5667
5668void __stdcall glUniformMatrix4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
5669{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005670 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00005671 location, count, transpose, value);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005672
5673 try
5674 {
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00005675 if (count < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005676 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005677 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005678 }
5679
5680 if (location == -1)
5681 {
5682 return;
5683 }
5684
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005685 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005686
5687 if (context)
5688 {
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00005689 if (transpose != GL_FALSE && context->getClientVersion() < 3)
5690 {
5691 return gl::error(GL_INVALID_VALUE);
5692 }
5693
daniel@transgaming.com62a28462012-07-24 18:33:59 +00005694 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005695 if (!programBinary)
5696 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005697 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005698 }
5699
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00005700 if (!programBinary->setUniformMatrix4fv(location, count, transpose, value))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005701 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005702 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005703 }
5704 }
5705 }
5706 catch(std::bad_alloc&)
5707 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005708 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005709 }
5710}
5711
5712void __stdcall glUseProgram(GLuint program)
5713{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005714 EVENT("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005715
5716 try
5717 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005718 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005719
5720 if (context)
5721 {
5722 gl::Program *programObject = context->getProgram(program);
5723
daniel@transgaming.comc8478202010-04-13 19:53:35 +00005724 if (!programObject && program != 0)
5725 {
5726 if (context->getShader(program))
5727 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005728 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comc8478202010-04-13 19:53:35 +00005729 }
5730 else
5731 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005732 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comc8478202010-04-13 19:53:35 +00005733 }
5734 }
5735
daniel@transgaming.com716056c2012-07-24 18:38:59 +00005736 if (program != 0 && !programObject->isLinked())
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005737 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005738 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005739 }
5740
5741 context->useProgram(program);
5742 }
5743 }
5744 catch(std::bad_alloc&)
5745 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005746 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005747 }
5748}
5749
5750void __stdcall glValidateProgram(GLuint program)
5751{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005752 EVENT("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005753
5754 try
5755 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005756 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00005757
5758 if (context)
5759 {
5760 gl::Program *programObject = context->getProgram(program);
5761
5762 if (!programObject)
5763 {
5764 if (context->getShader(program))
5765 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005766 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00005767 }
5768 else
5769 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005770 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00005771 }
5772 }
5773
apatrick@chromium.org253b8d22012-06-22 19:27:21 +00005774 programObject->validate();
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00005775 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005776 }
5777 catch(std::bad_alloc&)
5778 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005779 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005780 }
5781}
5782
5783void __stdcall glVertexAttrib1f(GLuint index, GLfloat x)
5784{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005785 EVENT("(GLuint index = %d, GLfloat x = %f)", index, x);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005786
5787 try
5788 {
5789 if (index >= gl::MAX_VERTEX_ATTRIBS)
5790 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005791 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005792 }
5793
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005794 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005795
5796 if (context)
5797 {
5798 GLfloat vals[4] = { x, 0, 0, 1 };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00005799 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005800 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005801 }
5802 catch(std::bad_alloc&)
5803 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005804 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005805 }
5806}
5807
5808void __stdcall glVertexAttrib1fv(GLuint index, const GLfloat* values)
5809{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005810 EVENT("(GLuint index = %d, const GLfloat* values = 0x%0.8p)", index, values);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005811
5812 try
5813 {
5814 if (index >= gl::MAX_VERTEX_ATTRIBS)
5815 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005816 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005817 }
5818
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005819 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005820
5821 if (context)
5822 {
5823 GLfloat vals[4] = { values[0], 0, 0, 1 };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00005824 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005825 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005826 }
5827 catch(std::bad_alloc&)
5828 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005829 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005830 }
5831}
5832
5833void __stdcall glVertexAttrib2f(GLuint index, GLfloat x, GLfloat y)
5834{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005835 EVENT("(GLuint index = %d, GLfloat x = %f, GLfloat y = %f)", index, x, y);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005836
5837 try
5838 {
5839 if (index >= gl::MAX_VERTEX_ATTRIBS)
5840 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005841 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005842 }
5843
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005844 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005845
5846 if (context)
5847 {
5848 GLfloat vals[4] = { x, y, 0, 1 };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00005849 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005850 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005851 }
5852 catch(std::bad_alloc&)
5853 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005854 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005855 }
5856}
5857
5858void __stdcall glVertexAttrib2fv(GLuint index, const GLfloat* values)
5859{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005860 EVENT("(GLuint index = %d, const GLfloat* values = 0x%0.8p)", index, values);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005861
5862 try
5863 {
5864 if (index >= gl::MAX_VERTEX_ATTRIBS)
5865 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005866 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005867 }
5868
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005869 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005870
5871 if (context)
5872 {
5873 GLfloat vals[4] = { values[0], values[1], 0, 1 };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00005874 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005875 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005876 }
5877 catch(std::bad_alloc&)
5878 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005879 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005880 }
5881}
5882
5883void __stdcall glVertexAttrib3f(GLuint index, GLfloat x, GLfloat y, GLfloat z)
5884{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005885 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 +00005886
5887 try
5888 {
5889 if (index >= gl::MAX_VERTEX_ATTRIBS)
5890 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005891 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005892 }
5893
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005894 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005895
5896 if (context)
5897 {
5898 GLfloat vals[4] = { x, y, z, 1 };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00005899 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005900 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005901 }
5902 catch(std::bad_alloc&)
5903 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005904 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005905 }
5906}
5907
5908void __stdcall glVertexAttrib3fv(GLuint index, const GLfloat* values)
5909{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005910 EVENT("(GLuint index = %d, const GLfloat* values = 0x%0.8p)", index, values);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005911
5912 try
5913 {
5914 if (index >= gl::MAX_VERTEX_ATTRIBS)
5915 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005916 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005917 }
5918
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005919 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005920
5921 if (context)
5922 {
5923 GLfloat vals[4] = { values[0], values[1], values[2], 1 };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00005924 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005925 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005926 }
5927 catch(std::bad_alloc&)
5928 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005929 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005930 }
5931}
5932
5933void __stdcall glVertexAttrib4f(GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
5934{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005935 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 +00005936
5937 try
5938 {
5939 if (index >= gl::MAX_VERTEX_ATTRIBS)
5940 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005941 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005942 }
5943
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005944 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005945
5946 if (context)
5947 {
5948 GLfloat vals[4] = { x, y, z, w };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00005949 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005950 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005951 }
5952 catch(std::bad_alloc&)
5953 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005954 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005955 }
5956}
5957
5958void __stdcall glVertexAttrib4fv(GLuint index, const GLfloat* values)
5959{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005960 EVENT("(GLuint index = %d, const GLfloat* values = 0x%0.8p)", index, values);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005961
5962 try
5963 {
5964 if (index >= gl::MAX_VERTEX_ATTRIBS)
5965 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005966 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005967 }
5968
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005969 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005970
5971 if (context)
5972 {
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00005973 context->setVertexAttribf(index, values);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005974 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005975 }
5976 catch(std::bad_alloc&)
5977 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005978 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005979 }
5980}
5981
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00005982void __stdcall glVertexAttribDivisorANGLE(GLuint index, GLuint divisor)
5983{
5984 EVENT("(GLuint index = %d, GLuint divisor = %d)", index, divisor);
5985
5986 try
5987 {
5988 if (index >= gl::MAX_VERTEX_ATTRIBS)
5989 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005990 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00005991 }
5992
5993 gl::Context *context = gl::getNonLostContext();
5994
5995 if (context)
5996 {
5997 context->setVertexAttribDivisor(index, divisor);
5998 }
5999 }
6000 catch(std::bad_alloc&)
6001 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006002 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00006003 }
6004}
6005
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00006006void __stdcall glVertexAttribPointer(GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid* ptr)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006007{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006008 EVENT("(GLuint index = %d, GLint size = %d, GLenum type = 0x%X, "
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006009 "GLboolean normalized = %u, GLsizei stride = %d, const GLvoid* ptr = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00006010 index, size, type, normalized, stride, ptr);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006011
6012 try
6013 {
6014 if (index >= gl::MAX_VERTEX_ATTRIBS)
6015 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006016 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006017 }
6018
6019 if (size < 1 || size > 4)
6020 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006021 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006022 }
6023
shannon.woods%transgaming.com@gtempaccount.com1a4e09a2013-04-13 03:33:30 +00006024 gl::Context *context = gl::getNonLostContext();
6025
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006026 switch (type)
6027 {
6028 case GL_BYTE:
6029 case GL_UNSIGNED_BYTE:
6030 case GL_SHORT:
6031 case GL_UNSIGNED_SHORT:
6032 case GL_FIXED:
6033 case GL_FLOAT:
6034 break;
shannon.woods%transgaming.com@gtempaccount.com1a4e09a2013-04-13 03:33:30 +00006035 case GL_HALF_FLOAT:
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00006036 case GL_INT:
6037 case GL_UNSIGNED_INT:
shannon.woods%transgaming.com@gtempaccount.com1ab57be2013-04-13 03:38:39 +00006038 case GL_INT_2_10_10_10_REV:
6039 case GL_UNSIGNED_INT_2_10_10_10_REV:
shannon.woods%transgaming.com@gtempaccount.com1a4e09a2013-04-13 03:33:30 +00006040 if (context && context->getClientVersion() < 3)
6041 {
6042 return gl::error(GL_INVALID_ENUM);
6043 }
6044 else
6045 {
6046 break;
6047 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006048 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006049 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006050 }
6051
6052 if (stride < 0)
6053 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006054 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006055 }
6056
shannon.woods%transgaming.com@gtempaccount.com1ab57be2013-04-13 03:38:39 +00006057 if ((type == GL_INT_2_10_10_10_REV || type == GL_UNSIGNED_INT_2_10_10_10_REV) && size != 4)
6058 {
6059 return gl::error(GL_INVALID_OPERATION);
6060 }
6061
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006062 if (context)
6063 {
Jamie Madilld8db8662013-07-02 11:57:04 -04006064 // [OpenGL ES 3.0.2] Section 2.8 page 24:
6065 // An INVALID_OPERATION error is generated when a non-zero vertex array object
6066 // is bound, zero is bound to the ARRAY_BUFFER buffer object binding point,
6067 // and the pointer argument is not NULL.
6068 if (context->getVertexArrayHandle() != 0 && context->getArrayBufferHandle() == 0 && ptr != NULL)
6069 {
6070 return gl::error(GL_INVALID_OPERATION);
6071 }
6072
shannon.woods%transgaming.com@gtempaccount.com8de4e6a2013-04-13 03:37:44 +00006073 context->setVertexAttribState(index, context->getArrayBuffer(), size, type,
6074 normalized == GL_TRUE, false, stride, ptr);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006075 }
6076 }
6077 catch(std::bad_alloc&)
6078 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006079 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006080 }
6081}
6082
6083void __stdcall glViewport(GLint x, GLint y, GLsizei width, GLsizei height)
6084{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006085 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 +00006086
6087 try
6088 {
6089 if (width < 0 || height < 0)
6090 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006091 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006092 }
6093
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006094 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006095
6096 if (context)
6097 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00006098 context->setViewportParams(x, y, width, height);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006099 }
6100 }
6101 catch(std::bad_alloc&)
6102 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006103 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006104 }
6105}
6106
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006107// OpenGL ES 3.0 functions
6108
6109void __stdcall glReadBuffer(GLenum mode)
6110{
6111 EVENT("(GLenum mode = 0x%X)", mode);
6112
6113 try
6114 {
6115 gl::Context *context = gl::getNonLostContext();
6116
6117 if (context)
6118 {
6119 if (context->getClientVersion() < 3)
6120 {
6121 return gl::error(GL_INVALID_OPERATION);
6122 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006123
Jamie Madill54133512013-06-21 09:33:07 -04006124 // glReadBuffer
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006125 UNIMPLEMENTED();
6126 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006127 }
6128 catch(std::bad_alloc&)
6129 {
6130 return gl::error(GL_OUT_OF_MEMORY);
6131 }
6132}
6133
6134void __stdcall glDrawRangeElements(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid* indices)
6135{
6136 EVENT("(GLenum mode = 0x%X, GLuint start = %u, GLuint end = %u, GLsizei count = %d, GLenum type = 0x%X, "
6137 "const GLvoid* indices = 0x%0.8p)", mode, start, end, count, type, indices);
6138
6139 try
6140 {
6141 gl::Context *context = gl::getNonLostContext();
6142
6143 if (context)
6144 {
6145 if (context->getClientVersion() < 3)
6146 {
6147 return gl::error(GL_INVALID_OPERATION);
6148 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006149
Jamie Madill54133512013-06-21 09:33:07 -04006150 // glDrawRangeElements
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006151 UNIMPLEMENTED();
6152 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006153 }
6154 catch(std::bad_alloc&)
6155 {
6156 return gl::error(GL_OUT_OF_MEMORY);
6157 }
6158}
6159
6160void __stdcall glTexImage3D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid* pixels)
6161{
6162 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint internalformat = %d, GLsizei width = %d, "
6163 "GLsizei height = %d, GLsizei depth = %d, GLint border = %d, GLenum format = 0x%X, "
6164 "GLenum type = 0x%X, const GLvoid* pixels = 0x%0.8p)",
6165 target, level, internalformat, width, height, depth, border, format, type, pixels);
6166
6167 try
6168 {
6169 gl::Context *context = gl::getNonLostContext();
6170
6171 if (context)
6172 {
6173 if (context->getClientVersion() < 3)
6174 {
6175 return gl::error(GL_INVALID_OPERATION);
6176 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006177
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006178 // validateES3TexImageFormat sets the error code if there is an error
Geoff Lang34dbb6f2013-08-05 15:05:47 -04006179 if (!ValidateES3TexImageParameters(context, target, level, internalformat, false, false,
Jamie Madillefb2a6f2013-09-24 10:22:42 -04006180 0, 0, 0, width, height, depth, border, format, type, pixels))
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006181 {
6182 return;
6183 }
6184
6185 switch(target)
6186 {
6187 case GL_TEXTURE_3D:
6188 {
6189 gl::Texture3D *texture = context->getTexture3D();
Jamie Madill88f18f42013-09-18 14:36:19 -04006190 texture->setImage(level, width, height, depth, internalformat, format, type, context->getUnpackState(), pixels);
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006191 }
6192 break;
6193
6194 case GL_TEXTURE_2D_ARRAY:
shannon.woods%transgaming.com@gtempaccount.com14e8f592013-04-13 03:46:21 +00006195 {
6196 gl::Texture2DArray *texture = context->getTexture2DArray();
Jamie Madill88f18f42013-09-18 14:36:19 -04006197 texture->setImage(level, width, height, depth, internalformat, format, type, context->getUnpackState(), pixels);
shannon.woods%transgaming.com@gtempaccount.com14e8f592013-04-13 03:46:21 +00006198 }
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006199 break;
6200
6201 default:
6202 return gl::error(GL_INVALID_ENUM);
6203 }
6204 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006205 }
6206 catch(std::bad_alloc&)
6207 {
6208 return gl::error(GL_OUT_OF_MEMORY);
6209 }
6210}
6211
6212void __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)
6213{
6214 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
6215 "GLint zoffset = %d, GLsizei width = %d, GLsizei height = %d, GLsizei depth = %d, "
6216 "GLenum format = 0x%X, GLenum type = 0x%X, const GLvoid* pixels = 0x%0.8p)",
6217 target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels);
6218
6219 try
6220 {
6221 gl::Context *context = gl::getNonLostContext();
6222
6223 if (context)
6224 {
6225 if (context->getClientVersion() < 3)
6226 {
6227 return gl::error(GL_INVALID_OPERATION);
6228 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006229
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006230 // validateES3TexImageFormat sets the error code if there is an error
Geoff Lang34dbb6f2013-08-05 15:05:47 -04006231 if (!ValidateES3TexImageParameters(context, target, level, GL_NONE, false, true,
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006232 xoffset, yoffset, zoffset, width, height, depth, 0,
Jamie Madillefb2a6f2013-09-24 10:22:42 -04006233 format, type, pixels))
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006234 {
6235 return;
6236 }
6237
6238 switch(target)
6239 {
6240 case GL_TEXTURE_3D:
6241 {
6242 gl::Texture3D *texture = context->getTexture3D();
Jamie Madill88f18f42013-09-18 14:36:19 -04006243 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 +00006244 }
6245 break;
6246
6247 case GL_TEXTURE_2D_ARRAY:
shannon.woods%transgaming.com@gtempaccount.com14e8f592013-04-13 03:46:21 +00006248 {
6249 gl::Texture2DArray *texture = context->getTexture2DArray();
Jamie Madill88f18f42013-09-18 14:36:19 -04006250 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 +00006251 }
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006252 break;
6253
6254 default:
6255 return gl::error(GL_INVALID_ENUM);
6256 }
6257 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006258 }
6259 catch(std::bad_alloc&)
6260 {
6261 return gl::error(GL_OUT_OF_MEMORY);
6262 }
6263}
6264
6265void __stdcall glCopyTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height)
6266{
6267 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
6268 "GLint zoffset = %d, GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d)",
6269 target, level, xoffset, yoffset, zoffset, x, y, width, height);
6270
6271 try
6272 {
6273 gl::Context *context = gl::getNonLostContext();
6274
6275 if (context)
6276 {
6277 if (context->getClientVersion() < 3)
6278 {
6279 return gl::error(GL_INVALID_OPERATION);
6280 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006281
Geoff Lang34dbb6f2013-08-05 15:05:47 -04006282 if (!ValidateES3CopyTexImageParameters(context, target, level, GL_NONE, false, xoffset, yoffset, zoffset,
shannonwoods@chromium.org6cf2b0e2013-05-30 00:13:36 +00006283 x, y, width, height, 0))
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006284 {
6285 return;
6286 }
6287
6288 gl::Framebuffer *framebuffer = context->getReadFramebuffer();
6289 gl::Texture *texture = NULL;
6290 switch (target)
6291 {
6292 case GL_TEXTURE_3D:
6293 texture = context->getTexture3D();
6294 break;
6295
6296 case GL_TEXTURE_2D_ARRAY:
shannon.woods%transgaming.com@gtempaccount.com14e8f592013-04-13 03:46:21 +00006297 texture = context->getTexture2DArray();
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006298 break;
6299
6300 default:
6301 return gl::error(GL_INVALID_ENUM);
6302 }
6303
6304 texture->copySubImage(target, level, xoffset, yoffset, zoffset, x, y, width, height, framebuffer);
6305 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006306 }
6307 catch(std::bad_alloc&)
6308 {
6309 return gl::error(GL_OUT_OF_MEMORY);
6310 }
6311}
6312
6313void __stdcall glCompressedTexImage3D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid* data)
6314{
Geoff Langeef52cc2013-10-16 15:07:39 -04006315 EVENT("(GLenum target = 0x%X, GLint level = %d, GLenum internalformat = 0x%X, GLsizei width = %d, "
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006316 "GLsizei height = %d, GLsizei depth = %d, GLint border = %d, GLsizei imageSize = %d, "
6317 "const GLvoid* data = 0x%0.8p)",
6318 target, level, internalformat, width, height, depth, border, imageSize, data);
6319
6320 try
6321 {
6322 gl::Context *context = gl::getNonLostContext();
6323
6324 if (context)
6325 {
6326 if (context->getClientVersion() < 3)
6327 {
6328 return gl::error(GL_INVALID_OPERATION);
6329 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006330
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +00006331 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 +00006332 {
6333 return gl::error(GL_INVALID_VALUE);
6334 }
6335
6336 // validateES3TexImageFormat sets the error code if there is an error
Geoff Lang34dbb6f2013-08-05 15:05:47 -04006337 if (!ValidateES3TexImageParameters(context, target, level, internalformat, true, false,
Jamie Madillefb2a6f2013-09-24 10:22:42 -04006338 0, 0, 0, width, height, depth, border, GL_NONE, GL_NONE, data))
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006339 {
6340 return;
6341 }
6342
6343 switch(target)
6344 {
6345 case GL_TEXTURE_3D:
6346 {
6347 gl::Texture3D *texture = context->getTexture3D();
6348 texture->setCompressedImage(level, internalformat, width, height, depth, imageSize, data);
6349 }
6350 break;
6351
6352 case GL_TEXTURE_2D_ARRAY:
shannon.woods%transgaming.com@gtempaccount.com14e8f592013-04-13 03:46:21 +00006353 {
6354 gl::Texture2DArray *texture = context->getTexture2DArray();
6355 texture->setCompressedImage(level, internalformat, width, height, depth, imageSize, data);
6356 }
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006357 break;
6358
6359 default:
6360 return gl::error(GL_INVALID_ENUM);
6361 }
6362 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006363 }
6364 catch(std::bad_alloc&)
6365 {
6366 return gl::error(GL_OUT_OF_MEMORY);
6367 }
6368}
6369
6370void __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)
6371{
6372 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
6373 "GLint zoffset = %d, GLsizei width = %d, GLsizei height = %d, GLsizei depth = %d, "
6374 "GLenum format = 0x%X, GLsizei imageSize = %d, const GLvoid* data = 0x%0.8p)",
6375 target, level, xoffset, yoffset, zoffset, width, height, depth, format, imageSize, data);
6376
6377 try
6378 {
6379 gl::Context *context = gl::getNonLostContext();
6380
6381 if (context)
6382 {
6383 if (context->getClientVersion() < 3)
6384 {
6385 return gl::error(GL_INVALID_OPERATION);
6386 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006387
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +00006388 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 +00006389 {
6390 return gl::error(GL_INVALID_VALUE);
6391 }
6392
6393 if (!data)
6394 {
6395 return gl::error(GL_INVALID_VALUE);
6396 }
6397
6398 // validateES3TexImageFormat sets the error code if there is an error
Geoff Lang34dbb6f2013-08-05 15:05:47 -04006399 if (!ValidateES3TexImageParameters(context, target, level, GL_NONE, true, true,
Jamie Madillefb2a6f2013-09-24 10:22:42 -04006400 0, 0, 0, width, height, depth, 0, GL_NONE, GL_NONE, data))
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006401 {
6402 return;
6403 }
6404
6405 switch(target)
6406 {
6407 case GL_TEXTURE_3D:
6408 {
6409 gl::Texture3D *texture = context->getTexture3D();
6410 texture->subImageCompressed(level, xoffset, yoffset, zoffset, width, height, depth,
6411 format, imageSize, data);
6412 }
6413 break;
6414
6415 case GL_TEXTURE_2D_ARRAY:
shannon.woods%transgaming.com@gtempaccount.com14e8f592013-04-13 03:46:21 +00006416 {
6417 gl::Texture2DArray *texture = context->getTexture2DArray();
6418 texture->subImageCompressed(level, xoffset, yoffset, zoffset, width, height, depth,
6419 format, imageSize, data);
6420 }
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006421 break;
6422
6423 default:
6424 return gl::error(GL_INVALID_ENUM);
6425 }
6426 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006427 }
6428 catch(std::bad_alloc&)
6429 {
6430 return gl::error(GL_OUT_OF_MEMORY);
6431 }
6432}
6433
6434void __stdcall glGenQueries(GLsizei n, GLuint* ids)
6435{
6436 EVENT("(GLsizei n = %d, GLuint* ids = 0x%0.8p)", n, ids);
6437
6438 try
6439 {
6440 gl::Context *context = gl::getNonLostContext();
6441
6442 if (context)
6443 {
6444 if (context->getClientVersion() < 3)
6445 {
6446 return gl::error(GL_INVALID_OPERATION);
6447 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006448
Geoff Lang37dde692014-01-31 16:34:54 -05006449 if (n < 0)
6450 {
6451 return gl::error(GL_INVALID_VALUE);
6452 }
6453
6454 for (GLsizei i = 0; i < n; i++)
6455 {
6456 ids[i] = context->createQuery();
6457 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006458 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006459 }
6460 catch(std::bad_alloc&)
6461 {
6462 return gl::error(GL_OUT_OF_MEMORY);
6463 }
6464}
6465
6466void __stdcall glDeleteQueries(GLsizei n, const GLuint* ids)
6467{
6468 EVENT("(GLsizei n = %d, GLuint* ids = 0x%0.8p)", n, ids);
6469
6470 try
6471 {
6472 gl::Context *context = gl::getNonLostContext();
6473
6474 if (context)
6475 {
6476 if (context->getClientVersion() < 3)
6477 {
6478 return gl::error(GL_INVALID_OPERATION);
6479 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006480
Geoff Lang37dde692014-01-31 16:34:54 -05006481 if (n < 0)
6482 {
6483 return gl::error(GL_INVALID_VALUE);
6484 }
6485
6486 for (GLsizei i = 0; i < n; i++)
6487 {
6488 context->deleteQuery(ids[i]);
6489 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006490 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006491 }
6492 catch(std::bad_alloc&)
6493 {
6494 return gl::error(GL_OUT_OF_MEMORY);
6495 }
6496}
6497
6498GLboolean __stdcall glIsQuery(GLuint id)
6499{
6500 EVENT("(GLuint id = %u)", id);
6501
6502 try
6503 {
6504 gl::Context *context = gl::getNonLostContext();
6505
6506 if (context)
6507 {
6508 if (context->getClientVersion() < 3)
6509 {
6510 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
6511 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006512
Geoff Lang37dde692014-01-31 16:34:54 -05006513 return (context->getQuery(id, false, GL_NONE) != NULL) ? GL_TRUE : GL_FALSE;
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006514 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006515 }
6516 catch(std::bad_alloc&)
6517 {
6518 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
6519 }
6520
6521 return GL_FALSE;
6522}
6523
6524void __stdcall glBeginQuery(GLenum target, GLuint id)
6525{
6526 EVENT("(GLenum target = 0x%X, GLuint id = %u)", target, id);
6527
6528 try
6529 {
6530 gl::Context *context = gl::getNonLostContext();
6531
6532 if (context)
6533 {
6534 if (context->getClientVersion() < 3)
6535 {
6536 return gl::error(GL_INVALID_OPERATION);
6537 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006538
Geoff Lang37dde692014-01-31 16:34:54 -05006539 if (!ValidQueryType(context, target))
Jamie Madill3641b4b2013-07-26 12:54:59 -04006540 {
Geoff Lang37dde692014-01-31 16:34:54 -05006541 return gl::error(GL_INVALID_ENUM);
Jamie Madill3641b4b2013-07-26 12:54:59 -04006542 }
6543
6544 if (id == 0)
6545 {
6546 return gl::error(GL_INVALID_OPERATION);
6547 }
6548
Geoff Lang37dde692014-01-31 16:34:54 -05006549 context->beginQuery(target, id);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006550 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006551 }
6552 catch(std::bad_alloc&)
6553 {
6554 return gl::error(GL_OUT_OF_MEMORY);
6555 }
6556}
6557
6558void __stdcall glEndQuery(GLenum target)
6559{
6560 EVENT("(GLenum target = 0x%X)", target);
6561
6562 try
6563 {
6564 gl::Context *context = gl::getNonLostContext();
6565
6566 if (context)
6567 {
6568 if (context->getClientVersion() < 3)
6569 {
6570 return gl::error(GL_INVALID_OPERATION);
6571 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006572
Geoff Lang37dde692014-01-31 16:34:54 -05006573 if (!ValidQueryType(context, target))
Jamie Madill3641b4b2013-07-26 12:54:59 -04006574 {
Geoff Lang37dde692014-01-31 16:34:54 -05006575 return gl::error(GL_INVALID_ENUM);
Jamie Madill3641b4b2013-07-26 12:54:59 -04006576 }
Geoff Lang37dde692014-01-31 16:34:54 -05006577
6578 context->endQuery(target);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006579 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006580 }
6581 catch(std::bad_alloc&)
6582 {
6583 return gl::error(GL_OUT_OF_MEMORY);
6584 }
6585}
6586
6587void __stdcall glGetQueryiv(GLenum target, GLenum pname, GLint* params)
6588{
6589 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLint* params = 0x%0.8p)", target, pname, params);
6590
6591 try
6592 {
6593 gl::Context *context = gl::getNonLostContext();
6594
6595 if (context)
6596 {
6597 if (context->getClientVersion() < 3)
6598 {
6599 return gl::error(GL_INVALID_OPERATION);
6600 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006601
Geoff Lang37dde692014-01-31 16:34:54 -05006602 if (!ValidQueryType(context, target))
Jamie Madill3641b4b2013-07-26 12:54:59 -04006603 {
Geoff Lang37dde692014-01-31 16:34:54 -05006604 return gl::error(GL_INVALID_ENUM);
Jamie Madill3641b4b2013-07-26 12:54:59 -04006605 }
Geoff Lang37dde692014-01-31 16:34:54 -05006606
6607 switch (pname)
Jamie Madill3641b4b2013-07-26 12:54:59 -04006608 {
Geoff Lang37dde692014-01-31 16:34:54 -05006609 case GL_CURRENT_QUERY:
6610 params[0] = context->getActiveQuery(target);
6611 break;
6612
6613 default:
6614 return gl::error(GL_INVALID_ENUM);
Jamie Madill3641b4b2013-07-26 12:54:59 -04006615 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006616 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006617 }
6618 catch(std::bad_alloc&)
6619 {
6620 return gl::error(GL_OUT_OF_MEMORY);
6621 }
6622}
6623
6624void __stdcall glGetQueryObjectuiv(GLuint id, GLenum pname, GLuint* params)
6625{
6626 EVENT("(GLuint id = %u, GLenum pname = 0x%X, GLint* params = 0x%0.8p)", id, pname, params);
6627
6628 try
6629 {
6630 gl::Context *context = gl::getNonLostContext();
6631
6632 if (context)
6633 {
6634 if (context->getClientVersion() < 3)
6635 {
6636 return gl::error(GL_INVALID_OPERATION);
6637 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006638
Geoff Lang37dde692014-01-31 16:34:54 -05006639 gl::Query *queryObject = context->getQuery(id, false, GL_NONE);
6640
6641 if (!queryObject)
6642 {
6643 return gl::error(GL_INVALID_OPERATION);
6644 }
6645
6646 if (context->getActiveQuery(queryObject->getType()) == id)
6647 {
6648 return gl::error(GL_INVALID_OPERATION);
6649 }
6650
6651 switch(pname)
6652 {
6653 case GL_QUERY_RESULT:
6654 params[0] = queryObject->getResult();
6655 break;
6656 case GL_QUERY_RESULT_AVAILABLE:
6657 params[0] = queryObject->isResultAvailable();
6658 break;
6659 default:
6660 return gl::error(GL_INVALID_ENUM);
6661 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006662 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006663 }
6664 catch(std::bad_alloc&)
6665 {
6666 return gl::error(GL_OUT_OF_MEMORY);
6667 }
6668}
6669
6670GLboolean __stdcall glUnmapBuffer(GLenum target)
6671{
6672 EVENT("(GLenum target = 0x%X)", target);
6673
6674 try
6675 {
6676 gl::Context *context = gl::getNonLostContext();
6677
6678 if (context)
6679 {
6680 if (context->getClientVersion() < 3)
6681 {
6682 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
6683 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006684
Jamie Madill54133512013-06-21 09:33:07 -04006685 // glUnmapBuffer
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006686 UNIMPLEMENTED();
6687 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006688 }
6689 catch(std::bad_alloc&)
6690 {
6691 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
6692 }
6693
6694 return GL_FALSE;
6695}
6696
6697void __stdcall glGetBufferPointerv(GLenum target, GLenum pname, GLvoid** params)
6698{
6699 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLvoid** params = 0x%0.8p)", target, pname, params);
6700
6701 try
6702 {
6703 gl::Context *context = gl::getNonLostContext();
6704
6705 if (context)
6706 {
6707 if (context->getClientVersion() < 3)
6708 {
6709 return gl::error(GL_INVALID_OPERATION);
6710 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006711
Jamie Madill54133512013-06-21 09:33:07 -04006712 // glGetBufferPointerv
shannonwoods@chromium.org2d2190a2013-05-30 00:17:35 +00006713 UNIMPLEMENTED();
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006714 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006715 }
6716 catch(std::bad_alloc&)
6717 {
6718 return gl::error(GL_OUT_OF_MEMORY);
6719 }
6720}
6721
6722void __stdcall glDrawBuffers(GLsizei n, const GLenum* bufs)
6723{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006724 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
shannon.woods%transgaming.com@gtempaccount.com7948c5f2013-04-13 03:38:58 +00006735 glDrawBuffersEXT(n, bufs);
6736 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006737 }
6738 catch(std::bad_alloc&)
6739 {
6740 return gl::error(GL_OUT_OF_MEMORY);
6741 }
6742}
6743
6744void __stdcall glUniformMatrix2x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
6745{
6746 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
6747 location, count, transpose, value);
6748
6749 try
6750 {
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006751 if (count < 0)
6752 {
6753 return gl::error(GL_INVALID_VALUE);
6754 }
6755
6756 if (location == -1)
6757 {
6758 return;
6759 }
6760
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006761 gl::Context *context = gl::getNonLostContext();
6762
6763 if (context)
6764 {
6765 if (context->getClientVersion() < 3)
6766 {
6767 return gl::error(GL_INVALID_OPERATION);
6768 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006769
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006770 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
6771 if (!programBinary)
6772 {
6773 return gl::error(GL_INVALID_OPERATION);
6774 }
6775
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00006776 if (!programBinary->setUniformMatrix2x3fv(location, count, transpose, value))
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006777 {
6778 return gl::error(GL_INVALID_OPERATION);
6779 }
6780 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006781 }
6782 catch(std::bad_alloc&)
6783 {
6784 return gl::error(GL_OUT_OF_MEMORY);
6785 }
6786}
6787
6788void __stdcall glUniformMatrix3x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
6789{
6790 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
6791 location, count, transpose, value);
6792
6793 try
6794 {
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006795 if (count < 0)
6796 {
6797 return gl::error(GL_INVALID_VALUE);
6798 }
6799
6800 if (location == -1)
6801 {
6802 return;
6803 }
6804
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006805 gl::Context *context = gl::getNonLostContext();
6806
6807 if (context)
6808 {
6809 if (context->getClientVersion() < 3)
6810 {
6811 return gl::error(GL_INVALID_OPERATION);
6812 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006813
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006814 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
6815 if (!programBinary)
6816 {
6817 return gl::error(GL_INVALID_OPERATION);
6818 }
6819
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00006820 if (!programBinary->setUniformMatrix3x2fv(location, count, transpose, value))
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006821 {
6822 return gl::error(GL_INVALID_OPERATION);
6823 }
6824 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006825 }
6826 catch(std::bad_alloc&)
6827 {
6828 return gl::error(GL_OUT_OF_MEMORY);
6829 }
6830}
6831
6832void __stdcall glUniformMatrix2x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
6833{
6834 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
6835 location, count, transpose, value);
6836
6837 try
6838 {
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006839 if (count < 0)
6840 {
6841 return gl::error(GL_INVALID_VALUE);
6842 }
6843
6844 if (location == -1)
6845 {
6846 return;
6847 }
6848
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006849 gl::Context *context = gl::getNonLostContext();
6850
6851 if (context)
6852 {
6853 if (context->getClientVersion() < 3)
6854 {
6855 return gl::error(GL_INVALID_OPERATION);
6856 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006857
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006858 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
6859 if (!programBinary)
6860 {
6861 return gl::error(GL_INVALID_OPERATION);
6862 }
6863
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00006864 if (!programBinary->setUniformMatrix2x4fv(location, count, transpose, value))
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006865 {
6866 return gl::error(GL_INVALID_OPERATION);
6867 }
6868 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006869 }
6870 catch(std::bad_alloc&)
6871 {
6872 return gl::error(GL_OUT_OF_MEMORY);
6873 }
6874}
6875
6876void __stdcall glUniformMatrix4x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
6877{
6878 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
6879 location, count, transpose, value);
6880
6881 try
6882 {
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006883 if (count < 0)
6884 {
6885 return gl::error(GL_INVALID_VALUE);
6886 }
6887
6888 if (location == -1)
6889 {
6890 return;
6891 }
6892
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006893 gl::Context *context = gl::getNonLostContext();
6894
6895 if (context)
6896 {
6897 if (context->getClientVersion() < 3)
6898 {
6899 return gl::error(GL_INVALID_OPERATION);
6900 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006901
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006902 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
6903 if (!programBinary)
6904 {
6905 return gl::error(GL_INVALID_OPERATION);
6906 }
6907
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00006908 if (!programBinary->setUniformMatrix4x2fv(location, count, transpose, value))
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006909 {
6910 return gl::error(GL_INVALID_OPERATION);
6911 }
6912 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006913 }
6914 catch(std::bad_alloc&)
6915 {
6916 return gl::error(GL_OUT_OF_MEMORY);
6917 }
6918}
6919
6920void __stdcall glUniformMatrix3x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
6921{
6922 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
6923 location, count, transpose, value);
6924
6925 try
6926 {
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006927 if (count < 0)
6928 {
6929 return gl::error(GL_INVALID_VALUE);
6930 }
6931
6932 if (location == -1)
6933 {
6934 return;
6935 }
6936
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006937 gl::Context *context = gl::getNonLostContext();
6938
6939 if (context)
6940 {
6941 if (context->getClientVersion() < 3)
6942 {
6943 return gl::error(GL_INVALID_OPERATION);
6944 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006945
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006946 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
6947 if (!programBinary)
6948 {
6949 return gl::error(GL_INVALID_OPERATION);
6950 }
6951
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00006952 if (!programBinary->setUniformMatrix3x4fv(location, count, transpose, value))
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006953 {
6954 return gl::error(GL_INVALID_OPERATION);
6955 }
6956 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006957 }
6958 catch(std::bad_alloc&)
6959 {
6960 return gl::error(GL_OUT_OF_MEMORY);
6961 }
6962}
6963
6964void __stdcall glUniformMatrix4x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
6965{
6966 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
6967 location, count, transpose, value);
6968
6969 try
6970 {
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006971 if (count < 0)
6972 {
6973 return gl::error(GL_INVALID_VALUE);
6974 }
6975
6976 if (location == -1)
6977 {
6978 return;
6979 }
6980
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006981 gl::Context *context = gl::getNonLostContext();
6982
6983 if (context)
6984 {
6985 if (context->getClientVersion() < 3)
6986 {
6987 return gl::error(GL_INVALID_OPERATION);
6988 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006989
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006990 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
6991 if (!programBinary)
6992 {
6993 return gl::error(GL_INVALID_OPERATION);
6994 }
6995
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00006996 if (!programBinary->setUniformMatrix4x3fv(location, count, transpose, value))
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006997 {
6998 return gl::error(GL_INVALID_OPERATION);
6999 }
7000 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007001 }
7002 catch(std::bad_alloc&)
7003 {
7004 return gl::error(GL_OUT_OF_MEMORY);
7005 }
7006}
7007
7008void __stdcall glBlitFramebuffer(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter)
7009{
7010 EVENT("(GLint srcX0 = %d, GLint srcY0 = %d, GLint srcX1 = %d, GLint srcY1 = %d, GLint dstX0 = %d, "
7011 "GLint dstY0 = %d, GLint dstX1 = %d, GLint dstY1 = %d, GLbitfield mask = 0x%X, GLenum filter = 0x%X)",
7012 srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter);
7013
7014 try
7015 {
7016 gl::Context *context = gl::getNonLostContext();
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007017 if (context)
7018 {
7019 if (context->getClientVersion() < 3)
7020 {
7021 return gl::error(GL_INVALID_OPERATION);
7022 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007023
Geoff Lang34dbb6f2013-08-05 15:05:47 -04007024 if (!ValidateBlitFramebufferParameters(context, srcX0, srcY0, srcX1, srcY1,
Geoff Lang758d5b22013-06-11 11:42:50 -04007025 dstX0, dstY0, dstX1, dstY1, mask, filter,
7026 false))
7027 {
7028 return;
7029 }
7030
7031 context->blitFramebuffer(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1,
7032 mask, filter);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007033 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007034 }
7035 catch(std::bad_alloc&)
7036 {
7037 return gl::error(GL_OUT_OF_MEMORY);
7038 }
7039}
7040
7041void __stdcall glRenderbufferStorageMultisample(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height)
7042{
7043 EVENT("(GLenum target = 0x%X, GLsizei samples = %d, GLenum internalformat = 0x%X, GLsizei width = %d, GLsizei height = %d)",
7044 target, samples, internalformat, width, height);
7045
7046 try
7047 {
7048 gl::Context *context = gl::getNonLostContext();
7049
7050 if (context)
7051 {
7052 if (context->getClientVersion() < 3)
7053 {
7054 return gl::error(GL_INVALID_OPERATION);
7055 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007056
Geoff Lang34dbb6f2013-08-05 15:05:47 -04007057 if (!ValidateRenderbufferStorageParameters(context, target, samples, internalformat,
Geoff Lang2e1dcd52013-05-29 10:34:08 -04007058 width, height, false))
7059 {
7060 return;
7061 }
7062
7063 context->setRenderbufferStorage(width, height, internalformat, samples);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007064 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007065 }
7066 catch(std::bad_alloc&)
7067 {
7068 return gl::error(GL_OUT_OF_MEMORY);
7069 }
7070}
7071
7072void __stdcall glFramebufferTextureLayer(GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer)
7073{
7074 EVENT("(GLenum target = 0x%X, GLenum attachment = 0x%X, GLuint texture = %u, GLint level = %d, GLint layer = %d)",
7075 target, attachment, texture, level, layer);
7076
7077 try
7078 {
7079 gl::Context *context = gl::getNonLostContext();
7080
7081 if (context)
7082 {
7083 if (context->getClientVersion() < 3)
7084 {
7085 return gl::error(GL_INVALID_OPERATION);
7086 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007087
Geoff Lang34dbb6f2013-08-05 15:05:47 -04007088 if (!ValidateES3FramebufferTextureParameters(context, target, attachment, GL_NONE, texture, level, layer, true))
Geoff Lang3ed0c482013-07-25 17:03:18 -04007089 {
7090 return;
7091 }
7092
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05007093 gl::Framebuffer *framebuffer = context->getTargetFramebuffer(target);
7094 ASSERT(framebuffer);
Geoff Lang3ed0c482013-07-25 17:03:18 -04007095
7096 gl::Texture *textureObject = context->getTexture(texture);
7097 GLenum textarget = textureObject ? textureObject->getTarget() : GL_NONE;
7098
7099 if (attachment >= GL_COLOR_ATTACHMENT0_EXT && attachment <= GL_COLOR_ATTACHMENT15_EXT)
7100 {
7101 const unsigned int colorAttachment = (attachment - GL_COLOR_ATTACHMENT0_EXT);
7102 framebuffer->setColorbuffer(colorAttachment, textarget, texture, level, layer);
7103 }
7104 else
7105 {
7106 switch (attachment)
7107 {
7108 case GL_DEPTH_ATTACHMENT: framebuffer->setDepthbuffer(textarget, texture, level, layer); break;
7109 case GL_STENCIL_ATTACHMENT: framebuffer->setStencilbuffer(textarget, texture, level, layer); break;
7110 case GL_DEPTH_STENCIL_ATTACHMENT: framebuffer->setDepthStencilBuffer(textarget, texture, level, layer); break;
7111 }
7112 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007113 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007114 }
7115 catch(std::bad_alloc&)
7116 {
7117 return gl::error(GL_OUT_OF_MEMORY);
7118 }
7119}
7120
7121GLvoid* __stdcall glMapBufferRange(GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access)
7122{
7123 EVENT("(GLenum target = 0x%X, GLintptr offset = %d, GLsizeiptr length = %d, GLbitfield access = 0x%X)",
7124 target, offset, length, access);
7125
7126 try
7127 {
7128 gl::Context *context = gl::getNonLostContext();
7129
7130 if (context)
7131 {
7132 if (context->getClientVersion() < 3)
7133 {
7134 return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLvoid*>(NULL));
7135 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007136
Jamie Madill54133512013-06-21 09:33:07 -04007137 // glMapBufferRange
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007138 UNIMPLEMENTED();
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, reinterpret_cast<GLvoid*>(NULL));
7144 }
7145
7146 return NULL;
7147}
7148
7149void __stdcall glFlushMappedBufferRange(GLenum target, GLintptr offset, GLsizeiptr length)
7150{
7151 EVENT("(GLenum target = 0x%X, GLintptr offset = %d, GLsizeiptr length = %d)", target, offset, length);
7152
7153 try
7154 {
7155 gl::Context *context = gl::getNonLostContext();
7156
7157 if (context)
7158 {
7159 if (context->getClientVersion() < 3)
7160 {
7161 return gl::error(GL_INVALID_OPERATION);
7162 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007163
Jamie Madill54133512013-06-21 09:33:07 -04007164 // glFlushMappedBufferRange
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007165 UNIMPLEMENTED();
7166 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007167 }
7168 catch(std::bad_alloc&)
7169 {
7170 return gl::error(GL_OUT_OF_MEMORY);
7171 }
7172}
7173
7174void __stdcall glBindVertexArray(GLuint array)
7175{
7176 EVENT("(GLuint array = %u)", array);
7177
7178 try
7179 {
7180 gl::Context *context = gl::getNonLostContext();
7181
7182 if (context)
7183 {
7184 if (context->getClientVersion() < 3)
7185 {
7186 return gl::error(GL_INVALID_OPERATION);
7187 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007188
Jamie Madilld1028542013-07-02 11:57:04 -04007189 gl::VertexArray *vao = context->getVertexArray(array);
7190
7191 if (!vao)
7192 {
7193 // The default VAO should always exist
7194 ASSERT(array != 0);
7195 return gl::error(GL_INVALID_OPERATION);
7196 }
7197
7198 context->bindVertexArray(array);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007199 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007200 }
7201 catch(std::bad_alloc&)
7202 {
7203 return gl::error(GL_OUT_OF_MEMORY);
7204 }
7205}
7206
7207void __stdcall glDeleteVertexArrays(GLsizei n, const GLuint* arrays)
7208{
7209 EVENT("(GLsizei n = %d, const GLuint* arrays = 0x%0.8p)", n, arrays);
7210
7211 try
7212 {
7213 gl::Context *context = gl::getNonLostContext();
7214
7215 if (context)
7216 {
7217 if (context->getClientVersion() < 3)
7218 {
7219 return gl::error(GL_INVALID_OPERATION);
7220 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007221
Jamie Madilld1028542013-07-02 11:57:04 -04007222 if (n < 0)
7223 {
7224 return gl::error(GL_INVALID_VALUE);
7225 }
7226
7227 for (int arrayIndex = 0; arrayIndex < n; arrayIndex++)
7228 {
7229 if (arrays[arrayIndex] != 0)
7230 {
7231 context->deleteVertexArray(arrays[arrayIndex]);
7232 }
7233 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007234 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007235 }
7236 catch(std::bad_alloc&)
7237 {
7238 return gl::error(GL_OUT_OF_MEMORY);
7239 }
7240}
7241
7242void __stdcall glGenVertexArrays(GLsizei n, GLuint* arrays)
7243{
7244 EVENT("(GLsizei n = %d, GLuint* arrays = 0x%0.8p)", n, arrays);
7245
7246 try
7247 {
7248 gl::Context *context = gl::getNonLostContext();
7249
7250 if (context)
7251 {
7252 if (context->getClientVersion() < 3)
7253 {
7254 return gl::error(GL_INVALID_OPERATION);
7255 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007256
Jamie Madilld1028542013-07-02 11:57:04 -04007257 if (n < 0)
7258 {
7259 return gl::error(GL_INVALID_VALUE);
7260 }
7261
7262 for (int arrayIndex = 0; arrayIndex < n; arrayIndex++)
7263 {
7264 arrays[arrayIndex] = context->createVertexArray();
7265 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007266 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007267 }
7268 catch(std::bad_alloc&)
7269 {
7270 return gl::error(GL_OUT_OF_MEMORY);
7271 }
7272}
7273
7274GLboolean __stdcall glIsVertexArray(GLuint array)
7275{
7276 EVENT("(GLuint array = %u)", array);
7277
7278 try
7279 {
7280 gl::Context *context = gl::getNonLostContext();
7281
7282 if (context)
7283 {
7284 if (context->getClientVersion() < 3)
7285 {
7286 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
7287 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007288
Jamie Madilld1028542013-07-02 11:57:04 -04007289 if (array == 0)
7290 {
7291 return GL_FALSE;
7292 }
7293
7294 gl::VertexArray *vao = context->getVertexArray(array);
7295
7296 return (vao != NULL ? GL_TRUE : GL_FALSE);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007297 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007298 }
7299 catch(std::bad_alloc&)
7300 {
7301 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
7302 }
7303
7304 return GL_FALSE;
7305}
7306
7307void __stdcall glGetIntegeri_v(GLenum target, GLuint index, GLint* data)
7308{
7309 EVENT("(GLenum target = 0x%X, GLuint index = %u, GLint* data = 0x%0.8p)",
7310 target, index, data);
7311
7312 try
7313 {
7314 gl::Context *context = gl::getNonLostContext();
7315
7316 if (context)
7317 {
7318 if (context->getClientVersion() < 3)
7319 {
7320 return gl::error(GL_INVALID_OPERATION);
7321 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007322
Shannon Woods15934d52013-08-19 14:28:49 -04007323 switch (target)
7324 {
7325 case GL_TRANSFORM_FEEDBACK_BUFFER_START:
7326 case GL_TRANSFORM_FEEDBACK_BUFFER_SIZE:
7327 case GL_TRANSFORM_FEEDBACK_BUFFER_BINDING:
7328 if (index >= context->getMaxTransformFeedbackBufferBindings())
7329 return gl::error(GL_INVALID_VALUE);
7330 break;
7331 case GL_UNIFORM_BUFFER_START:
7332 case GL_UNIFORM_BUFFER_SIZE:
7333 case GL_UNIFORM_BUFFER_BINDING:
7334 if (index >= context->getMaximumCombinedUniformBufferBindings())
7335 return gl::error(GL_INVALID_VALUE);
7336 break;
7337 default:
7338 return gl::error(GL_INVALID_ENUM);
7339 }
7340
7341 if (!(context->getIndexedIntegerv(target, index, data)))
7342 {
7343 GLenum nativeType;
7344 unsigned int numParams = 0;
7345 if (!context->getIndexedQueryParameterInfo(target, &nativeType, &numParams))
7346 return gl::error(GL_INVALID_ENUM);
7347
7348 if (numParams == 0)
7349 return; // it is known that pname is valid, but there are no parameters to return
7350
7351 if (nativeType == GL_INT_64_ANGLEX)
7352 {
7353 GLint64 minIntValue = static_cast<GLint64>(std::numeric_limits<int>::min());
7354 GLint64 maxIntValue = static_cast<GLint64>(std::numeric_limits<int>::max());
7355 GLint64 *int64Params = new GLint64[numParams];
7356
7357 context->getIndexedInteger64v(target, index, int64Params);
7358
7359 for (unsigned int i = 0; i < numParams; ++i)
7360 {
7361 GLint64 clampedValue = std::max(std::min(int64Params[i], maxIntValue), minIntValue);
7362 data[i] = static_cast<GLint>(clampedValue);
7363 }
7364
7365 delete [] int64Params;
7366 }
7367 else
7368 {
7369 UNREACHABLE();
7370 }
7371 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007372 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007373 }
7374 catch(std::bad_alloc&)
7375 {
7376 return gl::error(GL_OUT_OF_MEMORY);
7377 }
7378}
7379
7380void __stdcall glBeginTransformFeedback(GLenum primitiveMode)
7381{
7382 EVENT("(GLenum primitiveMode = 0x%X)", primitiveMode);
7383
7384 try
7385 {
7386 gl::Context *context = gl::getNonLostContext();
7387
7388 if (context)
7389 {
7390 if (context->getClientVersion() < 3)
7391 {
7392 return gl::error(GL_INVALID_OPERATION);
7393 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007394
Geoff Langc8058452014-02-03 12:04:11 -05007395 switch (primitiveMode)
7396 {
7397 case GL_TRIANGLES:
7398 case GL_LINES:
7399 case GL_POINTS:
7400 break;
7401 default:
7402 return gl::error(GL_INVALID_ENUM);
7403 }
7404
7405 gl::TransformFeedback *transformFeedback = context->getCurrentTransformFeedback();
7406 ASSERT(transformFeedback != NULL);
7407
7408 if (transformFeedback->isStarted())
7409 {
7410 return gl::error(GL_INVALID_OPERATION);
7411 }
7412
7413 if (transformFeedback->isPaused())
7414 {
7415 transformFeedback->resume();
7416 }
7417 else
7418 {
7419 transformFeedback->start(primitiveMode);
7420 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007421 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007422 }
7423 catch(std::bad_alloc&)
7424 {
7425 return gl::error(GL_OUT_OF_MEMORY);
7426 }
7427}
7428
7429void __stdcall glEndTransformFeedback(void)
7430{
7431 EVENT("(void)");
7432
7433 try
7434 {
7435 gl::Context *context = gl::getNonLostContext();
7436
7437 if (context)
7438 {
7439 if (context->getClientVersion() < 3)
7440 {
7441 return gl::error(GL_INVALID_OPERATION);
7442 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007443
Geoff Langc8058452014-02-03 12:04:11 -05007444 gl::TransformFeedback *transformFeedback = context->getCurrentTransformFeedback();
7445 ASSERT(transformFeedback != NULL);
7446
7447 if (!transformFeedback->isStarted())
7448 {
7449 return gl::error(GL_INVALID_OPERATION);
7450 }
7451
7452 transformFeedback->stop();
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007453 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007454 }
7455 catch(std::bad_alloc&)
7456 {
7457 return gl::error(GL_OUT_OF_MEMORY);
7458 }
7459}
7460
7461void __stdcall glBindBufferRange(GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size)
7462{
7463 EVENT("(GLenum target = 0x%X, GLuint index = %u, GLuint buffer = %u, GLintptr offset = %d, GLsizeiptr size = %d)",
7464 target, index, buffer, offset, size);
7465
7466 try
7467 {
7468 gl::Context *context = gl::getNonLostContext();
7469
7470 if (context)
7471 {
7472 if (context->getClientVersion() < 3)
7473 {
7474 return gl::error(GL_INVALID_OPERATION);
7475 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007476
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007477 switch (target)
7478 {
7479 case GL_TRANSFORM_FEEDBACK_BUFFER:
shannonwoods@chromium.orgd11158f2013-05-30 00:06:19 +00007480 if (index >= context->getMaxTransformFeedbackBufferBindings())
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007481 {
7482 return gl::error(GL_INVALID_VALUE);
7483 }
7484 break;
7485
7486 case GL_UNIFORM_BUFFER:
7487 if (index >= context->getMaximumCombinedUniformBufferBindings())
7488 {
7489 return gl::error(GL_INVALID_VALUE);
7490 }
7491 break;
7492
7493 default:
7494 return gl::error(GL_INVALID_ENUM);
7495 }
7496
shannonwoods@chromium.orge6e00792013-05-30 00:06:07 +00007497 if (buffer != 0 && size <= 0)
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007498 {
7499 return gl::error(GL_INVALID_VALUE);
7500 }
7501
7502 switch (target)
7503 {
7504 case GL_TRANSFORM_FEEDBACK_BUFFER:
shannonwoods@chromium.orga26aeaf2013-05-30 00:06:13 +00007505
7506 // size and offset must be a multiple of 4
7507 if (buffer != 0 && ((offset % 4) != 0 || (size % 4) != 0))
7508 {
7509 return gl::error(GL_INVALID_VALUE);
7510 }
7511
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +00007512 context->bindIndexedTransformFeedbackBuffer(buffer, index, offset, size);
7513 context->bindGenericTransformFeedbackBuffer(buffer);
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007514 break;
7515
7516 case GL_UNIFORM_BUFFER:
shannonwoods@chromium.org97c3d502013-05-30 00:04:34 +00007517
7518 // it is an error to bind an offset not a multiple of the alignment
7519 if (buffer != 0 && (offset % context->getUniformBufferOffsetAlignment()) != 0)
7520 {
7521 return gl::error(GL_INVALID_VALUE);
7522 }
7523
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +00007524 context->bindIndexedUniformBuffer(buffer, index, offset, size);
7525 context->bindGenericUniformBuffer(buffer);
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007526 break;
7527
7528 default:
7529 UNREACHABLE();
7530 }
7531 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007532 }
7533 catch(std::bad_alloc&)
7534 {
7535 return gl::error(GL_OUT_OF_MEMORY);
7536 }
7537}
7538
7539void __stdcall glBindBufferBase(GLenum target, GLuint index, GLuint buffer)
7540{
7541 EVENT("(GLenum target = 0x%X, GLuint index = %u, GLuint buffer = %u)",
7542 target, index, buffer);
7543
7544 try
7545 {
7546 gl::Context *context = gl::getNonLostContext();
7547
7548 if (context)
7549 {
7550 if (context->getClientVersion() < 3)
7551 {
7552 return gl::error(GL_INVALID_OPERATION);
7553 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007554
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007555 switch (target)
7556 {
7557 case GL_TRANSFORM_FEEDBACK_BUFFER:
shannonwoods@chromium.orgd11158f2013-05-30 00:06:19 +00007558 if (index >= context->getMaxTransformFeedbackBufferBindings())
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007559 {
7560 return gl::error(GL_INVALID_VALUE);
7561 }
7562 break;
7563
7564 case GL_UNIFORM_BUFFER:
shannonwoods@chromium.orgd11158f2013-05-30 00:06:19 +00007565 if (index >= context->getMaximumCombinedUniformBufferBindings())
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007566 {
7567 return gl::error(GL_INVALID_VALUE);
7568 }
7569 break;
7570
7571 default:
7572 return gl::error(GL_INVALID_ENUM);
7573 }
7574
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007575 switch (target)
7576 {
7577 case GL_TRANSFORM_FEEDBACK_BUFFER:
shannonwoods@chromium.org3eeca1e2013-05-30 00:04:28 +00007578 context->bindIndexedTransformFeedbackBuffer(buffer, index, 0, 0);
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +00007579 context->bindGenericTransformFeedbackBuffer(buffer);
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007580 break;
7581
7582 case GL_UNIFORM_BUFFER:
shannonwoods@chromium.org3eeca1e2013-05-30 00:04:28 +00007583 context->bindIndexedUniformBuffer(buffer, index, 0, 0);
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +00007584 context->bindGenericUniformBuffer(buffer);
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007585 break;
7586
7587 default:
7588 UNREACHABLE();
7589 }
7590 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007591 }
7592 catch(std::bad_alloc&)
7593 {
7594 return gl::error(GL_OUT_OF_MEMORY);
7595 }
7596}
7597
7598void __stdcall glTransformFeedbackVaryings(GLuint program, GLsizei count, const GLchar* const* varyings, GLenum bufferMode)
7599{
7600 EVENT("(GLuint program = %u, GLsizei count = %d, const GLchar* const* varyings = 0x%0.8p, GLenum bufferMode = 0x%X)",
7601 program, count, varyings, bufferMode);
7602
7603 try
7604 {
7605 gl::Context *context = gl::getNonLostContext();
7606
7607 if (context)
7608 {
7609 if (context->getClientVersion() < 3)
7610 {
7611 return gl::error(GL_INVALID_OPERATION);
7612 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007613
Jamie Madill54133512013-06-21 09:33:07 -04007614 // glTransformFeedbackVaryings
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007615 UNIMPLEMENTED();
7616 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007617 }
7618 catch(std::bad_alloc&)
7619 {
7620 return gl::error(GL_OUT_OF_MEMORY);
7621 }
7622}
7623
7624void __stdcall glGetTransformFeedbackVarying(GLuint program, GLuint index, GLsizei bufSize, GLsizei* length, GLsizei* size, GLenum* type, GLchar* name)
7625{
7626 EVENT("(GLuint program = %u, GLuint index = %u, GLsizei bufSize = %d, GLsizei* length = 0x%0.8p, "
7627 "GLsizei* size = 0x%0.8p, GLenum* type = 0x%0.8p, GLchar* name = 0x%0.8p)",
7628 program, index, bufSize, length, size, type, name);
7629
7630 try
7631 {
7632 gl::Context *context = gl::getNonLostContext();
7633
7634 if (context)
7635 {
7636 if (context->getClientVersion() < 3)
7637 {
7638 return gl::error(GL_INVALID_OPERATION);
7639 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007640
Jamie Madill54133512013-06-21 09:33:07 -04007641 // glGetTransformFeedbackVarying
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007642 UNIMPLEMENTED();
7643 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007644 }
7645 catch(std::bad_alloc&)
7646 {
7647 return gl::error(GL_OUT_OF_MEMORY);
7648 }
7649}
7650
7651void __stdcall glVertexAttribIPointer(GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid* pointer)
7652{
7653 EVENT("(GLuint index = %u, GLint size = %d, GLenum type = 0x%X, GLsizei stride = %d, const GLvoid* pointer = 0x%0.8p)",
7654 index, size, type, stride, pointer);
7655
7656 try
7657 {
7658 gl::Context *context = gl::getNonLostContext();
7659
7660 if (context)
7661 {
7662 if (context->getClientVersion() < 3)
7663 {
7664 return gl::error(GL_INVALID_OPERATION);
7665 }
7666 }
7667
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007668 if (index >= gl::MAX_VERTEX_ATTRIBS)
7669 {
7670 return gl::error(GL_INVALID_VALUE);
7671 }
7672
7673 if (size < 1 || size > 4)
7674 {
7675 return gl::error(GL_INVALID_VALUE);
7676 }
7677
7678 switch (type)
7679 {
7680 case GL_BYTE:
7681 case GL_UNSIGNED_BYTE:
7682 case GL_SHORT:
7683 case GL_UNSIGNED_SHORT:
7684 case GL_INT:
7685 case GL_UNSIGNED_INT:
shannon.woods%transgaming.com@gtempaccount.com1ab57be2013-04-13 03:38:39 +00007686 case GL_INT_2_10_10_10_REV:
7687 case GL_UNSIGNED_INT_2_10_10_10_REV:
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007688 break;
7689 default:
7690 return gl::error(GL_INVALID_ENUM);
7691 }
7692
7693 if (stride < 0)
7694 {
7695 return gl::error(GL_INVALID_VALUE);
7696 }
7697
shannon.woods%transgaming.com@gtempaccount.com1ab57be2013-04-13 03:38:39 +00007698 if ((type == GL_INT_2_10_10_10_REV || type == GL_UNSIGNED_INT_2_10_10_10_REV) && size != 4)
7699 {
7700 return gl::error(GL_INVALID_OPERATION);
7701 }
7702
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007703 if (context)
7704 {
Jamie Madilld8db8662013-07-02 11:57:04 -04007705 // [OpenGL ES 3.0.2] Section 2.8 page 24:
7706 // An INVALID_OPERATION error is generated when a non-zero vertex array object
7707 // is bound, zero is bound to the ARRAY_BUFFER buffer object binding point,
7708 // and the pointer argument is not NULL.
7709 if (context->getVertexArrayHandle() != 0 && context->getArrayBufferHandle() == 0 && pointer != NULL)
7710 {
7711 return gl::error(GL_INVALID_OPERATION);
7712 }
7713
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007714 context->setVertexAttribState(index, context->getArrayBuffer(), size, type, false, true,
7715 stride, pointer);
7716 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007717 }
7718 catch(std::bad_alloc&)
7719 {
7720 return gl::error(GL_OUT_OF_MEMORY);
7721 }
7722}
7723
7724void __stdcall glGetVertexAttribIiv(GLuint index, GLenum pname, GLint* params)
7725{
7726 EVENT("(GLuint index = %u, GLenum pname = 0x%X, GLint* params = 0x%0.8p)",
7727 index, pname, params);
7728
7729 try
7730 {
7731 gl::Context *context = gl::getNonLostContext();
7732
7733 if (context)
7734 {
7735 if (context->getClientVersion() < 3)
7736 {
7737 return gl::error(GL_INVALID_OPERATION);
7738 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007739
Jamie Madilla7d05862013-07-02 11:57:06 -04007740 if (index >= gl::MAX_VERTEX_ATTRIBS)
7741 {
7742 return gl::error(GL_INVALID_VALUE);
7743 }
7744
7745 const gl::VertexAttribute &attribState = context->getVertexAttribState(index);
7746
Geoff Lang34dbb6f2013-08-05 15:05:47 -04007747 if (!gl::ValidateGetVertexAttribParameters(pname, context->getClientVersion()))
Jamie Madilla7d05862013-07-02 11:57:06 -04007748 {
7749 return;
7750 }
7751
7752 if (pname == GL_CURRENT_VERTEX_ATTRIB)
7753 {
7754 const gl::VertexAttribCurrentValueData &currentValueData = context->getVertexAttribCurrentValue(index);
7755 for (int i = 0; i < 4; ++i)
7756 {
7757 params[i] = currentValueData.IntValues[i];
7758 }
7759 }
7760 else
7761 {
7762 *params = attribState.querySingleParameter<GLint>(pname);
7763 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007764 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007765 }
7766 catch(std::bad_alloc&)
7767 {
7768 return gl::error(GL_OUT_OF_MEMORY);
7769 }
7770}
7771
7772void __stdcall glGetVertexAttribIuiv(GLuint index, GLenum pname, GLuint* params)
7773{
7774 EVENT("(GLuint index = %u, GLenum pname = 0x%X, GLuint* params = 0x%0.8p)",
7775 index, pname, params);
7776
7777 try
7778 {
7779 gl::Context *context = gl::getNonLostContext();
7780
7781 if (context)
7782 {
7783 if (context->getClientVersion() < 3)
7784 {
7785 return gl::error(GL_INVALID_OPERATION);
7786 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007787
Jamie Madilla7d05862013-07-02 11:57:06 -04007788 if (index >= gl::MAX_VERTEX_ATTRIBS)
7789 {
7790 return gl::error(GL_INVALID_VALUE);
7791 }
7792
7793 const gl::VertexAttribute &attribState = context->getVertexAttribState(index);
7794
Geoff Lang34dbb6f2013-08-05 15:05:47 -04007795 if (!gl::ValidateGetVertexAttribParameters(pname, context->getClientVersion()))
Jamie Madilla7d05862013-07-02 11:57:06 -04007796 {
7797 return;
7798 }
7799
7800 if (pname == GL_CURRENT_VERTEX_ATTRIB)
7801 {
7802 const gl::VertexAttribCurrentValueData &currentValueData = context->getVertexAttribCurrentValue(index);
7803 for (int i = 0; i < 4; ++i)
7804 {
7805 params[i] = currentValueData.UnsignedIntValues[i];
7806 }
7807 }
7808 else
7809 {
7810 *params = attribState.querySingleParameter<GLuint>(pname);
7811 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007812 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007813 }
7814 catch(std::bad_alloc&)
7815 {
7816 return gl::error(GL_OUT_OF_MEMORY);
7817 }
7818}
7819
7820void __stdcall glVertexAttribI4i(GLuint index, GLint x, GLint y, GLint z, GLint w)
7821{
7822 EVENT("(GLuint index = %u, GLint x = %d, GLint y = %d, GLint z = %d, GLint w = %d)",
7823 index, x, y, z, w);
7824
7825 try
7826 {
7827 gl::Context *context = gl::getNonLostContext();
7828
7829 if (context)
7830 {
7831 if (context->getClientVersion() < 3)
7832 {
7833 return gl::error(GL_INVALID_OPERATION);
7834 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007835
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007836 if (index >= gl::MAX_VERTEX_ATTRIBS)
7837 {
7838 return gl::error(GL_INVALID_VALUE);
7839 }
7840
7841 GLint vals[4] = { x, y, z, w };
7842 context->setVertexAttribi(index, vals);
7843 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007844 }
7845 catch(std::bad_alloc&)
7846 {
7847 return gl::error(GL_OUT_OF_MEMORY);
7848 }
7849}
7850
7851void __stdcall glVertexAttribI4ui(GLuint index, GLuint x, GLuint y, GLuint z, GLuint w)
7852{
7853 EVENT("(GLuint index = %u, GLuint x = %u, GLuint y = %u, GLuint z = %u, GLuint w = %u)",
7854 index, x, y, z, w);
7855
7856 try
7857 {
7858 gl::Context *context = gl::getNonLostContext();
7859
7860 if (context)
7861 {
7862 if (context->getClientVersion() < 3)
7863 {
7864 return gl::error(GL_INVALID_OPERATION);
7865 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007866
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007867 if (index >= gl::MAX_VERTEX_ATTRIBS)
7868 {
7869 return gl::error(GL_INVALID_VALUE);
7870 }
7871
7872 GLuint vals[4] = { x, y, z, w };
7873 context->setVertexAttribu(index, vals);
7874 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007875 }
7876 catch(std::bad_alloc&)
7877 {
7878 return gl::error(GL_OUT_OF_MEMORY);
7879 }
7880}
7881
7882void __stdcall glVertexAttribI4iv(GLuint index, const GLint* v)
7883{
7884 EVENT("(GLuint index = %u, const GLint* v = 0x%0.8p)", index, v);
7885
7886 try
7887 {
7888 gl::Context *context = gl::getNonLostContext();
7889
7890 if (context)
7891 {
7892 if (context->getClientVersion() < 3)
7893 {
7894 return gl::error(GL_INVALID_OPERATION);
7895 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007896
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007897 if (index >= gl::MAX_VERTEX_ATTRIBS)
7898 {
7899 return gl::error(GL_INVALID_VALUE);
7900 }
7901
7902 context->setVertexAttribi(index, v);
7903 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007904 }
7905 catch(std::bad_alloc&)
7906 {
7907 return gl::error(GL_OUT_OF_MEMORY);
7908 }
7909}
7910
7911void __stdcall glVertexAttribI4uiv(GLuint index, const GLuint* v)
7912{
7913 EVENT("(GLuint index = %u, const GLuint* v = 0x%0.8p)", index, v);
7914
7915 try
7916 {
7917 gl::Context *context = gl::getNonLostContext();
7918
7919 if (context)
7920 {
7921 if (context->getClientVersion() < 3)
7922 {
7923 return gl::error(GL_INVALID_OPERATION);
7924 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007925
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007926 if (index >= gl::MAX_VERTEX_ATTRIBS)
7927 {
7928 return gl::error(GL_INVALID_VALUE);
7929 }
7930
7931 context->setVertexAttribu(index, v);
7932 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007933 }
7934 catch(std::bad_alloc&)
7935 {
7936 return gl::error(GL_OUT_OF_MEMORY);
7937 }
7938}
7939
7940void __stdcall glGetUniformuiv(GLuint program, GLint location, GLuint* params)
7941{
7942 EVENT("(GLuint program = %u, GLint location = %d, GLuint* params = 0x%0.8p)",
7943 program, location, params);
7944
7945 try
7946 {
7947 gl::Context *context = gl::getNonLostContext();
7948
7949 if (context)
7950 {
7951 if (context->getClientVersion() < 3)
7952 {
7953 return gl::error(GL_INVALID_OPERATION);
7954 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007955
shannon.woods%transgaming.com@gtempaccount.come2290122013-04-13 03:41:07 +00007956 if (program == 0)
7957 {
7958 return gl::error(GL_INVALID_VALUE);
7959 }
7960
7961 gl::Program *programObject = context->getProgram(program);
7962
7963 if (!programObject || !programObject->isLinked())
7964 {
7965 return gl::error(GL_INVALID_OPERATION);
7966 }
7967
7968 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
7969 if (!programBinary)
7970 {
7971 return gl::error(GL_INVALID_OPERATION);
7972 }
7973
7974 if (!programBinary->getUniformuiv(location, NULL, params))
7975 {
7976 return gl::error(GL_INVALID_OPERATION);
7977 }
7978 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007979 }
7980 catch(std::bad_alloc&)
7981 {
7982 return gl::error(GL_OUT_OF_MEMORY);
7983 }
7984}
7985
7986GLint __stdcall glGetFragDataLocation(GLuint program, const GLchar *name)
7987{
7988 EVENT("(GLuint program = %u, const GLchar *name = 0x%0.8p)",
7989 program, name);
7990
7991 try
7992 {
7993 gl::Context *context = gl::getNonLostContext();
7994
7995 if (context)
7996 {
7997 if (context->getClientVersion() < 3)
7998 {
Jamie Madilld1e78c92013-06-20 11:55:50 -04007999 return gl::error(GL_INVALID_OPERATION, -1);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008000 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008001
Jamie Madilld1e78c92013-06-20 11:55:50 -04008002 if (program == 0)
8003 {
8004 return gl::error(GL_INVALID_VALUE, -1);
8005 }
8006
8007 gl::Program *programObject = context->getProgram(program);
8008
8009 if (!programObject || !programObject->isLinked())
8010 {
8011 return gl::error(GL_INVALID_OPERATION, -1);
8012 }
8013
8014 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
8015 if (!programBinary)
8016 {
8017 return gl::error(GL_INVALID_OPERATION, -1);
8018 }
8019
8020 return programBinary->getFragDataLocation(name);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008021 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008022 }
8023 catch(std::bad_alloc&)
8024 {
8025 return gl::error(GL_OUT_OF_MEMORY, 0);
8026 }
8027
8028 return 0;
8029}
8030
8031void __stdcall glUniform1ui(GLint location, GLuint v0)
8032{
shannon.woods%transgaming.com@gtempaccount.com8431b9c2013-04-13 03:40:17 +00008033 glUniform1uiv(location, 1, &v0);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008034}
8035
8036void __stdcall glUniform2ui(GLint location, GLuint v0, GLuint v1)
8037{
shannon.woods%transgaming.com@gtempaccount.com8431b9c2013-04-13 03:40:17 +00008038 const GLuint xy[] = { v0, v1 };
8039 glUniform2uiv(location, 1, xy);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008040}
8041
8042void __stdcall glUniform3ui(GLint location, GLuint v0, GLuint v1, GLuint v2)
8043{
shannon.woods%transgaming.com@gtempaccount.com8431b9c2013-04-13 03:40:17 +00008044 const GLuint xyz[] = { v0, v1, v2 };
8045 glUniform3uiv(location, 1, xyz);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008046}
8047
8048void __stdcall glUniform4ui(GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3)
8049{
shannon.woods%transgaming.com@gtempaccount.com8431b9c2013-04-13 03:40:17 +00008050 const GLuint xyzw[] = { v0, v1, v2, v3 };
8051 glUniform4uiv(location, 1, xyzw);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008052}
8053
8054void __stdcall glUniform1uiv(GLint location, GLsizei count, const GLuint* value)
8055{
8056 EVENT("(GLint location = %d, GLsizei count = %d, const GLuint* value = 0x%0.8p)",
8057 location, count, value);
8058
8059 try
8060 {
8061 gl::Context *context = gl::getNonLostContext();
8062
8063 if (context)
8064 {
8065 if (context->getClientVersion() < 3)
8066 {
8067 return gl::error(GL_INVALID_OPERATION);
8068 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008069
shannon.woods%transgaming.com@gtempaccount.com50ea4ab2013-04-13 03:40:36 +00008070 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
8071 if (!programBinary)
8072 {
8073 return gl::error(GL_INVALID_OPERATION);
8074 }
8075
8076 if (!programBinary->setUniform1uiv(location, count, value))
8077 {
8078 return gl::error(GL_INVALID_OPERATION);
8079 }
8080 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008081 }
8082 catch(std::bad_alloc&)
8083 {
8084 return gl::error(GL_OUT_OF_MEMORY);
8085 }
8086}
8087
8088void __stdcall glUniform2uiv(GLint location, GLsizei count, const GLuint* value)
8089{
8090 EVENT("(GLint location = %d, GLsizei count = %d, const GLuint* value = 0x%0.8p)",
8091 location, count, value);
8092
8093 try
8094 {
8095 gl::Context *context = gl::getNonLostContext();
8096
8097 if (context)
8098 {
8099 if (context->getClientVersion() < 3)
8100 {
8101 return gl::error(GL_INVALID_OPERATION);
8102 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008103
shannon.woods%transgaming.com@gtempaccount.com50ea4ab2013-04-13 03:40:36 +00008104 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
8105 if (!programBinary)
8106 {
8107 return gl::error(GL_INVALID_OPERATION);
8108 }
8109
8110 if (!programBinary->setUniform2uiv(location, count, value))
8111 {
8112 return gl::error(GL_INVALID_OPERATION);
8113 }
8114 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008115 }
8116 catch(std::bad_alloc&)
8117 {
8118 return gl::error(GL_OUT_OF_MEMORY);
8119 }
8120}
8121
8122void __stdcall glUniform3uiv(GLint location, GLsizei count, const GLuint* value)
8123{
8124 EVENT("(GLint location = %d, GLsizei count = %d, const GLuint* value)",
8125 location, count, value);
8126
8127 try
8128 {
8129 gl::Context *context = gl::getNonLostContext();
8130
8131 if (context)
8132 {
8133 if (context->getClientVersion() < 3)
8134 {
8135 return gl::error(GL_INVALID_OPERATION);
8136 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008137
shannon.woods%transgaming.com@gtempaccount.com50ea4ab2013-04-13 03:40:36 +00008138 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
8139 if (!programBinary)
8140 {
8141 return gl::error(GL_INVALID_OPERATION);
8142 }
8143
8144 if (!programBinary->setUniform3uiv(location, count, value))
8145 {
8146 return gl::error(GL_INVALID_OPERATION);
8147 }
8148 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008149 }
8150 catch(std::bad_alloc&)
8151 {
8152 return gl::error(GL_OUT_OF_MEMORY);
8153 }
8154}
8155
8156void __stdcall glUniform4uiv(GLint location, GLsizei count, const GLuint* value)
8157{
8158 EVENT("(GLint location = %d, GLsizei count = %d, const GLuint* value = 0x%0.8p)",
8159 location, count, value);
8160
8161 try
8162 {
8163 gl::Context *context = gl::getNonLostContext();
8164
8165 if (context)
8166 {
8167 if (context->getClientVersion() < 3)
8168 {
8169 return gl::error(GL_INVALID_OPERATION);
8170 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008171
shannon.woods%transgaming.com@gtempaccount.com50ea4ab2013-04-13 03:40:36 +00008172 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
8173 if (!programBinary)
8174 {
8175 return gl::error(GL_INVALID_OPERATION);
8176 }
8177
8178 if (!programBinary->setUniform4uiv(location, count, value))
8179 {
8180 return gl::error(GL_INVALID_OPERATION);
8181 }
8182 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008183 }
8184 catch(std::bad_alloc&)
8185 {
8186 return gl::error(GL_OUT_OF_MEMORY);
8187 }
8188}
8189
8190void __stdcall glClearBufferiv(GLenum buffer, GLint drawbuffer, const GLint* value)
8191{
8192 EVENT("(GLenum buffer = 0x%X, GLint drawbuffer = %d, const GLint* value = 0x%0.8p)",
8193 buffer, drawbuffer, value);
8194
8195 try
8196 {
8197 gl::Context *context = gl::getNonLostContext();
8198
8199 if (context)
8200 {
8201 if (context->getClientVersion() < 3)
8202 {
8203 return gl::error(GL_INVALID_OPERATION);
8204 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008205
Geoff Lang42359ca2013-08-21 13:25:17 -04008206 switch (buffer)
8207 {
8208 case GL_COLOR:
8209 if (drawbuffer < 0 || drawbuffer >= static_cast<GLint>(context->getMaximumRenderTargets()))
8210 {
8211 return gl::error(GL_INVALID_VALUE);
8212 }
8213 break;
8214 case GL_STENCIL:
8215 if (drawbuffer != 0)
8216 {
8217 return gl::error(GL_INVALID_VALUE);
8218 }
Geoff Lang8d6a0022014-01-31 16:38:31 -05008219 break;
Geoff Lang42359ca2013-08-21 13:25:17 -04008220 default:
8221 return gl::error(GL_INVALID_ENUM);
8222 }
8223
8224 context->clearBufferiv(buffer, drawbuffer, value);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008225 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008226 }
8227 catch(std::bad_alloc&)
8228 {
8229 return gl::error(GL_OUT_OF_MEMORY);
8230 }
8231}
8232
8233void __stdcall glClearBufferuiv(GLenum buffer, GLint drawbuffer, const GLuint* value)
8234{
8235 EVENT("(GLenum buffer = 0x%X, GLint drawbuffer = %d, const GLuint* value = 0x%0.8p)",
8236 buffer, drawbuffer, value);
8237
8238 try
8239 {
8240 gl::Context *context = gl::getNonLostContext();
8241
8242 if (context)
8243 {
8244 if (context->getClientVersion() < 3)
8245 {
8246 return gl::error(GL_INVALID_OPERATION);
8247 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008248
Geoff Lang42359ca2013-08-21 13:25:17 -04008249 switch (buffer)
8250 {
8251 case GL_COLOR:
8252 if (drawbuffer < 0 || drawbuffer >= static_cast<GLint>(context->getMaximumRenderTargets()))
8253 {
8254 return gl::error(GL_INVALID_VALUE);
8255 }
8256 break;
8257 default:
8258 return gl::error(GL_INVALID_ENUM);
8259 }
8260
8261 context->clearBufferuiv(buffer, drawbuffer, value);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008262 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008263 }
8264 catch(std::bad_alloc&)
8265 {
8266 return gl::error(GL_OUT_OF_MEMORY);
8267 }
8268}
8269
8270void __stdcall glClearBufferfv(GLenum buffer, GLint drawbuffer, const GLfloat* value)
8271{
8272 EVENT("(GLenum buffer = 0x%X, GLint drawbuffer = %d, const GLfloat* value = 0x%0.8p)",
8273 buffer, drawbuffer, value);
8274
8275 try
8276 {
8277 gl::Context *context = gl::getNonLostContext();
8278
8279 if (context)
8280 {
8281 if (context->getClientVersion() < 3)
8282 {
8283 return gl::error(GL_INVALID_OPERATION);
8284 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008285
Geoff Lang42359ca2013-08-21 13:25:17 -04008286 switch (buffer)
8287 {
8288 case GL_COLOR:
8289 if (drawbuffer < 0 || drawbuffer >= static_cast<GLint>(context->getMaximumRenderTargets()))
8290 {
8291 return gl::error(GL_INVALID_VALUE);
8292 }
8293 break;
8294 case GL_DEPTH:
8295 if (drawbuffer != 0)
8296 {
8297 return gl::error(GL_INVALID_VALUE);
8298 }
8299 break;
8300 default:
8301 return gl::error(GL_INVALID_ENUM);
8302 }
8303
8304 context->clearBufferfv(buffer, drawbuffer, value);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008305 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008306 }
8307 catch(std::bad_alloc&)
8308 {
8309 return gl::error(GL_OUT_OF_MEMORY);
8310 }
8311}
8312
8313void __stdcall glClearBufferfi(GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil)
8314{
8315 EVENT("(GLenum buffer = 0x%X, GLint drawbuffer = %d, GLfloat depth, GLint stencil = %d)",
8316 buffer, drawbuffer, depth, stencil);
8317
8318 try
8319 {
8320 gl::Context *context = gl::getNonLostContext();
8321
8322 if (context)
8323 {
8324 if (context->getClientVersion() < 3)
8325 {
8326 return gl::error(GL_INVALID_OPERATION);
8327 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008328
Geoff Lang42359ca2013-08-21 13:25:17 -04008329 switch (buffer)
8330 {
8331 case GL_DEPTH_STENCIL:
8332 if (drawbuffer != 0)
8333 {
8334 return gl::error(GL_INVALID_VALUE);
8335 }
8336 break;
8337 default:
8338 return gl::error(GL_INVALID_ENUM);
8339 }
8340
8341 context->clearBufferfi(buffer, drawbuffer, depth, stencil);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008342 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008343 }
8344 catch(std::bad_alloc&)
8345 {
8346 return gl::error(GL_OUT_OF_MEMORY);
8347 }
8348}
8349
8350const GLubyte* __stdcall glGetStringi(GLenum name, GLuint index)
8351{
8352 EVENT("(GLenum name = 0x%X, GLuint index = %u)", name, index);
8353
8354 try
8355 {
8356 gl::Context *context = gl::getNonLostContext();
8357
8358 if (context)
8359 {
8360 if (context->getClientVersion() < 3)
8361 {
8362 return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLubyte*>(NULL));
8363 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008364
shannonwoods@chromium.org302df742013-05-30 00:05:54 +00008365 if (name != GL_EXTENSIONS)
8366 {
8367 return gl::error(GL_INVALID_ENUM, reinterpret_cast<GLubyte*>(NULL));
8368 }
8369
8370 if (index >= context->getNumExtensions())
8371 {
8372 return gl::error(GL_INVALID_VALUE, reinterpret_cast<GLubyte*>(NULL));
8373 }
8374
8375 return reinterpret_cast<const GLubyte*>(context->getExtensionString(index));
8376 }
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, reinterpret_cast<GLubyte*>(NULL));
8381 }
8382
8383 return NULL;
8384}
8385
8386void __stdcall glCopyBufferSubData(GLenum readTarget, GLenum writeTarget, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size)
8387{
8388 EVENT("(GLenum readTarget = 0x%X, GLenum writeTarget = 0x%X, GLintptr readOffset = %d, GLintptr writeOffset = %d, GLsizeiptr size = %d)",
8389 readTarget, writeTarget, readOffset, writeOffset, size);
8390
8391 try
8392 {
8393 gl::Context *context = gl::getNonLostContext();
8394
8395 if (context)
8396 {
8397 if (context->getClientVersion() < 3)
8398 {
8399 return gl::error(GL_INVALID_OPERATION);
8400 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008401
shannon.woods%transgaming.com@gtempaccount.com296c3f22013-04-13 03:39:39 +00008402 gl::Buffer *readBuffer = NULL;
8403 switch (readTarget)
8404 {
8405 case GL_ARRAY_BUFFER:
8406 readBuffer = context->getArrayBuffer();
8407 break;
8408 case GL_COPY_READ_BUFFER:
8409 readBuffer = context->getCopyReadBuffer();
8410 break;
8411 case GL_COPY_WRITE_BUFFER:
8412 readBuffer = context->getCopyWriteBuffer();
8413 break;
8414 case GL_ELEMENT_ARRAY_BUFFER:
8415 readBuffer = context->getElementArrayBuffer();
8416 break;
8417 case GL_PIXEL_PACK_BUFFER:
8418 readBuffer = context->getPixelPackBuffer();
8419 break;
8420 case GL_PIXEL_UNPACK_BUFFER:
8421 readBuffer = context->getPixelUnpackBuffer();
8422 break;
8423 case GL_TRANSFORM_FEEDBACK_BUFFER:
8424 readBuffer = context->getGenericTransformFeedbackBuffer();
8425 break;
8426 case GL_UNIFORM_BUFFER:
8427 readBuffer = context->getGenericUniformBuffer();
8428 break;
8429 default:
8430 return gl::error(GL_INVALID_ENUM);
8431 }
8432
8433 gl::Buffer *writeBuffer = NULL;
8434 switch (writeTarget)
8435 {
8436 case GL_ARRAY_BUFFER:
8437 writeBuffer = context->getArrayBuffer();
8438 break;
8439 case GL_COPY_READ_BUFFER:
8440 writeBuffer = context->getCopyReadBuffer();
8441 break;
8442 case GL_COPY_WRITE_BUFFER:
8443 writeBuffer = context->getCopyWriteBuffer();
8444 break;
8445 case GL_ELEMENT_ARRAY_BUFFER:
8446 writeBuffer = context->getElementArrayBuffer();
8447 break;
8448 case GL_PIXEL_PACK_BUFFER:
8449 writeBuffer = context->getPixelPackBuffer();
8450 break;
8451 case GL_PIXEL_UNPACK_BUFFER:
8452 writeBuffer = context->getPixelUnpackBuffer();
8453 break;
8454 case GL_TRANSFORM_FEEDBACK_BUFFER:
8455 writeBuffer = context->getGenericTransformFeedbackBuffer();
8456 break;
8457 case GL_UNIFORM_BUFFER:
8458 writeBuffer = context->getGenericUniformBuffer();
8459 break;
8460 default:
8461 return gl::error(GL_INVALID_ENUM);
8462 }
8463
8464 if (!readBuffer || !writeBuffer)
8465 {
8466 return gl::error(GL_INVALID_OPERATION);
8467 }
8468
8469 if (readOffset < 0 || writeOffset < 0 || size < 0 ||
8470 static_cast<unsigned int>(readOffset + size) > readBuffer->size() ||
8471 static_cast<unsigned int>(writeOffset + size) > writeBuffer->size())
8472 {
8473 return gl::error(GL_INVALID_VALUE);
8474 }
8475
8476 if (readBuffer == writeBuffer && abs(readOffset - writeOffset) < size)
8477 {
8478 return gl::error(GL_INVALID_VALUE);
8479 }
8480
8481 // TODO: Verify that readBuffer and writeBuffer are not currently mapped (GL_INVALID_OPERATION)
8482
shannon.woods%transgaming.com@gtempaccount.comc53376a2013-04-13 03:41:23 +00008483 // if size is zero, the copy is a successful no-op
8484 if (size > 0)
8485 {
8486 writeBuffer->copyBufferSubData(readBuffer, readOffset, writeOffset, size);
8487 }
shannon.woods%transgaming.com@gtempaccount.com296c3f22013-04-13 03:39:39 +00008488 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008489 }
8490 catch(std::bad_alloc&)
8491 {
8492 return gl::error(GL_OUT_OF_MEMORY);
8493 }
8494}
8495
8496void __stdcall glGetUniformIndices(GLuint program, GLsizei uniformCount, const GLchar* const* uniformNames, GLuint* uniformIndices)
8497{
8498 EVENT("(GLuint program = %u, GLsizei uniformCount = %d, const GLchar* const* uniformNames = 0x%0.8p, GLuint* uniformIndices = 0x%0.8p)",
8499 program, uniformCount, uniformNames, uniformIndices);
8500
8501 try
8502 {
8503 gl::Context *context = gl::getNonLostContext();
8504
8505 if (context)
8506 {
8507 if (context->getClientVersion() < 3)
8508 {
8509 return gl::error(GL_INVALID_OPERATION);
8510 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008511
shannonwoods@chromium.orgc2ed9912013-05-30 00:05:33 +00008512 if (uniformCount < 0)
8513 {
8514 return gl::error(GL_INVALID_VALUE);
8515 }
8516
8517 gl::Program *programObject = context->getProgram(program);
8518
8519 if (!programObject)
8520 {
8521 if (context->getShader(program))
8522 {
8523 return gl::error(GL_INVALID_OPERATION);
8524 }
8525 else
8526 {
8527 return gl::error(GL_INVALID_VALUE);
8528 }
8529 }
8530
8531 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
8532 if (!programObject->isLinked() || !programBinary)
8533 {
8534 for (int uniformId = 0; uniformId < uniformCount; uniformId++)
8535 {
8536 uniformIndices[uniformId] = GL_INVALID_INDEX;
8537 }
8538 }
8539 else
8540 {
8541 for (int uniformId = 0; uniformId < uniformCount; uniformId++)
8542 {
8543 uniformIndices[uniformId] = programBinary->getUniformIndex(uniformNames[uniformId]);
8544 }
8545 }
8546 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008547 }
8548 catch(std::bad_alloc&)
8549 {
8550 return gl::error(GL_OUT_OF_MEMORY);
8551 }
8552}
8553
8554void __stdcall glGetActiveUniformsiv(GLuint program, GLsizei uniformCount, const GLuint* uniformIndices, GLenum pname, GLint* params)
8555{
8556 EVENT("(GLuint program = %u, GLsizei uniformCount = %d, const GLuint* uniformIndices = 0x%0.8p, GLenum pname = 0x%X, GLint* params = 0x%0.8p)",
8557 program, uniformCount, uniformIndices, pname, params);
8558
8559 try
8560 {
8561 gl::Context *context = gl::getNonLostContext();
8562
8563 if (context)
8564 {
8565 if (context->getClientVersion() < 3)
8566 {
8567 return gl::error(GL_INVALID_OPERATION);
8568 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008569
shannonwoods@chromium.org2a9a9d22013-05-30 00:05:40 +00008570 if (uniformCount < 0)
8571 {
8572 return gl::error(GL_INVALID_VALUE);
8573 }
8574
8575 gl::Program *programObject = context->getProgram(program);
8576
8577 if (!programObject)
8578 {
8579 if (context->getShader(program))
8580 {
8581 return gl::error(GL_INVALID_OPERATION);
8582 }
8583 else
8584 {
8585 return gl::error(GL_INVALID_VALUE);
8586 }
8587 }
8588
8589 switch (pname)
8590 {
8591 case GL_UNIFORM_TYPE:
8592 case GL_UNIFORM_SIZE:
8593 case GL_UNIFORM_NAME_LENGTH:
8594 case GL_UNIFORM_BLOCK_INDEX:
8595 case GL_UNIFORM_OFFSET:
8596 case GL_UNIFORM_ARRAY_STRIDE:
8597 case GL_UNIFORM_MATRIX_STRIDE:
8598 case GL_UNIFORM_IS_ROW_MAJOR:
8599 break;
8600 default:
8601 return gl::error(GL_INVALID_ENUM);
8602 }
8603
8604 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
8605
8606 if (!programBinary && uniformCount > 0)
8607 {
8608 return gl::error(GL_INVALID_VALUE);
8609 }
8610
8611 for (int uniformId = 0; uniformId < uniformCount; uniformId++)
8612 {
8613 const GLuint index = uniformIndices[uniformId];
8614
8615 if (index >= (GLuint)programBinary->getActiveUniformCount())
8616 {
8617 return gl::error(GL_INVALID_VALUE);
8618 }
8619 }
8620
8621 for (int uniformId = 0; uniformId < uniformCount; uniformId++)
8622 {
8623 const GLuint index = uniformIndices[uniformId];
8624 params[uniformId] = programBinary->getActiveUniformi(index, pname);
8625 }
8626 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008627 }
8628 catch(std::bad_alloc&)
8629 {
8630 return gl::error(GL_OUT_OF_MEMORY);
8631 }
8632}
8633
8634GLuint __stdcall glGetUniformBlockIndex(GLuint program, const GLchar* uniformBlockName)
8635{
8636 EVENT("(GLuint program = %u, const GLchar* uniformBlockName = 0x%0.8p)", program, uniformBlockName);
8637
8638 try
8639 {
8640 gl::Context *context = gl::getNonLostContext();
8641
8642 if (context)
8643 {
8644 if (context->getClientVersion() < 3)
8645 {
shannonwoods@chromium.org42766252013-05-30 00:07:12 +00008646 return gl::error(GL_INVALID_OPERATION, GL_INVALID_INDEX);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008647 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008648
shannonwoods@chromium.org42766252013-05-30 00:07:12 +00008649 gl::Program *programObject = context->getProgram(program);
8650
8651 if (!programObject)
8652 {
8653 if (context->getShader(program))
8654 {
8655 return gl::error(GL_INVALID_OPERATION, GL_INVALID_INDEX);
8656 }
8657 else
8658 {
8659 return gl::error(GL_INVALID_VALUE, GL_INVALID_INDEX);
8660 }
8661 }
8662
8663 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
8664 if (!programBinary)
8665 {
8666 return GL_INVALID_INDEX;
8667 }
8668
8669 return programBinary->getUniformBlockIndex(uniformBlockName);
8670 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008671 }
8672 catch(std::bad_alloc&)
8673 {
8674 return gl::error(GL_OUT_OF_MEMORY, 0);
8675 }
8676
8677 return 0;
8678}
8679
8680void __stdcall glGetActiveUniformBlockiv(GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint* params)
8681{
8682 EVENT("(GLuint program = %u, GLuint uniformBlockIndex = %u, GLenum pname = 0x%X, GLint* params = 0x%0.8p)",
8683 program, uniformBlockIndex, pname, params);
8684
8685 try
8686 {
8687 gl::Context *context = gl::getNonLostContext();
8688
8689 if (context)
8690 {
8691 if (context->getClientVersion() < 3)
8692 {
8693 return gl::error(GL_INVALID_OPERATION);
8694 }
shannonwoods@chromium.orge7317ca2013-05-30 00:07:35 +00008695 gl::Program *programObject = context->getProgram(program);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008696
shannonwoods@chromium.orge7317ca2013-05-30 00:07:35 +00008697 if (!programObject)
8698 {
8699 if (context->getShader(program))
8700 {
8701 return gl::error(GL_INVALID_OPERATION);
8702 }
8703 else
8704 {
8705 return gl::error(GL_INVALID_VALUE);
8706 }
8707 }
8708
8709 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
8710
8711 if (!programBinary || uniformBlockIndex >= programBinary->getActiveUniformBlockCount())
8712 {
8713 return gl::error(GL_INVALID_VALUE);
8714 }
8715
8716 switch (pname)
8717 {
8718 case GL_UNIFORM_BLOCK_BINDING:
8719 *params = static_cast<GLint>(programObject->getUniformBlockBinding(uniformBlockIndex));
8720 break;
8721
8722 case GL_UNIFORM_BLOCK_DATA_SIZE:
8723 case GL_UNIFORM_BLOCK_NAME_LENGTH:
8724 case GL_UNIFORM_BLOCK_ACTIVE_UNIFORMS:
8725 case GL_UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES:
8726 case GL_UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER:
8727 case GL_UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER:
8728 programBinary->getActiveUniformBlockiv(uniformBlockIndex, pname, params);
8729 break;
8730
8731 default:
8732 return gl::error(GL_INVALID_ENUM);
8733 }
8734 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008735 }
8736 catch(std::bad_alloc&)
8737 {
8738 return gl::error(GL_OUT_OF_MEMORY);
8739 }
8740}
8741
8742void __stdcall glGetActiveUniformBlockName(GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei* length, GLchar* uniformBlockName)
8743{
8744 EVENT("(GLuint program = %u, GLuint uniformBlockIndex = %u, GLsizei bufSize = %d, GLsizei* length = 0x%0.8p, GLchar* uniformBlockName = 0x%0.8p)",
8745 program, uniformBlockIndex, bufSize, length, uniformBlockName);
8746
8747 try
8748 {
8749 gl::Context *context = gl::getNonLostContext();
8750
8751 if (context)
8752 {
8753 if (context->getClientVersion() < 3)
8754 {
8755 return gl::error(GL_INVALID_OPERATION);
8756 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008757
shannonwoods@chromium.orgbeb02782013-05-30 00:07:28 +00008758 gl::Program *programObject = context->getProgram(program);
8759
8760 if (!programObject)
8761 {
8762 if (context->getShader(program))
8763 {
8764 return gl::error(GL_INVALID_OPERATION);
8765 }
8766 else
8767 {
8768 return gl::error(GL_INVALID_VALUE);
8769 }
8770 }
8771
8772 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
8773
8774 if (!programBinary || uniformBlockIndex >= programBinary->getActiveUniformBlockCount())
8775 {
8776 return gl::error(GL_INVALID_VALUE);
8777 }
8778
8779 programBinary->getActiveUniformBlockName(uniformBlockIndex, bufSize, length, uniformBlockName);
8780 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008781 }
8782 catch(std::bad_alloc&)
8783 {
8784 return gl::error(GL_OUT_OF_MEMORY);
8785 }
8786}
8787
8788void __stdcall glUniformBlockBinding(GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding)
8789{
8790 EVENT("(GLuint program = %u, GLuint uniformBlockIndex = %u, GLuint uniformBlockBinding = %u)",
8791 program, uniformBlockIndex, uniformBlockBinding);
8792
8793 try
8794 {
8795 gl::Context *context = gl::getNonLostContext();
8796
8797 if (context)
8798 {
8799 if (context->getClientVersion() < 3)
8800 {
8801 return gl::error(GL_INVALID_OPERATION);
8802 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008803
shannonwoods@chromium.org70eb1ea2013-05-30 00:07:20 +00008804 if (uniformBlockBinding >= context->getMaximumCombinedUniformBufferBindings())
8805 {
8806 return gl::error(GL_INVALID_VALUE);
8807 }
8808
8809 gl::Program *programObject = context->getProgram(program);
8810
8811 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 never linked, there won't be any uniform blocks
8826 if (!programBinary || uniformBlockIndex >= programBinary->getActiveUniformBlockCount())
8827 {
8828 return gl::error(GL_INVALID_VALUE);
8829 }
8830
8831 programObject->bindUniformBlock(uniformBlockIndex, uniformBlockBinding);
8832 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008833 }
8834 catch(std::bad_alloc&)
8835 {
8836 return gl::error(GL_OUT_OF_MEMORY);
8837 }
8838}
8839
8840void __stdcall glDrawArraysInstanced(GLenum mode, GLint first, GLsizei count, GLsizei instanceCount)
8841{
8842 EVENT("(GLenum mode = 0x%X, GLint first = %d, GLsizei count = %d, GLsizei instanceCount = %d)",
8843 mode, first, count, instanceCount);
8844
8845 try
8846 {
8847 gl::Context *context = gl::getNonLostContext();
8848
8849 if (context)
8850 {
8851 if (context->getClientVersion() < 3)
8852 {
8853 return gl::error(GL_INVALID_OPERATION);
8854 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008855
Jamie Madill54133512013-06-21 09:33:07 -04008856 // glDrawArraysInstanced
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008857 UNIMPLEMENTED();
8858 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008859 }
8860 catch(std::bad_alloc&)
8861 {
8862 return gl::error(GL_OUT_OF_MEMORY);
8863 }
8864}
8865
8866void __stdcall glDrawElementsInstanced(GLenum mode, GLsizei count, GLenum type, const GLvoid* indices, GLsizei instanceCount)
8867{
8868 EVENT("(GLenum mode = 0x%X, GLsizei count = %d, GLenum type = 0x%X, const GLvoid* indices = 0x%0.8p, GLsizei instanceCount = %d)",
8869 mode, count, type, indices, instanceCount);
8870
8871 try
8872 {
8873 gl::Context *context = gl::getNonLostContext();
8874
8875 if (context)
8876 {
8877 if (context->getClientVersion() < 3)
8878 {
8879 return gl::error(GL_INVALID_OPERATION);
8880 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008881
Jamie Madill54133512013-06-21 09:33:07 -04008882 // glDrawElementsInstanced
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008883 UNIMPLEMENTED();
8884 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008885 }
8886 catch(std::bad_alloc&)
8887 {
8888 return gl::error(GL_OUT_OF_MEMORY);
8889 }
8890}
8891
8892GLsync __stdcall glFenceSync(GLenum condition, GLbitfield flags)
8893{
8894 EVENT("(GLenum condition = 0x%X, GLbitfield flags = 0x%X)", condition, flags);
8895
8896 try
8897 {
8898 gl::Context *context = gl::getNonLostContext();
8899
8900 if (context)
8901 {
8902 if (context->getClientVersion() < 3)
8903 {
Jamie Madill5215e1a2013-07-26 11:55:19 -04008904 return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLsync>(0));
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008905 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008906
Jamie Madill5215e1a2013-07-26 11:55:19 -04008907 if (condition != GL_SYNC_GPU_COMMANDS_COMPLETE)
8908 {
8909 return gl::error(GL_INVALID_ENUM, reinterpret_cast<GLsync>(0));
8910 }
8911
8912 if (flags != 0)
8913 {
8914 return gl::error(GL_INVALID_VALUE, reinterpret_cast<GLsync>(0));
8915 }
8916
8917 return context->createFenceSync(condition);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008918 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008919 }
8920 catch(std::bad_alloc&)
8921 {
8922 return gl::error(GL_OUT_OF_MEMORY, reinterpret_cast<GLsync>(NULL));
8923 }
8924
8925 return NULL;
8926}
8927
8928GLboolean __stdcall glIsSync(GLsync sync)
8929{
8930 EVENT("(GLsync sync = 0x%0.8p)", sync);
8931
8932 try
8933 {
8934 gl::Context *context = gl::getNonLostContext();
8935
8936 if (context)
8937 {
8938 if (context->getClientVersion() < 3)
8939 {
8940 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
8941 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008942
Jamie Madill5215e1a2013-07-26 11:55:19 -04008943 return (context->getFenceSync(sync) != NULL);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008944 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008945 }
8946 catch(std::bad_alloc&)
8947 {
8948 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
8949 }
8950
8951 return GL_FALSE;
8952}
8953
8954void __stdcall glDeleteSync(GLsync sync)
8955{
8956 EVENT("(GLsync sync = 0x%0.8p)", sync);
8957
8958 try
8959 {
8960 gl::Context *context = gl::getNonLostContext();
8961
8962 if (context)
8963 {
8964 if (context->getClientVersion() < 3)
8965 {
8966 return gl::error(GL_INVALID_OPERATION);
8967 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008968
Jamie Madill5215e1a2013-07-26 11:55:19 -04008969 if (sync != static_cast<GLsync>(0) && !context->getFenceSync(sync))
8970 {
8971 return gl::error(GL_INVALID_VALUE);
8972 }
8973
8974 context->deleteFenceSync(sync);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008975 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008976 }
8977 catch(std::bad_alloc&)
8978 {
8979 return gl::error(GL_OUT_OF_MEMORY);
8980 }
8981}
8982
8983GLenum __stdcall glClientWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout)
8984{
8985 EVENT("(GLsync sync = 0x%0.8p, GLbitfield flags = 0x%X, GLuint64 timeout = %llu)",
8986 sync, flags, timeout);
8987
8988 try
8989 {
8990 gl::Context *context = gl::getNonLostContext();
8991
8992 if (context)
8993 {
8994 if (context->getClientVersion() < 3)
8995 {
Jamie Madill5215e1a2013-07-26 11:55:19 -04008996 return gl::error(GL_INVALID_OPERATION, GL_WAIT_FAILED);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008997 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008998
Jamie Madill5215e1a2013-07-26 11:55:19 -04008999 if ((flags & ~(GL_SYNC_FLUSH_COMMANDS_BIT)) != 0)
9000 {
9001 return gl::error(GL_INVALID_VALUE, GL_WAIT_FAILED);
9002 }
9003
9004 gl::FenceSync *fenceSync = context->getFenceSync(sync);
9005
9006 if (!fenceSync)
9007 {
9008 return gl::error(GL_INVALID_VALUE, GL_WAIT_FAILED);
9009 }
9010
9011 return fenceSync->clientWait(flags, timeout);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009012 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009013 }
9014 catch(std::bad_alloc&)
9015 {
9016 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
9017 }
9018
9019 return GL_FALSE;
9020}
9021
9022void __stdcall glWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout)
9023{
9024 EVENT("(GLsync sync = 0x%0.8p, GLbitfield flags = 0x%X, GLuint64 timeout = %llu)",
9025 sync, flags, timeout);
9026
9027 try
9028 {
9029 gl::Context *context = gl::getNonLostContext();
9030
9031 if (context)
9032 {
9033 if (context->getClientVersion() < 3)
9034 {
9035 return gl::error(GL_INVALID_OPERATION);
9036 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009037
Jamie Madill5215e1a2013-07-26 11:55:19 -04009038 if (flags != 0)
9039 {
9040 return gl::error(GL_INVALID_VALUE);
9041 }
9042
9043 if (timeout != GL_TIMEOUT_IGNORED)
9044 {
9045 return gl::error(GL_INVALID_VALUE);
9046 }
9047
9048 gl::FenceSync *fenceSync = context->getFenceSync(sync);
9049
9050 if (!fenceSync)
9051 {
9052 return gl::error(GL_INVALID_VALUE);
9053 }
9054
9055 fenceSync->serverWait();
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009056 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009057 }
9058 catch(std::bad_alloc&)
9059 {
9060 return gl::error(GL_OUT_OF_MEMORY);
9061 }
9062}
9063
9064void __stdcall glGetInteger64v(GLenum pname, GLint64* params)
9065{
9066 EVENT("(GLenum pname = 0x%X, GLint64* params = 0x%0.8p)",
9067 pname, params);
9068
9069 try
9070 {
9071 gl::Context *context = gl::getNonLostContext();
9072
9073 if (context)
9074 {
9075 if (context->getClientVersion() < 3)
9076 {
9077 return gl::error(GL_INVALID_OPERATION);
9078 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009079
Jamie Madill79f2f452013-12-19 11:13:02 -05009080 GLenum nativeType;
9081 unsigned int numParams = 0;
9082 if (!context->getQueryParameterInfo(pname, &nativeType, &numParams))
9083 return gl::error(GL_INVALID_ENUM);
9084
9085 // pname is valid, but that there are no parameters to return.
9086 if (numParams == 0)
9087 return;
9088
9089 if (nativeType == GL_INT_64_ANGLEX)
Jamie Madill71fbd602013-07-19 16:36:55 -04009090 {
Jamie Madill79f2f452013-12-19 11:13:02 -05009091 context->getInteger64v(pname, params);
9092 }
Jamie Madill55856b12014-01-02 13:59:50 -05009093 else
Jamie Madill79f2f452013-12-19 11:13:02 -05009094 {
Jamie Madill55856b12014-01-02 13:59:50 -05009095 CastStateValues(context, nativeType, pname, numParams, params);
Jamie Madill71fbd602013-07-19 16:36:55 -04009096 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009097 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009098 }
9099 catch(std::bad_alloc&)
9100 {
9101 return gl::error(GL_OUT_OF_MEMORY);
9102 }
9103}
9104
9105void __stdcall glGetSynciv(GLsync sync, GLenum pname, GLsizei bufSize, GLsizei* length, GLint* values)
9106{
9107 EVENT("(GLsync sync = 0x%0.8p, GLenum pname = 0x%X, GLsizei bufSize = %d, GLsizei* length = 0x%0.8p, GLint* values = 0x%0.8p)",
9108 sync, pname, bufSize, length, values);
9109
9110 try
9111 {
9112 gl::Context *context = gl::getNonLostContext();
9113
9114 if (context)
9115 {
9116 if (context->getClientVersion() < 3)
9117 {
9118 return gl::error(GL_INVALID_OPERATION);
9119 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009120
Jamie Madill5215e1a2013-07-26 11:55:19 -04009121 if (bufSize < 0)
9122 {
9123 return gl::error(GL_INVALID_VALUE);
9124 }
9125
9126 gl::FenceSync *fenceSync = context->getFenceSync(sync);
9127
9128 if (!fenceSync)
9129 {
9130 return gl::error(GL_INVALID_VALUE);
9131 }
9132
9133 switch (pname)
9134 {
9135 case GL_OBJECT_TYPE: values[0] = static_cast<GLint>(GL_SYNC_FENCE); break;
9136 case GL_SYNC_STATUS: values[0] = static_cast<GLint>(fenceSync->getStatus()); break;
9137 case GL_SYNC_CONDITION: values[0] = static_cast<GLint>(fenceSync->getCondition()); break;
9138 case GL_SYNC_FLAGS: values[0] = 0; break;
9139
9140 default:
9141 return gl::error(GL_INVALID_ENUM);
9142 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009143 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009144 }
9145 catch(std::bad_alloc&)
9146 {
9147 return gl::error(GL_OUT_OF_MEMORY);
9148 }
9149}
9150
9151void __stdcall glGetInteger64i_v(GLenum target, GLuint index, GLint64* data)
9152{
9153 EVENT("(GLenum target = 0x%X, GLuint index = %u, GLint64* data = 0x%0.8p)",
9154 target, index, data);
9155
9156 try
9157 {
9158 gl::Context *context = gl::getNonLostContext();
9159
9160 if (context)
9161 {
9162 if (context->getClientVersion() < 3)
9163 {
9164 return gl::error(GL_INVALID_OPERATION);
9165 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009166
Shannon Woods15934d52013-08-19 14:28:49 -04009167 switch (target)
9168 {
9169 case GL_TRANSFORM_FEEDBACK_BUFFER_START:
9170 case GL_TRANSFORM_FEEDBACK_BUFFER_SIZE:
9171 case GL_TRANSFORM_FEEDBACK_BUFFER_BINDING:
9172 if (index >= context->getMaxTransformFeedbackBufferBindings())
9173 return gl::error(GL_INVALID_VALUE);
9174 break;
9175 case GL_UNIFORM_BUFFER_START:
9176 case GL_UNIFORM_BUFFER_SIZE:
9177 case GL_UNIFORM_BUFFER_BINDING:
9178 if (index >= context->getMaximumCombinedUniformBufferBindings())
9179 return gl::error(GL_INVALID_VALUE);
9180 break;
9181 default:
9182 return gl::error(GL_INVALID_ENUM);
9183 }
9184
9185 if (!(context->getIndexedInteger64v(target, index, data)))
9186 {
9187 GLenum nativeType;
9188 unsigned int numParams = 0;
9189 if (!context->getIndexedQueryParameterInfo(target, &nativeType, &numParams))
9190 return gl::error(GL_INVALID_ENUM);
9191
9192 if (numParams == 0)
9193 return; // it is known that pname is valid, but there are no parameters to return
9194
9195 if (nativeType == GL_INT)
9196 {
9197 GLint *intParams = new GLint[numParams];
9198
9199 context->getIndexedIntegerv(target, index, intParams);
9200
9201 for (unsigned int i = 0; i < numParams; ++i)
9202 {
9203 data[i] = static_cast<GLint64>(intParams[i]);
9204 }
9205
9206 delete [] intParams;
9207 }
9208 else
9209 {
9210 UNREACHABLE();
9211 }
9212 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009213 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009214 }
9215 catch(std::bad_alloc&)
9216 {
9217 return gl::error(GL_OUT_OF_MEMORY);
9218 }
9219}
9220
9221void __stdcall glGetBufferParameteri64v(GLenum target, GLenum pname, GLint64* params)
9222{
9223 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLint64* params = 0x%0.8p)",
9224 target, pname, params);
9225
9226 try
9227 {
9228 gl::Context *context = gl::getNonLostContext();
9229
9230 if (context)
9231 {
9232 if (context->getClientVersion() < 3)
9233 {
9234 return gl::error(GL_INVALID_OPERATION);
9235 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009236
Jamie Madill54133512013-06-21 09:33:07 -04009237 // glGetBufferParameteri64v
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009238 UNIMPLEMENTED();
9239 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009240 }
9241 catch(std::bad_alloc&)
9242 {
9243 return gl::error(GL_OUT_OF_MEMORY);
9244 }
9245}
9246
9247void __stdcall glGenSamplers(GLsizei count, GLuint* samplers)
9248{
9249 EVENT("(GLsizei count = %d, GLuint* samplers = 0x%0.8p)", count, samplers);
9250
9251 try
9252 {
9253 gl::Context *context = gl::getNonLostContext();
9254
9255 if (context)
9256 {
9257 if (context->getClientVersion() < 3)
9258 {
9259 return gl::error(GL_INVALID_OPERATION);
9260 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009261
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009262 if (count < 0)
9263 {
9264 return gl::error(GL_INVALID_VALUE);
9265 }
9266
9267 for (int i = 0; i < count; i++)
9268 {
9269 samplers[i] = context->createSampler();
9270 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009271 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009272 }
9273 catch(std::bad_alloc&)
9274 {
9275 return gl::error(GL_OUT_OF_MEMORY);
9276 }
9277}
9278
9279void __stdcall glDeleteSamplers(GLsizei count, const GLuint* samplers)
9280{
9281 EVENT("(GLsizei count = %d, const GLuint* samplers = 0x%0.8p)", count, samplers);
9282
9283 try
9284 {
9285 gl::Context *context = gl::getNonLostContext();
9286
9287 if (context)
9288 {
9289 if (context->getClientVersion() < 3)
9290 {
9291 return gl::error(GL_INVALID_OPERATION);
9292 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009293
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009294 if (count < 0)
9295 {
9296 return gl::error(GL_INVALID_VALUE);
9297 }
9298
9299 for (int i = 0; i < count; i++)
9300 {
9301 context->deleteSampler(samplers[i]);
9302 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009303 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009304 }
9305 catch(std::bad_alloc&)
9306 {
9307 return gl::error(GL_OUT_OF_MEMORY);
9308 }
9309}
9310
9311GLboolean __stdcall glIsSampler(GLuint sampler)
9312{
9313 EVENT("(GLuint sampler = %u)", sampler);
9314
9315 try
9316 {
9317 gl::Context *context = gl::getNonLostContext();
9318
9319 if (context)
9320 {
9321 if (context->getClientVersion() < 3)
9322 {
9323 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
9324 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009325
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009326 return context->isSampler(sampler);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009327 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009328 }
9329 catch(std::bad_alloc&)
9330 {
9331 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
9332 }
9333
9334 return GL_FALSE;
9335}
9336
9337void __stdcall glBindSampler(GLuint unit, GLuint sampler)
9338{
9339 EVENT("(GLuint unit = %u, GLuint sampler = %u)", unit, sampler);
9340
9341 try
9342 {
9343 gl::Context *context = gl::getNonLostContext();
9344
9345 if (context)
9346 {
9347 if (context->getClientVersion() < 3)
9348 {
9349 return gl::error(GL_INVALID_OPERATION);
9350 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009351
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009352 if (sampler != 0 && !context->isSampler(sampler))
9353 {
9354 return gl::error(GL_INVALID_OPERATION);
9355 }
9356
9357 if (unit >= context->getMaximumCombinedTextureImageUnits())
9358 {
9359 return gl::error(GL_INVALID_VALUE);
9360 }
9361
9362 context->bindSampler(unit, sampler);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009363 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009364 }
9365 catch(std::bad_alloc&)
9366 {
9367 return gl::error(GL_OUT_OF_MEMORY);
9368 }
9369}
9370
9371void __stdcall glSamplerParameteri(GLuint sampler, GLenum pname, GLint param)
9372{
9373 EVENT("(GLuint sampler = %u, GLenum pname = 0x%X, GLint param = %d)", sampler, pname, param);
9374
9375 try
9376 {
9377 gl::Context *context = gl::getNonLostContext();
9378
9379 if (context)
9380 {
9381 if (context->getClientVersion() < 3)
9382 {
9383 return gl::error(GL_INVALID_OPERATION);
9384 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009385
Geoff Lang34dbb6f2013-08-05 15:05:47 -04009386 if (!gl::ValidateSamplerObjectParameter(pname))
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009387 {
9388 return;
9389 }
9390
Geoff Lang34dbb6f2013-08-05 15:05:47 -04009391 if (!gl::ValidateTexParamParameters(context, pname, param))
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009392 {
9393 return;
9394 }
9395
9396 if (!context->isSampler(sampler))
9397 {
9398 return gl::error(GL_INVALID_OPERATION);
9399 }
9400
9401 context->samplerParameteri(sampler, pname, param);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009402 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009403 }
9404 catch(std::bad_alloc&)
9405 {
9406 return gl::error(GL_OUT_OF_MEMORY);
9407 }
9408}
9409
9410void __stdcall glSamplerParameteriv(GLuint sampler, GLenum pname, const GLint* param)
9411{
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009412 glSamplerParameteri(sampler, pname, *param);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009413}
9414
9415void __stdcall glSamplerParameterf(GLuint sampler, GLenum pname, GLfloat param)
9416{
9417 EVENT("(GLuint sampler = %u, GLenum pname = 0x%X, GLfloat param = %g)", sampler, pname, param);
9418
9419 try
9420 {
9421 gl::Context *context = gl::getNonLostContext();
9422
9423 if (context)
9424 {
9425 if (context->getClientVersion() < 3)
9426 {
9427 return gl::error(GL_INVALID_OPERATION);
9428 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009429
Geoff Lang34dbb6f2013-08-05 15:05:47 -04009430 if (!gl::ValidateSamplerObjectParameter(pname))
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009431 {
9432 return;
9433 }
9434
Geoff Lang34dbb6f2013-08-05 15:05:47 -04009435 if (!gl::ValidateTexParamParameters(context, pname, static_cast<GLint>(param)))
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009436 {
9437 return;
9438 }
9439
9440 if (!context->isSampler(sampler))
9441 {
9442 return gl::error(GL_INVALID_OPERATION);
9443 }
9444
9445 context->samplerParameterf(sampler, pname, param);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009446 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009447 }
9448 catch(std::bad_alloc&)
9449 {
9450 return gl::error(GL_OUT_OF_MEMORY);
9451 }
9452}
9453
9454void __stdcall glSamplerParameterfv(GLuint sampler, GLenum pname, const GLfloat* param)
9455{
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009456 glSamplerParameterf(sampler, pname, *param);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009457}
9458
9459void __stdcall glGetSamplerParameteriv(GLuint sampler, GLenum pname, GLint* params)
9460{
9461 EVENT("(GLuint sampler = %u, GLenum pname = 0x%X, GLint* params = 0x%0.8p)", sampler, pname, params);
9462
9463 try
9464 {
9465 gl::Context *context = gl::getNonLostContext();
9466
9467 if (context)
9468 {
9469 if (context->getClientVersion() < 3)
9470 {
9471 return gl::error(GL_INVALID_OPERATION);
9472 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009473
Geoff Lang34dbb6f2013-08-05 15:05:47 -04009474 if (!gl::ValidateSamplerObjectParameter(pname))
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009475 {
9476 return;
9477 }
9478
9479 if (!context->isSampler(sampler))
9480 {
9481 return gl::error(GL_INVALID_OPERATION);
9482 }
9483
9484 *params = context->getSamplerParameteri(sampler, pname);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009485 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009486 }
9487 catch(std::bad_alloc&)
9488 {
9489 return gl::error(GL_OUT_OF_MEMORY);
9490 }
9491}
9492
9493void __stdcall glGetSamplerParameterfv(GLuint sampler, GLenum pname, GLfloat* params)
9494{
9495 EVENT("(GLuint sample = %ur, GLenum pname = 0x%X, GLfloat* params = 0x%0.8p)", sampler, pname, params);
9496
9497 try
9498 {
9499 gl::Context *context = gl::getNonLostContext();
9500
9501 if (context)
9502 {
9503 if (context->getClientVersion() < 3)
9504 {
9505 return gl::error(GL_INVALID_OPERATION);
9506 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009507
Geoff Lang34dbb6f2013-08-05 15:05:47 -04009508 if (!gl::ValidateSamplerObjectParameter(pname))
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009509 {
9510 return;
9511 }
9512
9513 if (!context->isSampler(sampler))
9514 {
9515 return gl::error(GL_INVALID_OPERATION);
9516 }
9517
9518 *params = context->getSamplerParameterf(sampler, pname);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009519 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009520 }
9521 catch(std::bad_alloc&)
9522 {
9523 return gl::error(GL_OUT_OF_MEMORY);
9524 }
9525}
9526
9527void __stdcall glVertexAttribDivisor(GLuint index, GLuint divisor)
9528{
9529 EVENT("(GLuint index = %u, GLuint divisor = %u)", index, divisor);
9530
9531 try
9532 {
shannon.woods%transgaming.com@gtempaccount.com8736bd62013-04-13 03:35:41 +00009533 if (index >= gl::MAX_VERTEX_ATTRIBS)
9534 {
9535 return gl::error(GL_INVALID_VALUE);
9536 }
9537
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009538 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
shannon.woods%transgaming.com@gtempaccount.com8736bd62013-04-13 03:35:41 +00009547 context->setVertexAttribDivisor(index, divisor);
9548 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009549 }
9550 catch(std::bad_alloc&)
9551 {
9552 return gl::error(GL_OUT_OF_MEMORY);
9553 }
9554}
9555
9556void __stdcall glBindTransformFeedback(GLenum target, GLuint id)
9557{
9558 EVENT("(GLenum target = 0x%X, GLuint id = %u)", target, id);
9559
9560 try
9561 {
9562 gl::Context *context = gl::getNonLostContext();
9563
9564 if (context)
9565 {
9566 if (context->getClientVersion() < 3)
9567 {
9568 return gl::error(GL_INVALID_OPERATION);
9569 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009570
Geoff Langc8058452014-02-03 12:04:11 -05009571 switch (target)
9572 {
9573 case GL_TRANSFORM_FEEDBACK:
9574 {
9575 // Cannot bind a transform feedback object if the current one is started and not paused (3.0.2 pg 85 section 2.14.1)
9576 gl::TransformFeedback *curTransformFeedback = context->getCurrentTransformFeedback();
9577 if (curTransformFeedback && curTransformFeedback->isStarted() && !curTransformFeedback->isPaused())
9578 {
9579 return gl::error(GL_INVALID_OPERATION);
9580 }
9581
9582 // Cannot bind a transform feedback object that does not exist (3.0.2 pg 85 section 2.14.1)
9583 if (context->getTransformFeedback(id) == NULL)
9584 {
9585 return gl::error(GL_INVALID_OPERATION);
9586 }
9587
9588 context->bindTransformFeedback(id);
9589 }
9590 break;
9591
9592 default:
9593 return gl::error(GL_INVALID_ENUM);
9594 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009595 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009596 }
9597 catch(std::bad_alloc&)
9598 {
9599 return gl::error(GL_OUT_OF_MEMORY);
9600 }
9601}
9602
9603void __stdcall glDeleteTransformFeedbacks(GLsizei n, const GLuint* ids)
9604{
9605 EVENT("(GLsizei n = %d, const GLuint* ids = 0x%0.8p)", n, ids);
9606
9607 try
9608 {
9609 gl::Context *context = gl::getNonLostContext();
9610
9611 if (context)
9612 {
9613 if (context->getClientVersion() < 3)
9614 {
9615 return gl::error(GL_INVALID_OPERATION);
9616 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009617
Geoff Langc8058452014-02-03 12:04:11 -05009618 for (int i = 0; i < n; i++)
9619 {
9620 context->deleteTransformFeedback(ids[i]);
9621 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009622 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009623 }
9624 catch(std::bad_alloc&)
9625 {
9626 return gl::error(GL_OUT_OF_MEMORY);
9627 }
9628}
9629
9630void __stdcall glGenTransformFeedbacks(GLsizei n, GLuint* ids)
9631{
9632 EVENT("(GLsizei n = %d, GLuint* ids = 0x%0.8p)", n, ids);
9633
9634 try
9635 {
9636 gl::Context *context = gl::getNonLostContext();
9637
9638 if (context)
9639 {
9640 if (context->getClientVersion() < 3)
9641 {
9642 return gl::error(GL_INVALID_OPERATION);
9643 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009644
Geoff Langc8058452014-02-03 12:04:11 -05009645 for (int i = 0; i < n; i++)
9646 {
9647 ids[i] = context->createTransformFeedback();
9648 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009649 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009650 }
9651 catch(std::bad_alloc&)
9652 {
9653 return gl::error(GL_OUT_OF_MEMORY);
9654 }
9655}
9656
9657GLboolean __stdcall glIsTransformFeedback(GLuint id)
9658{
9659 EVENT("(GLuint id = %u)", id);
9660
9661 try
9662 {
9663 gl::Context *context = gl::getNonLostContext();
9664
9665 if (context)
9666 {
9667 if (context->getClientVersion() < 3)
9668 {
9669 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
9670 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009671
Geoff Langc8058452014-02-03 12:04:11 -05009672 return ((context->getTransformFeedback(id) != NULL) ? GL_TRUE : GL_FALSE);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009673 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009674 }
9675 catch(std::bad_alloc&)
9676 {
9677 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
9678 }
9679
9680 return GL_FALSE;
9681}
9682
9683void __stdcall glPauseTransformFeedback(void)
9684{
9685 EVENT("(void)");
9686
9687 try
9688 {
9689 gl::Context *context = gl::getNonLostContext();
9690
9691 if (context)
9692 {
9693 if (context->getClientVersion() < 3)
9694 {
9695 return gl::error(GL_INVALID_OPERATION);
9696 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009697
Geoff Langc8058452014-02-03 12:04:11 -05009698 gl::TransformFeedback *transformFeedback = context->getCurrentTransformFeedback();
9699 ASSERT(transformFeedback != NULL);
9700
9701 // Current transform feedback must be started and not paused in order to pause (3.0.2 pg 86)
9702 if (!transformFeedback->isStarted() || transformFeedback->isPaused())
9703 {
9704 return gl::error(GL_INVALID_OPERATION);
9705 }
9706
9707 transformFeedback->pause();
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009708 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009709 }
9710 catch(std::bad_alloc&)
9711 {
9712 return gl::error(GL_OUT_OF_MEMORY);
9713 }
9714}
9715
9716void __stdcall glResumeTransformFeedback(void)
9717{
9718 EVENT("(void)");
9719
9720 try
9721 {
9722 gl::Context *context = gl::getNonLostContext();
9723
9724 if (context)
9725 {
9726 if (context->getClientVersion() < 3)
9727 {
9728 return gl::error(GL_INVALID_OPERATION);
9729 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009730
Geoff Langc8058452014-02-03 12:04:11 -05009731 gl::TransformFeedback *transformFeedback = context->getCurrentTransformFeedback();
9732 ASSERT(transformFeedback != NULL);
9733
9734 // Current transform feedback must be started and paused in order to resume (3.0.2 pg 86)
9735 if (!transformFeedback->isStarted() || !transformFeedback->isPaused())
9736 {
9737 return gl::error(GL_INVALID_OPERATION);
9738 }
9739
9740 transformFeedback->resume();
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009741 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009742 }
9743 catch(std::bad_alloc&)
9744 {
9745 return gl::error(GL_OUT_OF_MEMORY);
9746 }
9747}
9748
9749void __stdcall glGetProgramBinary(GLuint program, GLsizei bufSize, GLsizei* length, GLenum* binaryFormat, GLvoid* binary)
9750{
9751 EVENT("(GLuint program = %u, GLsizei bufSize = %d, GLsizei* length = 0x%0.8p, GLenum* binaryFormat = 0x%0.8p, GLvoid* binary = 0x%0.8p)",
9752 program, bufSize, length, binaryFormat, binary);
9753
9754 try
9755 {
9756 gl::Context *context = gl::getNonLostContext();
9757
9758 if (context)
9759 {
9760 if (context->getClientVersion() < 3)
9761 {
9762 return gl::error(GL_INVALID_OPERATION);
9763 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009764
Jamie Madill54133512013-06-21 09:33:07 -04009765 // glGetProgramBinary
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009766 UNIMPLEMENTED();
9767 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009768 }
9769 catch(std::bad_alloc&)
9770 {
9771 return gl::error(GL_OUT_OF_MEMORY);
9772 }
9773}
9774
9775void __stdcall glProgramBinary(GLuint program, GLenum binaryFormat, const GLvoid* binary, GLsizei length)
9776{
9777 EVENT("(GLuint program = %u, GLenum binaryFormat = 0x%X, const GLvoid* binary = 0x%0.8p, GLsizei length = %d)",
9778 program, binaryFormat, binary, length);
9779
9780 try
9781 {
9782 gl::Context *context = gl::getNonLostContext();
9783
9784 if (context)
9785 {
9786 if (context->getClientVersion() < 3)
9787 {
9788 return gl::error(GL_INVALID_OPERATION);
9789 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009790
Jamie Madill54133512013-06-21 09:33:07 -04009791 // glProgramBinary
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009792 UNIMPLEMENTED();
9793 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009794 }
9795 catch(std::bad_alloc&)
9796 {
9797 return gl::error(GL_OUT_OF_MEMORY);
9798 }
9799}
9800
9801void __stdcall glProgramParameteri(GLuint program, GLenum pname, GLint value)
9802{
9803 EVENT("(GLuint program = %u, GLenum pname = 0x%X, GLint value = %d)",
9804 program, pname, value);
9805
9806 try
9807 {
9808 gl::Context *context = gl::getNonLostContext();
9809
9810 if (context)
9811 {
9812 if (context->getClientVersion() < 3)
9813 {
9814 return gl::error(GL_INVALID_OPERATION);
9815 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009816
Jamie Madill54133512013-06-21 09:33:07 -04009817 // glProgramParameteri
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009818 UNIMPLEMENTED();
9819 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009820 }
9821 catch(std::bad_alloc&)
9822 {
9823 return gl::error(GL_OUT_OF_MEMORY);
9824 }
9825}
9826
9827void __stdcall glInvalidateFramebuffer(GLenum target, GLsizei numAttachments, const GLenum* attachments)
9828{
9829 EVENT("(GLenum target = 0x%X, GLsizei numAttachments = %d, const GLenum* attachments = 0x%0.8p)",
9830 target, numAttachments, attachments);
9831
9832 try
9833 {
9834 gl::Context *context = gl::getNonLostContext();
9835
9836 if (context)
9837 {
9838 if (context->getClientVersion() < 3)
9839 {
9840 return gl::error(GL_INVALID_OPERATION);
9841 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009842
Geoff Lang34dbb6f2013-08-05 15:05:47 -04009843 if (!ValidateInvalidateFramebufferParameters(context, target, numAttachments, attachments))
shannonwoods@chromium.orgd63ef892013-05-30 00:10:56 +00009844 {
9845 return;
9846 }
9847
9848 int maxDimension = context->getMaximumRenderbufferDimension();
9849 context->invalidateFrameBuffer(target, numAttachments, attachments, 0, 0, maxDimension, maxDimension);
9850 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009851 }
9852 catch(std::bad_alloc&)
9853 {
9854 return gl::error(GL_OUT_OF_MEMORY);
9855 }
9856}
9857
9858void __stdcall glInvalidateSubFramebuffer(GLenum target, GLsizei numAttachments, const GLenum* attachments, GLint x, GLint y, GLsizei width, GLsizei height)
9859{
9860 EVENT("(GLenum target = 0x%X, GLsizei numAttachments = %d, const GLenum* attachments = 0x%0.8p, GLint x = %d, "
9861 "GLint y = %d, GLsizei width = %d, GLsizei height = %d)",
9862 target, numAttachments, attachments, x, y, width, height);
9863
9864 try
9865 {
9866 gl::Context *context = gl::getNonLostContext();
9867
9868 if (context)
9869 {
9870 if (context->getClientVersion() < 3)
9871 {
9872 return gl::error(GL_INVALID_OPERATION);
9873 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009874
Geoff Lang34dbb6f2013-08-05 15:05:47 -04009875 if (!ValidateInvalidateFramebufferParameters(context, target, numAttachments, attachments))
shannonwoods@chromium.orgd63ef892013-05-30 00:10:56 +00009876 {
9877 return;
9878 }
9879
9880 context->invalidateFrameBuffer(target, numAttachments, attachments, x, y, width, height);
9881 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009882 }
9883 catch(std::bad_alloc&)
9884 {
9885 return gl::error(GL_OUT_OF_MEMORY);
9886 }
9887}
9888
9889void __stdcall glTexStorage2D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height)
9890{
9891 EVENT("(GLenum target = 0x%X, GLsizei levels = %d, GLenum internalformat = 0x%X, GLsizei width = %d, GLsizei height = %d)",
9892 target, levels, internalformat, width, height);
9893
9894 try
9895 {
9896 gl::Context *context = gl::getNonLostContext();
9897
9898 if (context)
9899 {
9900 if (context->getClientVersion() < 3)
9901 {
9902 return gl::error(GL_INVALID_OPERATION);
9903 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009904
Geoff Lang34dbb6f2013-08-05 15:05:47 -04009905 if (!ValidateES3TexStorageParameters(context, target, levels, internalformat, width, height, 1))
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00009906 {
9907 return;
9908 }
9909
9910 switch (target)
9911 {
9912 case GL_TEXTURE_2D:
9913 {
9914 gl::Texture2D *texture2d = context->getTexture2D();
9915 texture2d->storage(levels, internalformat, width, height);
9916 }
9917 break;
9918
Geoff Lang01c21d22013-09-24 11:52:16 -04009919 case GL_TEXTURE_CUBE_MAP:
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00009920 {
9921 gl::TextureCubeMap *textureCube = context->getTextureCubeMap();
9922 textureCube->storage(levels, internalformat, width);
9923 }
9924 break;
9925
9926 default:
9927 return gl::error(GL_INVALID_ENUM);
9928 }
9929 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009930 }
9931 catch(std::bad_alloc&)
9932 {
9933 return gl::error(GL_OUT_OF_MEMORY);
9934 }
9935}
9936
9937void __stdcall glTexStorage3D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth)
9938{
9939 EVENT("(GLenum target = 0x%X, GLsizei levels = %d, GLenum internalformat = 0x%X, GLsizei width = %d, "
9940 "GLsizei height = %d, GLsizei depth = %d)",
9941 target, levels, internalformat, width, height, depth);
9942
9943 try
9944 {
9945 gl::Context *context = gl::getNonLostContext();
9946
9947 if (context)
9948 {
9949 if (context->getClientVersion() < 3)
9950 {
9951 return gl::error(GL_INVALID_OPERATION);
9952 }
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00009953
Geoff Lang34dbb6f2013-08-05 15:05:47 -04009954 if (!ValidateES3TexStorageParameters(context, target, levels, internalformat, width, height, depth))
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00009955 {
9956 return;
9957 }
9958
9959 switch (target)
9960 {
9961 case GL_TEXTURE_3D:
9962 {
9963 gl::Texture3D *texture3d = context->getTexture3D();
9964 texture3d->storage(levels, internalformat, width, height, depth);
9965 }
9966 break;
9967
9968 case GL_TEXTURE_2D_ARRAY:
9969 {
9970 gl::Texture2DArray *texture2darray = context->getTexture2DArray();
9971 texture2darray->storage(levels, internalformat, width, height, depth);
9972 }
9973 break;
9974
9975 default:
Geoff Lang01c21d22013-09-24 11:52:16 -04009976 UNREACHABLE();
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00009977 }
shannon.woods%transgaming.com@gtempaccount.com14eb55e2013-04-13 03:35:06 +00009978 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009979 }
9980 catch(std::bad_alloc&)
9981 {
9982 return gl::error(GL_OUT_OF_MEMORY);
9983 }
9984}
9985
9986void __stdcall glGetInternalformativ(GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize, GLint* params)
9987{
9988 EVENT("(GLenum target = 0x%X, GLenum internalformat = 0x%X, GLenum pname = 0x%X, GLsizei bufSize = %d, "
9989 "GLint* params = 0x%0.8p)",
9990 target, internalformat, pname, bufSize, params);
9991
9992 try
9993 {
9994 gl::Context *context = gl::getNonLostContext();
9995
9996 if (context)
9997 {
9998 if (context->getClientVersion() < 3)
9999 {
10000 return gl::error(GL_INVALID_OPERATION);
10001 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +000010002
Shannon Woods809d2502013-07-08 10:32:18 -040010003 if (!gl::IsColorRenderingSupported(internalformat, context) &&
10004 !gl::IsDepthRenderingSupported(internalformat, context) &&
10005 !gl::IsStencilRenderingSupported(internalformat, context))
10006 {
10007 return gl::error(GL_INVALID_ENUM);
10008 }
10009
10010 if (target != GL_RENDERBUFFER)
10011 {
10012 return gl::error(GL_INVALID_ENUM);
10013 }
10014
10015 if (bufSize < 0)
10016 {
10017 return gl::error(GL_INVALID_VALUE);
10018 }
10019
10020 switch (pname)
10021 {
10022 case GL_NUM_SAMPLE_COUNTS:
10023 if (bufSize != 0)
10024 *params = context->getNumSampleCounts(internalformat);
10025 break;
10026 case GL_SAMPLES:
10027 context->getSampleCounts(internalformat, bufSize, params);
10028 break;
10029 default:
10030 return gl::error(GL_INVALID_ENUM);
10031 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +000010032 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +000010033 }
10034 catch(std::bad_alloc&)
10035 {
10036 return gl::error(GL_OUT_OF_MEMORY);
10037 }
10038}
10039
10040// Extension functions
10041
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +000010042void __stdcall glBlitFramebufferANGLE(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1,
10043 GLbitfield mask, GLenum filter)
10044{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +000010045 EVENT("(GLint srcX0 = %d, GLint srcY0 = %d, GLint srcX1 = %d, GLint srcY1 = %d, "
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +000010046 "GLint dstX0 = %d, GLint dstY0 = %d, GLint dstX1 = %d, GLint dstY1 = %d, "
10047 "GLbitfield mask = 0x%X, GLenum filter = 0x%X)",
10048 srcX0, srcY0, srcX1, srcX1, dstX0, dstY0, dstX1, dstY1, mask, filter);
10049
10050 try
10051 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +000010052 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +000010053
10054 if (context)
10055 {
Geoff Lang34dbb6f2013-08-05 15:05:47 -040010056 if (!ValidateBlitFramebufferParameters(context, srcX0, srcY0, srcX1, srcY1,
Geoff Lang758d5b22013-06-11 11:42:50 -040010057 dstX0, dstY0, dstX1, dstY1, mask, filter,
10058 true))
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +000010059 {
Geoff Lang758d5b22013-06-11 11:42:50 -040010060 return;
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +000010061 }
10062
Geoff Lang758d5b22013-06-11 11:42:50 -040010063 context->blitFramebuffer(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1,
10064 mask, filter);
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +000010065 }
10066 }
10067 catch(std::bad_alloc&)
10068 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010069 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +000010070 }
10071}
10072
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +000010073void __stdcall glTexImage3DOES(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth,
10074 GLint border, GLenum format, GLenum type, const GLvoid* pixels)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000010075{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +000010076 EVENT("(GLenum target = 0x%X, GLint level = %d, GLenum internalformat = 0x%X, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +000010077 "GLsizei width = %d, GLsizei height = %d, GLsizei depth = %d, GLint border = %d, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +000010078 "GLenum format = 0x%X, GLenum type = 0x%x, const GLvoid* pixels = 0x%0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000010079 target, level, internalformat, width, height, depth, border, format, type, pixels);
10080
10081 try
10082 {
10083 UNIMPLEMENTED(); // FIXME
10084 }
10085 catch(std::bad_alloc&)
10086 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010087 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000010088 }
10089}
daniel@transgaming.comce3d0f22010-05-04 03:35:14 +000010090
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010091void __stdcall glGetProgramBinaryOES(GLuint program, GLsizei bufSize, GLsizei *length,
10092 GLenum *binaryFormat, void *binary)
10093{
apatrick@chromium.org90080e32012-07-09 22:15:33 +000010094 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 +000010095 program, bufSize, length, binaryFormat, binary);
10096
10097 try
10098 {
10099 gl::Context *context = gl::getNonLostContext();
10100
10101 if (context)
10102 {
10103 gl::Program *programObject = context->getProgram(program);
10104
daniel@transgaming.com716056c2012-07-24 18:38:59 +000010105 if (!programObject || !programObject->isLinked())
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010106 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010107 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010108 }
10109
10110 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
10111
10112 if (!programBinary)
10113 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010114 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010115 }
10116
apatrick@chromium.org90080e32012-07-09 22:15:33 +000010117 if (!programBinary->save(binary, bufSize, length))
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010118 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010119 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010120 }
apatrick@chromium.org90080e32012-07-09 22:15:33 +000010121
10122 *binaryFormat = GL_PROGRAM_BINARY_ANGLE;
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010123 }
10124 }
10125 catch(std::bad_alloc&)
10126 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010127 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010128 }
10129}
10130
10131void __stdcall glProgramBinaryOES(GLuint program, GLenum binaryFormat,
10132 const void *binary, GLint length)
10133{
10134 EVENT("(GLenum program = 0x%X, binaryFormat = 0x%x, binary = 0x%0.8p, length = %d)",
10135 program, binaryFormat, binary, length);
10136
10137 try
10138 {
10139 gl::Context *context = gl::getNonLostContext();
10140
10141 if (context)
10142 {
10143 if (binaryFormat != GL_PROGRAM_BINARY_ANGLE)
10144 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010145 return gl::error(GL_INVALID_ENUM);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010146 }
10147
10148 gl::Program *programObject = context->getProgram(program);
10149
10150 if (!programObject)
10151 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010152 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010153 }
10154
daniel@transgaming.com95d29422012-07-24 18:36:10 +000010155 context->setProgramBinary(program, binary, length);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010156 }
10157 }
10158 catch(std::bad_alloc&)
10159 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010160 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010161 }
10162}
10163
shannon.woods%transgaming.com@gtempaccount.com4059a382013-04-13 03:31:16 +000010164void __stdcall glDrawBuffersEXT(GLsizei n, const GLenum *bufs)
10165{
10166 EVENT("(GLenum n = %d, bufs = 0x%0.8p)", n, bufs);
10167
10168 try
10169 {
10170 gl::Context *context = gl::getNonLostContext();
10171
10172 if (context)
10173 {
10174 if (n < 0 || (unsigned int)n > context->getMaximumRenderTargets())
10175 {
10176 return gl::error(GL_INVALID_VALUE);
10177 }
10178
10179 if (context->getDrawFramebufferHandle() == 0)
10180 {
shannon.woods%transgaming.com@gtempaccount.com2fa73c52013-04-13 03:37:20 +000010181 if (n != 1)
shannon.woods%transgaming.com@gtempaccount.com4059a382013-04-13 03:31:16 +000010182 {
10183 return gl::error(GL_INVALID_OPERATION);
10184 }
10185
shannon.woods%transgaming.com@gtempaccount.com2fa73c52013-04-13 03:37:20 +000010186 if (bufs[0] != GL_NONE && bufs[0] != GL_BACK)
shannon.woods%transgaming.com@gtempaccount.com4059a382013-04-13 03:31:16 +000010187 {
shannon.woods%transgaming.com@gtempaccount.com2fa73c52013-04-13 03:37:20 +000010188 return gl::error(GL_INVALID_OPERATION);
shannon.woods%transgaming.com@gtempaccount.com4059a382013-04-13 03:31:16 +000010189 }
10190 }
10191 else
10192 {
10193 for (int colorAttachment = 0; colorAttachment < n; colorAttachment++)
10194 {
10195 const GLenum attachment = GL_COLOR_ATTACHMENT0_EXT + colorAttachment;
10196 if (bufs[colorAttachment] != GL_NONE && bufs[colorAttachment] != attachment)
10197 {
10198 return gl::error(GL_INVALID_OPERATION);
10199 }
10200 }
10201 }
10202
10203 gl::Framebuffer *framebuffer = context->getDrawFramebuffer();
10204
10205 for (int colorAttachment = 0; colorAttachment < n; colorAttachment++)
10206 {
10207 framebuffer->setDrawBufferState(colorAttachment, bufs[colorAttachment]);
10208 }
shannon.woods%transgaming.com@gtempaccount.com2fa73c52013-04-13 03:37:20 +000010209
10210 for (int colorAttachment = n; colorAttachment < (int)context->getMaximumRenderTargets(); colorAttachment++)
10211 {
10212 framebuffer->setDrawBufferState(colorAttachment, GL_NONE);
10213 }
shannon.woods%transgaming.com@gtempaccount.com4059a382013-04-13 03:31:16 +000010214 }
10215 }
10216 catch (std::bad_alloc&)
10217 {
10218 return gl::error(GL_OUT_OF_MEMORY);
10219 }
10220}
10221
daniel@transgaming.comce3d0f22010-05-04 03:35:14 +000010222__eglMustCastToProperFunctionPointerType __stdcall glGetProcAddress(const char *procname)
10223{
10224 struct Extension
10225 {
10226 const char *name;
10227 __eglMustCastToProperFunctionPointerType address;
10228 };
10229
10230 static const Extension glExtensions[] =
10231 {
10232 {"glTexImage3DOES", (__eglMustCastToProperFunctionPointerType)glTexImage3DOES},
daniel@transgaming.com01868132010-08-24 19:21:17 +000010233 {"glBlitFramebufferANGLE", (__eglMustCastToProperFunctionPointerType)glBlitFramebufferANGLE},
daniel@transgaming.com1fe96c92011-01-14 15:08:44 +000010234 {"glRenderbufferStorageMultisampleANGLE", (__eglMustCastToProperFunctionPointerType)glRenderbufferStorageMultisampleANGLE},
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +000010235 {"glDeleteFencesNV", (__eglMustCastToProperFunctionPointerType)glDeleteFencesNV},
10236 {"glGenFencesNV", (__eglMustCastToProperFunctionPointerType)glGenFencesNV},
10237 {"glIsFenceNV", (__eglMustCastToProperFunctionPointerType)glIsFenceNV},
10238 {"glTestFenceNV", (__eglMustCastToProperFunctionPointerType)glTestFenceNV},
10239 {"glGetFenceivNV", (__eglMustCastToProperFunctionPointerType)glGetFenceivNV},
10240 {"glFinishFenceNV", (__eglMustCastToProperFunctionPointerType)glFinishFenceNV},
10241 {"glSetFenceNV", (__eglMustCastToProperFunctionPointerType)glSetFenceNV},
zmo@google.coma574f782011-10-03 21:45:23 +000010242 {"glGetTranslatedShaderSourceANGLE", (__eglMustCastToProperFunctionPointerType)glGetTranslatedShaderSourceANGLE},
daniel@transgaming.com0bd1f2f2011-11-11 04:19:03 +000010243 {"glTexStorage2DEXT", (__eglMustCastToProperFunctionPointerType)glTexStorage2DEXT},
daniel@transgaming.com709ed112011-11-12 03:18:10 +000010244 {"glGetGraphicsResetStatusEXT", (__eglMustCastToProperFunctionPointerType)glGetGraphicsResetStatusEXT},
10245 {"glReadnPixelsEXT", (__eglMustCastToProperFunctionPointerType)glReadnPixelsEXT},
10246 {"glGetnUniformfvEXT", (__eglMustCastToProperFunctionPointerType)glGetnUniformfvEXT},
10247 {"glGetnUniformivEXT", (__eglMustCastToProperFunctionPointerType)glGetnUniformivEXT},
daniel@transgaming.com86bdb822012-01-20 18:24:39 +000010248 {"glGenQueriesEXT", (__eglMustCastToProperFunctionPointerType)glGenQueriesEXT},
10249 {"glDeleteQueriesEXT", (__eglMustCastToProperFunctionPointerType)glDeleteQueriesEXT},
10250 {"glIsQueryEXT", (__eglMustCastToProperFunctionPointerType)glIsQueryEXT},
10251 {"glBeginQueryEXT", (__eglMustCastToProperFunctionPointerType)glBeginQueryEXT},
10252 {"glEndQueryEXT", (__eglMustCastToProperFunctionPointerType)glEndQueryEXT},
10253 {"glGetQueryivEXT", (__eglMustCastToProperFunctionPointerType)glGetQueryivEXT},
10254 {"glGetQueryObjectuivEXT", (__eglMustCastToProperFunctionPointerType)glGetQueryObjectuivEXT},
shannon.woods%transgaming.com@gtempaccount.com77d94722013-04-13 03:34:22 +000010255 {"glDrawBuffersEXT", (__eglMustCastToProperFunctionPointerType)glDrawBuffersEXT},
daniel@transgaming.comdce02fd2012-01-27 15:39:51 +000010256 {"glVertexAttribDivisorANGLE", (__eglMustCastToProperFunctionPointerType)glVertexAttribDivisorANGLE},
10257 {"glDrawArraysInstancedANGLE", (__eglMustCastToProperFunctionPointerType)glDrawArraysInstancedANGLE},
10258 {"glDrawElementsInstancedANGLE", (__eglMustCastToProperFunctionPointerType)glDrawElementsInstancedANGLE},
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010259 {"glGetProgramBinaryOES", (__eglMustCastToProperFunctionPointerType)glGetProgramBinaryOES},
10260 {"glProgramBinaryOES", (__eglMustCastToProperFunctionPointerType)glProgramBinaryOES}, };
daniel@transgaming.comce3d0f22010-05-04 03:35:14 +000010261
shannon.woods@transgaming.comd438fd42013-02-28 23:17:45 +000010262 for (unsigned int ext = 0; ext < ArraySize(glExtensions); ext++)
daniel@transgaming.comce3d0f22010-05-04 03:35:14 +000010263 {
10264 if (strcmp(procname, glExtensions[ext].name) == 0)
10265 {
10266 return (__eglMustCastToProperFunctionPointerType)glExtensions[ext].address;
10267 }
10268 }
10269
10270 return NULL;
10271}
10272
daniel@transgaming.com17f548c2011-11-09 17:47:02 +000010273// Non-public functions used by EGL
10274
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +000010275bool __stdcall glBindTexImage(egl::Surface *surface)
jbauman@chromium.orgae345802011-03-30 22:04:25 +000010276{
10277 EVENT("(egl::Surface* surface = 0x%0.8p)",
10278 surface);
10279
10280 try
10281 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +000010282 gl::Context *context = gl::getNonLostContext();
jbauman@chromium.orgae345802011-03-30 22:04:25 +000010283
10284 if (context)
10285 {
10286 gl::Texture2D *textureObject = context->getTexture2D();
Geoff Lang32d508e2014-02-11 09:39:48 -050010287 ASSERT(textureObject != NULL);
jbauman@chromium.orgae345802011-03-30 22:04:25 +000010288
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +000010289 if (textureObject->isImmutable())
10290 {
10291 return false;
10292 }
10293
Geoff Lang32d508e2014-02-11 09:39:48 -050010294 textureObject->bindTexImage(surface);
jbauman@chromium.orgae345802011-03-30 22:04:25 +000010295 }
10296 }
10297 catch(std::bad_alloc&)
10298 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010299 return gl::error(GL_OUT_OF_MEMORY, false);
jbauman@chromium.orgae345802011-03-30 22:04:25 +000010300 }
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +000010301
10302 return true;
jbauman@chromium.orgae345802011-03-30 22:04:25 +000010303}
10304
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000010305}