blob: 58e493283421e65b2b752846b9765b465d21f252 [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 {
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00001673 context->drawArrays(mode, first, count, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001674 }
1675 }
1676 catch(std::bad_alloc&)
1677 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001678 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001679 }
1680}
1681
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001682void __stdcall glDrawArraysInstancedANGLE(GLenum mode, GLint first, GLsizei count, GLsizei primcount)
1683{
1684 EVENT("(GLenum mode = 0x%X, GLint first = %d, GLsizei count = %d, GLsizei primcount = %d)", mode, first, count, primcount);
1685
1686 try
1687 {
1688 if (count < 0 || first < 0 || primcount < 0)
1689 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001690 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001691 }
1692
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00001693 if (primcount > 0)
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001694 {
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00001695 gl::Context *context = gl::getNonLostContext();
1696
1697 if (context)
1698 {
1699 context->drawArrays(mode, first, count, primcount);
1700 }
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001701 }
1702 }
1703 catch(std::bad_alloc&)
1704 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001705 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001706 }
1707}
1708
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00001709void __stdcall glDrawElements(GLenum mode, GLsizei count, GLenum type, const GLvoid* indices)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001710{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001711 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 +00001712 mode, count, type, indices);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001713
1714 try
1715 {
1716 if (count < 0)
1717 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001718 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001719 }
1720
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001721 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001722
1723 if (context)
1724 {
daniel@transgaming.com83921382011-01-08 05:46:00 +00001725 switch (type)
1726 {
1727 case GL_UNSIGNED_BYTE:
1728 case GL_UNSIGNED_SHORT:
1729 break;
1730 case GL_UNSIGNED_INT:
1731 if (!context->supports32bitIndices())
1732 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001733 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com83921382011-01-08 05:46:00 +00001734 }
1735 break;
1736 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001737 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com83921382011-01-08 05:46:00 +00001738 }
1739
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00001740 context->drawElements(mode, count, type, indices, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001741 }
1742 }
1743 catch(std::bad_alloc&)
1744 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001745 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001746 }
1747}
1748
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001749void __stdcall glDrawElementsInstancedANGLE(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLsizei primcount)
1750{
1751 EVENT("(GLenum mode = 0x%X, GLsizei count = %d, GLenum type = 0x%X, const GLvoid* indices = 0x%0.8p, GLsizei primcount = %d)",
1752 mode, count, type, indices, primcount);
1753
1754 try
1755 {
1756 if (count < 0 || primcount < 0)
1757 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001758 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001759 }
1760
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00001761 if (primcount > 0)
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001762 {
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00001763 gl::Context *context = gl::getNonLostContext();
1764
1765 if (context)
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001766 {
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00001767 switch (type)
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001768 {
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00001769 case GL_UNSIGNED_BYTE:
1770 case GL_UNSIGNED_SHORT:
1771 break;
1772 case GL_UNSIGNED_INT:
1773 if (!context->supports32bitIndices())
1774 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001775 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00001776 }
1777 break;
1778 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001779 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001780 }
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00001781
1782 context->drawElements(mode, count, type, indices, primcount);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001783 }
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001784 }
1785 }
1786 catch(std::bad_alloc&)
1787 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001788 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001789 }
1790}
1791
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001792void __stdcall glEnable(GLenum cap)
1793{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001794 EVENT("(GLenum cap = 0x%X)", cap);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001795
1796 try
1797 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001798 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001799
1800 if (context)
1801 {
Geoff Lang0550d032014-01-30 11:29:07 -05001802 if (!ValidCap(context, cap))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001803 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001804 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001805 }
Geoff Lang0550d032014-01-30 11:29:07 -05001806
1807 context->setCap(cap, true);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001808 }
1809 }
1810 catch(std::bad_alloc&)
1811 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001812 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001813 }
1814}
1815
1816void __stdcall glEnableVertexAttribArray(GLuint index)
1817{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001818 EVENT("(GLuint index = %d)", index);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001819
1820 try
1821 {
1822 if (index >= gl::MAX_VERTEX_ATTRIBS)
1823 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001824 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001825 }
1826
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001827 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001828
1829 if (context)
1830 {
daniel@transgaming.com83921382011-01-08 05:46:00 +00001831 context->setEnableVertexAttribArray(index, true);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001832 }
1833 }
1834 catch(std::bad_alloc&)
1835 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001836 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001837 }
1838}
1839
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00001840void __stdcall glEndQueryEXT(GLenum target)
1841{
1842 EVENT("GLenum target = 0x%X)", target);
1843
1844 try
1845 {
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00001846 gl::Context *context = gl::getNonLostContext();
1847
1848 if (context)
1849 {
Geoff Lang37dde692014-01-31 16:34:54 -05001850 if (!ValidQueryType(context, target))
1851 {
1852 return gl::error(GL_INVALID_ENUM);
1853 }
1854
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00001855 context->endQuery(target);
1856 }
1857 }
1858 catch(std::bad_alloc&)
1859 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001860 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00001861 }
1862}
1863
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001864void __stdcall glFinishFenceNV(GLuint fence)
1865{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001866 EVENT("(GLuint fence = %d)", fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001867
1868 try
1869 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001870 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001871
1872 if (context)
1873 {
Jamie Madill33dc8432013-07-26 11:55:05 -04001874 gl::FenceNV *fenceObject = context->getFenceNV(fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001875
1876 if (fenceObject == NULL)
1877 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001878 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001879 }
1880
Jamie Madillfb9a7402013-07-26 11:55:01 -04001881 if (fenceObject->isFence() != GL_TRUE)
1882 {
1883 return gl::error(GL_INVALID_OPERATION);
1884 }
1885
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001886 fenceObject->finishFence();
1887 }
1888 }
1889 catch(std::bad_alloc&)
1890 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001891 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001892 }
1893}
1894
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001895void __stdcall glFinish(void)
1896{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001897 EVENT("()");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001898
1899 try
1900 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001901 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001902
1903 if (context)
1904 {
daniel@transgaming.com0d86aa72011-10-26 02:35:10 +00001905 context->sync(true);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001906 }
1907 }
1908 catch(std::bad_alloc&)
1909 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001910 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001911 }
1912}
1913
1914void __stdcall glFlush(void)
1915{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001916 EVENT("()");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001917
1918 try
1919 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001920 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001921
1922 if (context)
1923 {
daniel@transgaming.com0d86aa72011-10-26 02:35:10 +00001924 context->sync(false);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001925 }
1926 }
1927 catch(std::bad_alloc&)
1928 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001929 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001930 }
1931}
1932
1933void __stdcall glFramebufferRenderbuffer(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer)
1934{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001935 EVENT("(GLenum target = 0x%X, GLenum attachment = 0x%X, GLenum renderbuffertarget = 0x%X, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001936 "GLuint renderbuffer = %d)", target, attachment, renderbuffertarget, renderbuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001937
1938 try
1939 {
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05001940 if (!gl::ValidFramebufferTarget(target) || (renderbuffertarget != GL_RENDERBUFFER && renderbuffer != 0))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001941 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001942 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001943 }
1944
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001945 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001946
1947 if (context)
1948 {
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05001949 if (!gl::ValidateFramebufferRenderbufferParameters(context, target, attachment, renderbuffertarget, renderbuffer))
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00001950 {
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05001951 return;
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00001952 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001953
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05001954 gl::Framebuffer *framebuffer = context->getTargetFramebuffer(target);
1955 ASSERT(framebuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001956
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00001957 if (attachment >= GL_COLOR_ATTACHMENT0_EXT && attachment <= GL_COLOR_ATTACHMENT15_EXT)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001958 {
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05001959 unsigned int colorAttachment = (attachment - GL_COLOR_ATTACHMENT0_EXT);
Geoff Lang309c92a2013-07-25 16:23:19 -04001960 framebuffer->setColorbuffer(colorAttachment, GL_RENDERBUFFER, renderbuffer, 0, 0);
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00001961 }
1962 else
1963 {
1964 switch (attachment)
1965 {
1966 case GL_DEPTH_ATTACHMENT:
Geoff Lang309c92a2013-07-25 16:23:19 -04001967 framebuffer->setDepthbuffer(GL_RENDERBUFFER, renderbuffer, 0, 0);
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00001968 break;
1969 case GL_STENCIL_ATTACHMENT:
Geoff Lang309c92a2013-07-25 16:23:19 -04001970 framebuffer->setStencilbuffer(GL_RENDERBUFFER, renderbuffer, 0, 0);
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00001971 break;
Geoff Lang7e9ee232013-08-05 10:18:42 -04001972 case GL_DEPTH_STENCIL_ATTACHMENT:
Geoff Lang7e9ee232013-08-05 10:18:42 -04001973 framebuffer->setDepthStencilBuffer(GL_RENDERBUFFER, renderbuffer, 0, 0);
1974 break;
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00001975 default:
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05001976 UNREACHABLE();
1977 break;
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00001978 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001979 }
1980 }
1981 }
1982 catch(std::bad_alloc&)
1983 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001984 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001985 }
1986}
1987
1988void __stdcall glFramebufferTexture2D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level)
1989{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001990 EVENT("(GLenum target = 0x%X, GLenum attachment = 0x%X, GLenum textarget = 0x%X, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001991 "GLuint texture = %d, GLint level = %d)", target, attachment, textarget, texture, level);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001992
1993 try
1994 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001995 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001996 if (context)
1997 {
Geoff Lang3ed0c482013-07-25 17:03:18 -04001998 if (context->getClientVersion() < 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -04001999 !ValidateES2FramebufferTextureParameters(context, target, attachment, textarget, texture, level))
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002000 {
Geoff Lang3ed0c482013-07-25 17:03:18 -04002001 return;
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002002 }
Geoff Lang3ed0c482013-07-25 17:03:18 -04002003
2004 if (context->getClientVersion() >= 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -04002005 !ValidateES3FramebufferTextureParameters(context, target, attachment, textarget, texture, level, 0, false))
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002006 {
Geoff Lang3ed0c482013-07-25 17:03:18 -04002007 return;
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002008 }
2009
daniel@transgaming.com93a81472010-04-20 18:52:58 +00002010 if (texture == 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002011 {
daniel@transgaming.com93a81472010-04-20 18:52:58 +00002012 textarget = GL_NONE;
2013 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002014
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05002015 gl::Framebuffer *framebuffer = context->getTargetFramebuffer(target);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002016
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002017 if (attachment >= GL_COLOR_ATTACHMENT0_EXT && attachment <= GL_COLOR_ATTACHMENT15_EXT)
daniel@transgaming.comfbc09532010-04-26 15:33:41 +00002018 {
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002019 const unsigned int colorAttachment = (attachment - GL_COLOR_ATTACHMENT0_EXT);
Geoff Lang309c92a2013-07-25 16:23:19 -04002020 framebuffer->setColorbuffer(colorAttachment, textarget, texture, level, 0);
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002021 }
2022 else
2023 {
2024 switch (attachment)
2025 {
Geoff Lang309c92a2013-07-25 16:23:19 -04002026 case GL_DEPTH_ATTACHMENT: framebuffer->setDepthbuffer(textarget, texture, level, 0); break;
2027 case GL_STENCIL_ATTACHMENT: framebuffer->setStencilbuffer(textarget, texture, level, 0); break;
2028 case GL_DEPTH_STENCIL_ATTACHMENT: framebuffer->setDepthStencilBuffer(textarget, texture, level, 0); break;
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002029 }
daniel@transgaming.comfbc09532010-04-26 15:33:41 +00002030 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002031 }
2032 }
2033 catch(std::bad_alloc&)
2034 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002035 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002036 }
2037}
2038
2039void __stdcall glFrontFace(GLenum mode)
2040{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002041 EVENT("(GLenum mode = 0x%X)", mode);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002042
2043 try
2044 {
2045 switch (mode)
2046 {
2047 case GL_CW:
2048 case GL_CCW:
2049 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002050 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002051
2052 if (context)
2053 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00002054 context->setFrontFace(mode);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002055 }
2056 }
2057 break;
2058 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002059 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002060 }
2061 }
2062 catch(std::bad_alloc&)
2063 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002064 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002065 }
2066}
2067
2068void __stdcall glGenBuffers(GLsizei n, GLuint* buffers)
2069{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002070 EVENT("(GLsizei n = %d, GLuint* buffers = 0x%0.8p)", n, buffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002071
2072 try
2073 {
2074 if (n < 0)
2075 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002076 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002077 }
2078
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002079 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002080
2081 if (context)
2082 {
2083 for (int i = 0; i < n; i++)
2084 {
2085 buffers[i] = context->createBuffer();
2086 }
2087 }
2088 }
2089 catch(std::bad_alloc&)
2090 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002091 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002092 }
2093}
2094
2095void __stdcall glGenerateMipmap(GLenum target)
2096{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002097 EVENT("(GLenum target = 0x%X)", target);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002098
2099 try
2100 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002101 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com8fd99e22010-04-20 18:52:00 +00002102
2103 if (context)
2104 {
Jamie Madill35d15012013-10-07 10:46:37 -04002105 if (!ValidTextureTarget(context, target))
daniel@transgaming.com8fd99e22010-04-20 18:52:00 +00002106 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002107 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com8fd99e22010-04-20 18:52:00 +00002108 }
Geoff Langae4852a2013-06-05 15:00:34 -04002109
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05002110 gl::Texture *texture = context->getTargetTexture(target);
Jamie Madill35d15012013-10-07 10:46:37 -04002111
2112 if (texture == NULL)
Geoff Langae4852a2013-06-05 15:00:34 -04002113 {
2114 return gl::error(GL_INVALID_OPERATION);
2115 }
2116
Geoff Lang005df412013-10-16 14:12:50 -04002117 GLenum internalFormat = texture->getBaseLevelInternalFormat();
Jamie Madill35d15012013-10-07 10:46:37 -04002118
Geoff Langae4852a2013-06-05 15:00:34 -04002119 // Internally, all texture formats are sized so checking if the format
2120 // is color renderable and filterable will not fail.
Jamie Madill61b54432014-02-18 15:27:19 -05002121
2122 bool validRenderable = (gl::IsColorRenderingSupported(internalFormat, context) ||
2123 gl::IsSizedInternalFormat(internalFormat, context->getClientVersion()));
2124
Jamie Madill33f9c2e2013-10-07 10:46:36 -04002125 if (gl::IsDepthRenderingSupported(internalFormat, context) ||
2126 gl::IsFormatCompressed(internalFormat, context->getClientVersion()) ||
Jamie Madill61b54432014-02-18 15:27:19 -05002127 !gl::IsTextureFilteringSupported(internalFormat, context) ||
2128 !validRenderable)
Geoff Langae4852a2013-06-05 15:00:34 -04002129 {
2130 return gl::error(GL_INVALID_OPERATION);
2131 }
2132
Jamie Madillc1f8b162013-10-07 10:46:38 -04002133 // Non-power of 2 ES2 check
2134 if (!context->supportsNonPower2Texture() && (!gl::isPow2(texture->getBaseLevelWidth()) || !gl::isPow2(texture->getBaseLevelHeight())))
2135 {
2136 ASSERT(context->getClientVersion() <= 2 && (target == GL_TEXTURE_2D || target == GL_TEXTURE_CUBE_MAP));
2137 return gl::error(GL_INVALID_OPERATION);
2138 }
2139
2140 // Cube completeness check
2141 if (target == GL_TEXTURE_CUBE_MAP)
2142 {
2143 gl::TextureCubeMap *textureCube = static_cast<gl::TextureCubeMap *>(texture);
2144 if (!textureCube->isCubeComplete())
2145 {
2146 return gl::error(GL_INVALID_OPERATION);
2147 }
2148 }
2149
Geoff Langae4852a2013-06-05 15:00:34 -04002150 texture->generateMipmaps();
daniel@transgaming.com8fd99e22010-04-20 18:52:00 +00002151 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002152 }
2153 catch(std::bad_alloc&)
2154 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002155 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002156 }
2157}
2158
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002159void __stdcall glGenFencesNV(GLsizei n, GLuint* fences)
2160{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002161 EVENT("(GLsizei n = %d, GLuint* fences = 0x%0.8p)", n, fences);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002162
2163 try
2164 {
2165 if (n < 0)
2166 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002167 return gl::error(GL_INVALID_VALUE);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002168 }
2169
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002170 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002171
2172 if (context)
2173 {
2174 for (int i = 0; i < n; i++)
2175 {
Jamie Madill33dc8432013-07-26 11:55:05 -04002176 fences[i] = context->createFenceNV();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002177 }
2178 }
2179 }
2180 catch(std::bad_alloc&)
2181 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002182 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002183 }
2184}
2185
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002186void __stdcall glGenFramebuffers(GLsizei n, GLuint* framebuffers)
2187{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002188 EVENT("(GLsizei n = %d, GLuint* framebuffers = 0x%0.8p)", n, framebuffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002189
2190 try
2191 {
2192 if (n < 0)
2193 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002194 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002195 }
2196
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002197 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002198
2199 if (context)
2200 {
2201 for (int i = 0; i < n; i++)
2202 {
2203 framebuffers[i] = context->createFramebuffer();
2204 }
2205 }
2206 }
2207 catch(std::bad_alloc&)
2208 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002209 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002210 }
2211}
2212
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00002213void __stdcall glGenQueriesEXT(GLsizei n, GLuint* ids)
2214{
2215 EVENT("(GLsizei n = %d, GLuint* ids = 0x%0.8p)", n, ids);
2216
2217 try
2218 {
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00002219 gl::Context *context = gl::getNonLostContext();
2220
2221 if (context)
2222 {
Geoff Lang37dde692014-01-31 16:34:54 -05002223 if (n < 0)
2224 {
2225 return gl::error(GL_INVALID_VALUE);
2226 }
2227
2228 for (GLsizei i = 0; i < n; i++)
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00002229 {
2230 ids[i] = context->createQuery();
2231 }
2232 }
2233 }
2234 catch(std::bad_alloc&)
2235 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002236 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00002237 }
2238}
2239
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002240void __stdcall glGenRenderbuffers(GLsizei n, GLuint* renderbuffers)
2241{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002242 EVENT("(GLsizei n = %d, GLuint* renderbuffers = 0x%0.8p)", n, renderbuffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002243
2244 try
2245 {
2246 if (n < 0)
2247 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002248 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002249 }
2250
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002251 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002252
2253 if (context)
2254 {
2255 for (int i = 0; i < n; i++)
2256 {
2257 renderbuffers[i] = context->createRenderbuffer();
2258 }
2259 }
2260 }
2261 catch(std::bad_alloc&)
2262 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002263 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002264 }
2265}
2266
2267void __stdcall glGenTextures(GLsizei n, GLuint* textures)
2268{
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05002269 EVENT("(GLsizei n = %d, GLuint* textures = 0x%0.8p)", n, textures);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002270
2271 try
2272 {
2273 if (n < 0)
2274 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002275 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002276 }
2277
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002278 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002279
2280 if (context)
2281 {
2282 for (int i = 0; i < n; i++)
2283 {
2284 textures[i] = context->createTexture();
2285 }
2286 }
2287 }
2288 catch(std::bad_alloc&)
2289 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002290 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002291 }
2292}
2293
daniel@transgaming.com85423182010-04-22 13:35:27 +00002294void __stdcall glGetActiveAttrib(GLuint program, GLuint index, GLsizei bufsize, GLsizei *length, GLint *size, GLenum *type, GLchar *name)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002295{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002296 EVENT("(GLuint program = %d, GLuint index = %d, GLsizei bufsize = %d, GLsizei *length = 0x%0.8p, "
daniel@transgaming.com85423182010-04-22 13:35:27 +00002297 "GLint *size = 0x%0.8p, GLenum *type = %0.8p, GLchar *name = %0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002298 program, index, bufsize, length, size, type, name);
2299
2300 try
2301 {
2302 if (bufsize < 0)
2303 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002304 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002305 }
2306
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002307 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com85423182010-04-22 13:35:27 +00002308
2309 if (context)
2310 {
2311 gl::Program *programObject = context->getProgram(program);
2312
2313 if (!programObject)
2314 {
2315 if (context->getShader(program))
2316 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002317 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com85423182010-04-22 13:35:27 +00002318 }
2319 else
2320 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002321 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com85423182010-04-22 13:35:27 +00002322 }
2323 }
2324
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00002325 if (index >= (GLuint)programObject->getActiveAttributeCount())
daniel@transgaming.com85423182010-04-22 13:35:27 +00002326 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002327 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com85423182010-04-22 13:35:27 +00002328 }
2329
2330 programObject->getActiveAttribute(index, bufsize, length, size, type, name);
2331 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002332 }
2333 catch(std::bad_alloc&)
2334 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002335 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002336 }
2337}
2338
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00002339void __stdcall glGetActiveUniform(GLuint program, GLuint index, GLsizei bufsize, GLsizei* length, GLint* size, GLenum* type, GLchar* name)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002340{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002341 EVENT("(GLuint program = %d, GLuint index = %d, GLsizei bufsize = %d, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00002342 "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 +00002343 program, index, bufsize, length, size, type, name);
2344
2345 try
2346 {
2347 if (bufsize < 0)
2348 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002349 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002350 }
2351
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002352 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00002353
2354 if (context)
2355 {
2356 gl::Program *programObject = context->getProgram(program);
2357
2358 if (!programObject)
2359 {
2360 if (context->getShader(program))
2361 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002362 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00002363 }
2364 else
2365 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002366 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00002367 }
2368 }
2369
2370 if (index >= (GLuint)programObject->getActiveUniformCount())
2371 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002372 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00002373 }
2374
2375 programObject->getActiveUniform(index, bufsize, length, size, type, name);
2376 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002377 }
2378 catch(std::bad_alloc&)
2379 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002380 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002381 }
2382}
2383
2384void __stdcall glGetAttachedShaders(GLuint program, GLsizei maxcount, GLsizei* count, GLuint* shaders)
2385{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002386 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 +00002387 program, maxcount, count, shaders);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002388
2389 try
2390 {
2391 if (maxcount < 0)
2392 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002393 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002394 }
2395
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002396 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com6c785212010-03-30 03:36:17 +00002397
2398 if (context)
2399 {
2400 gl::Program *programObject = context->getProgram(program);
2401
2402 if (!programObject)
2403 {
daniel@transgaming.com23953e32010-04-13 19:53:31 +00002404 if (context->getShader(program))
2405 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002406 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com23953e32010-04-13 19:53:31 +00002407 }
2408 else
2409 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002410 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com23953e32010-04-13 19:53:31 +00002411 }
daniel@transgaming.com6c785212010-03-30 03:36:17 +00002412 }
2413
2414 return programObject->getAttachedShaders(maxcount, count, shaders);
2415 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002416 }
2417 catch(std::bad_alloc&)
2418 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002419 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002420 }
2421}
2422
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00002423int __stdcall glGetAttribLocation(GLuint program, const GLchar* name)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002424{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002425 EVENT("(GLuint program = %d, const GLchar* name = %s)", program, name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002426
2427 try
2428 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002429 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002430
2431 if (context)
2432 {
daniel@transgaming.combb274c32010-04-13 03:26:21 +00002433
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002434 gl::Program *programObject = context->getProgram(program);
2435
2436 if (!programObject)
2437 {
daniel@transgaming.combb274c32010-04-13 03:26:21 +00002438 if (context->getShader(program))
2439 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002440 return gl::error(GL_INVALID_OPERATION, -1);
daniel@transgaming.combb274c32010-04-13 03:26:21 +00002441 }
2442 else
2443 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002444 return gl::error(GL_INVALID_VALUE, -1);
daniel@transgaming.combb274c32010-04-13 03:26:21 +00002445 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002446 }
2447
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00002448 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
daniel@transgaming.com716056c2012-07-24 18:38:59 +00002449 if (!programObject->isLinked() || !programBinary)
daniel@transgaming.comcf4aa872010-04-13 03:26:27 +00002450 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002451 return gl::error(GL_INVALID_OPERATION, -1);
daniel@transgaming.comcf4aa872010-04-13 03:26:27 +00002452 }
2453
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00002454 return programBinary->getAttributeLocation(name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002455 }
2456 }
2457 catch(std::bad_alloc&)
2458 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002459 return gl::error(GL_OUT_OF_MEMORY, -1);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002460 }
2461
2462 return -1;
2463}
2464
2465void __stdcall glGetBooleanv(GLenum pname, GLboolean* params)
2466{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002467 EVENT("(GLenum pname = 0x%X, GLboolean* params = 0x%0.8p)", pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002468
2469 try
2470 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002471 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com777f2672010-04-07 03:25:16 +00002472
2473 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002474 {
Jamie Madill79f2f452013-12-19 11:13:02 -05002475 GLenum nativeType;
2476 unsigned int numParams = 0;
2477 if (!context->getQueryParameterInfo(pname, &nativeType, &numParams))
2478 return gl::error(GL_INVALID_ENUM);
2479
2480 // pname is valid, but there are no parameters to return
2481 if (numParams == 0)
2482 return;
2483
2484 if (nativeType == GL_BOOL)
daniel@transgaming.com777f2672010-04-07 03:25:16 +00002485 {
Jamie Madill79f2f452013-12-19 11:13:02 -05002486 context->getBooleanv(pname, params);
2487 }
Jamie Madill55856b12014-01-02 13:59:50 -05002488 else
Jamie Madill79f2f452013-12-19 11:13:02 -05002489 {
Jamie Madill55856b12014-01-02 13:59:50 -05002490 CastStateValues(context, nativeType, pname, numParams, params);
daniel@transgaming.com777f2672010-04-07 03:25:16 +00002491 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002492 }
2493 }
2494 catch(std::bad_alloc&)
2495 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002496 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002497 }
2498}
2499
2500void __stdcall glGetBufferParameteriv(GLenum target, GLenum pname, GLint* params)
2501{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002502 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 +00002503
2504 try
2505 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002506 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comaa0ccbd2010-04-15 20:45:05 +00002507
2508 if (context)
2509 {
2510 gl::Buffer *buffer;
2511
2512 switch (target)
2513 {
2514 case GL_ARRAY_BUFFER:
2515 buffer = context->getArrayBuffer();
2516 break;
2517 case GL_ELEMENT_ARRAY_BUFFER:
2518 buffer = context->getElementArrayBuffer();
2519 break;
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002520 default: return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comaa0ccbd2010-04-15 20:45:05 +00002521 }
2522
2523 if (!buffer)
2524 {
2525 // A null buffer means that "0" is bound to the requested buffer target
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002526 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comaa0ccbd2010-04-15 20:45:05 +00002527 }
2528
2529 switch (pname)
2530 {
2531 case GL_BUFFER_USAGE:
2532 *params = buffer->usage();
2533 break;
2534 case GL_BUFFER_SIZE:
2535 *params = buffer->size();
2536 break;
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002537 default: return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comaa0ccbd2010-04-15 20:45:05 +00002538 }
2539 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002540 }
2541 catch(std::bad_alloc&)
2542 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002543 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002544 }
2545}
2546
2547GLenum __stdcall glGetError(void)
2548{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002549 EVENT("()");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002550
2551 gl::Context *context = gl::getContext();
2552
2553 if (context)
2554 {
daniel@transgaming.com82b28912011-12-12 21:01:35 +00002555 return context->getError();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002556 }
2557
2558 return GL_NO_ERROR;
2559}
2560
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002561void __stdcall glGetFenceivNV(GLuint fence, GLenum pname, GLint *params)
2562{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002563 EVENT("(GLuint fence = %d, GLenum pname = 0x%X, GLint *params = 0x%0.8p)", fence, pname, params);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002564
2565 try
2566 {
2567
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002568 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002569
2570 if (context)
2571 {
Jamie Madill33dc8432013-07-26 11:55:05 -04002572 gl::FenceNV *fenceObject = context->getFenceNV(fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002573
2574 if (fenceObject == NULL)
2575 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002576 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002577 }
2578
Jamie Madillfb9a7402013-07-26 11:55:01 -04002579 if (fenceObject->isFence() != GL_TRUE)
2580 {
2581 return gl::error(GL_INVALID_OPERATION);
2582 }
2583
2584 switch (pname)
2585 {
2586 case GL_FENCE_STATUS_NV:
2587 case GL_FENCE_CONDITION_NV:
2588 break;
2589
2590 default: return gl::error(GL_INVALID_ENUM);
2591 }
2592
2593 params[0] = fenceObject->getFencei(pname);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002594 }
2595 }
2596 catch(std::bad_alloc&)
2597 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002598 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002599 }
2600}
2601
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002602void __stdcall glGetFloatv(GLenum pname, GLfloat* params)
2603{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002604 EVENT("(GLenum pname = 0x%X, GLfloat* params = 0x%0.8p)", pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002605
2606 try
2607 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002608 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com32e58cd2010-03-24 09:44:10 +00002609
2610 if (context)
2611 {
Jamie Madill79f2f452013-12-19 11:13:02 -05002612 GLenum nativeType;
2613 unsigned int numParams = 0;
2614 if (!context->getQueryParameterInfo(pname, &nativeType, &numParams))
2615 return gl::error(GL_INVALID_ENUM);
2616
2617 // pname is valid, but that there are no parameters to return.
2618 if (numParams == 0)
2619 return;
2620
2621 if (nativeType == GL_FLOAT)
daniel@transgaming.com32e58cd2010-03-24 09:44:10 +00002622 {
Jamie Madill79f2f452013-12-19 11:13:02 -05002623 context->getFloatv(pname, params);
2624 }
Jamie Madill55856b12014-01-02 13:59:50 -05002625 else
Jamie Madill79f2f452013-12-19 11:13:02 -05002626 {
Jamie Madill55856b12014-01-02 13:59:50 -05002627 CastStateValues(context, nativeType, pname, numParams, params);
daniel@transgaming.com32e58cd2010-03-24 09:44:10 +00002628 }
2629 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002630 }
2631 catch(std::bad_alloc&)
2632 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002633 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002634 }
2635}
2636
2637void __stdcall glGetFramebufferAttachmentParameteriv(GLenum target, GLenum attachment, GLenum pname, GLint* params)
2638{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002639 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 +00002640 target, attachment, 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.com4f39fd92010-03-08 20:26:45 +00002645
2646 if (context)
2647 {
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05002648 if (!gl::ValidFramebufferTarget(target))
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002649 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002650 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002651 }
2652
Geoff Lang646559f2013-08-15 11:08:15 -04002653 switch (pname)
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002654 {
Geoff Lang646559f2013-08-15 11:08:15 -04002655 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE:
2656 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME:
2657 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL:
2658 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE:
2659 break;
2660 case GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE:
2661 case GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE:
2662 case GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE:
2663 case GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE:
2664 case GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE:
2665 case GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE:
2666 case GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE:
2667 case GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING:
2668 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER:
2669 if (context->getClientVersion() >= 3)
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002670 {
Geoff Lang646559f2013-08-15 11:08:15 -04002671 break;
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002672 }
Geoff Lang646559f2013-08-15 11:08:15 -04002673 default:
2674 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002675 }
Geoff Lang646559f2013-08-15 11:08:15 -04002676
2677 // Determine if the attachment is a valid enum
2678 switch (attachment)
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002679 {
Geoff Lang646559f2013-08-15 11:08:15 -04002680 case GL_BACK:
2681 case GL_FRONT:
Jamie Madill3810bee2014-01-21 16:47:12 -05002682 case GL_DEPTH:
Geoff Lang646559f2013-08-15 11:08:15 -04002683 case GL_STENCIL:
2684 case GL_DEPTH_STENCIL_ATTACHMENT:
2685 if (context->getClientVersion() < 3)
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002686 {
Geoff Lang646559f2013-08-15 11:08:15 -04002687 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002688 }
Geoff Lang646559f2013-08-15 11:08:15 -04002689 break;
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002690
Geoff Lang646559f2013-08-15 11:08:15 -04002691 case GL_DEPTH_ATTACHMENT:
2692 case GL_STENCIL_ATTACHMENT:
2693 break;
2694
2695 default:
2696 if (attachment < GL_COLOR_ATTACHMENT0_EXT ||
2697 (attachment - GL_COLOR_ATTACHMENT0_EXT) >= context->getMaximumRenderTargets())
2698 {
2699 return gl::error(GL_INVALID_ENUM);
2700 }
2701 break;
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002702 }
2703
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05002704 GLuint framebufferHandle = context->getTargetFramebufferHandle(target);
2705 ASSERT(framebufferHandle != GL_INVALID_INDEX);
Geoff Lang646559f2013-08-15 11:08:15 -04002706 gl::Framebuffer *framebuffer = context->getFramebuffer(framebufferHandle);
2707
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002708 GLenum attachmentType;
2709 GLuint attachmentHandle;
Geoff Lang309c92a2013-07-25 16:23:19 -04002710 GLuint attachmentLevel;
2711 GLuint attachmentLayer;
Geoff Lang646559f2013-08-15 11:08:15 -04002712 gl::Renderbuffer *renderbuffer;
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002713
Geoff Lang646559f2013-08-15 11:08:15 -04002714 if(framebufferHandle == 0)
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002715 {
Geoff Lang646559f2013-08-15 11:08:15 -04002716 if(context->getClientVersion() < 3)
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002717 {
Geoff Lang646559f2013-08-15 11:08:15 -04002718 return gl::error(GL_INVALID_OPERATION);
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002719 }
2720
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002721 switch (attachment)
2722 {
Geoff Lang646559f2013-08-15 11:08:15 -04002723 case GL_BACK:
2724 attachmentType = framebuffer->getColorbufferType(0);
2725 attachmentHandle = framebuffer->getColorbufferHandle(0);
2726 attachmentLevel = framebuffer->getColorbufferMipLevel(0);
2727 attachmentLayer = framebuffer->getColorbufferLayer(0);
2728 renderbuffer = framebuffer->getColorbuffer(0);
2729 break;
2730 case GL_DEPTH:
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002731 attachmentType = framebuffer->getDepthbufferType();
2732 attachmentHandle = framebuffer->getDepthbufferHandle();
Geoff Lang309c92a2013-07-25 16:23:19 -04002733 attachmentLevel = framebuffer->getDepthbufferMipLevel();
2734 attachmentLayer = framebuffer->getDepthbufferLayer();
Geoff Lang646559f2013-08-15 11:08:15 -04002735 renderbuffer = framebuffer->getDepthbuffer();
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002736 break;
Geoff Lang646559f2013-08-15 11:08:15 -04002737 case GL_STENCIL:
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002738 attachmentType = framebuffer->getStencilbufferType();
2739 attachmentHandle = framebuffer->getStencilbufferHandle();
Geoff Lang309c92a2013-07-25 16:23:19 -04002740 attachmentLevel = framebuffer->getStencilbufferMipLevel();
2741 attachmentLayer = framebuffer->getStencilbufferLayer();
Geoff Lang646559f2013-08-15 11:08:15 -04002742 renderbuffer = framebuffer->getStencilbuffer();
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002743 break;
Geoff Lang646559f2013-08-15 11:08:15 -04002744 default:
2745 return gl::error(GL_INVALID_OPERATION);
2746 }
2747 }
2748 else
2749 {
2750 if (attachment >= GL_COLOR_ATTACHMENT0_EXT && attachment <= GL_COLOR_ATTACHMENT15_EXT)
2751 {
2752 const unsigned int colorAttachment = (attachment - GL_COLOR_ATTACHMENT0_EXT);
2753 attachmentType = framebuffer->getColorbufferType(colorAttachment);
2754 attachmentHandle = framebuffer->getColorbufferHandle(colorAttachment);
2755 attachmentLevel = framebuffer->getColorbufferMipLevel(colorAttachment);
2756 attachmentLayer = framebuffer->getColorbufferLayer(colorAttachment);
2757 renderbuffer = framebuffer->getColorbuffer(colorAttachment);
2758 }
2759 else
2760 {
2761 switch (attachment)
Geoff Lang55ba29c2013-07-11 16:57:53 -04002762 {
Geoff Lang646559f2013-08-15 11:08:15 -04002763 case GL_DEPTH_ATTACHMENT:
2764 attachmentType = framebuffer->getDepthbufferType();
2765 attachmentHandle = framebuffer->getDepthbufferHandle();
2766 attachmentLevel = framebuffer->getDepthbufferMipLevel();
2767 attachmentLayer = framebuffer->getDepthbufferLayer();
2768 renderbuffer = framebuffer->getDepthbuffer();
2769 break;
2770 case GL_STENCIL_ATTACHMENT:
2771 attachmentType = framebuffer->getStencilbufferType();
2772 attachmentHandle = framebuffer->getStencilbufferHandle();
2773 attachmentLevel = framebuffer->getStencilbufferMipLevel();
2774 attachmentLayer = framebuffer->getStencilbufferLayer();
2775 renderbuffer = framebuffer->getStencilbuffer();
2776 break;
2777 case GL_DEPTH_STENCIL_ATTACHMENT:
2778 if (framebuffer->getDepthbufferHandle() != framebuffer->getStencilbufferHandle())
2779 {
2780 return gl::error(GL_INVALID_OPERATION);
2781 }
2782 attachmentType = framebuffer->getDepthStencilbufferType();
2783 attachmentHandle = framebuffer->getDepthStencilbufferHandle();
2784 attachmentLevel = framebuffer->getDepthStencilbufferMipLevel();
2785 attachmentLayer = framebuffer->getDepthStencilbufferLayer();
2786 renderbuffer = framebuffer->getDepthStencilBuffer();
2787 break;
2788 default:
Geoff Lang55ba29c2013-07-11 16:57:53 -04002789 return gl::error(GL_INVALID_OPERATION);
2790 }
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002791 }
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002792 }
2793
2794 GLenum attachmentObjectType; // Type category
Geoff Lang646559f2013-08-15 11:08:15 -04002795 if (framebufferHandle == 0)
2796 {
2797 attachmentObjectType = GL_FRAMEBUFFER_DEFAULT;
2798 }
2799 else if (attachmentType == GL_NONE || attachmentType == GL_RENDERBUFFER)
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002800 {
2801 attachmentObjectType = attachmentType;
2802 }
Geoff Lang0fe19492013-07-25 17:04:31 -04002803 else if (gl::IsInternalTextureTarget(attachmentType, context->getClientVersion()))
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002804 {
2805 attachmentObjectType = GL_TEXTURE;
2806 }
apatrick@chromium.orga1d80592012-01-25 21:52:10 +00002807 else
2808 {
2809 UNREACHABLE();
2810 return;
2811 }
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002812
Geoff Lang646559f2013-08-15 11:08:15 -04002813 if (attachmentObjectType == GL_NONE)
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002814 {
Geoff Lang646559f2013-08-15 11:08:15 -04002815 // ES 2.0.25 spec pg 127 states that if the value of FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE
2816 // is NONE, then querying any other pname will generate INVALID_ENUM.
2817
2818 // ES 3.0.2 spec pg 235 states that if the attachment type is none,
2819 // GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME will return zero and be an
2820 // INVALID_OPERATION for all other pnames
2821
2822 switch (pname)
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002823 {
Geoff Lang646559f2013-08-15 11:08:15 -04002824 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE:
2825 *params = attachmentObjectType;
2826 break;
2827
2828 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME:
2829 if (context->getClientVersion() < 3)
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002830 {
Geoff Lang646559f2013-08-15 11:08:15 -04002831 return gl::error(GL_INVALID_ENUM);
2832 }
2833 *params = 0;
2834 break;
2835
2836 default:
2837 if (context->getClientVersion() < 3)
2838 {
2839 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002840 }
2841 else
2842 {
Geoff Lang646559f2013-08-15 11:08:15 -04002843 gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002844 }
2845 }
Geoff Lang646559f2013-08-15 11:08:15 -04002846 }
2847 else
2848 {
2849 ASSERT(attachmentObjectType == GL_RENDERBUFFER || attachmentObjectType == GL_TEXTURE ||
2850 attachmentObjectType == GL_FRAMEBUFFER_DEFAULT);
2851 ASSERT(renderbuffer != NULL);
2852
2853 switch (pname)
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002854 {
Geoff Lang646559f2013-08-15 11:08:15 -04002855 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE:
2856 *params = attachmentObjectType;
2857 break;
2858
2859 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME:
2860 if (attachmentObjectType != GL_RENDERBUFFER && attachmentObjectType != GL_TEXTURE)
2861 {
2862 return gl::error(GL_INVALID_ENUM);
2863 }
2864 *params = attachmentHandle;
2865 break;
2866
2867 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL:
2868 if (attachmentObjectType != GL_TEXTURE)
2869 {
2870 return gl::error(GL_INVALID_ENUM);
2871 }
2872 *params = attachmentLevel;
2873 break;
2874
2875 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE:
2876 if (attachmentObjectType != GL_TEXTURE)
2877 {
2878 return gl::error(GL_INVALID_ENUM);
2879 }
2880 *params = gl::IsCubemapTextureTarget(attachmentType) ? attachmentType : 0;
2881 break;
2882
2883 case GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE:
2884 *params = renderbuffer->getRedSize();
2885 break;
2886
2887 case GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE:
2888 *params = renderbuffer->getGreenSize();
2889 break;
2890
2891 case GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE:
2892 *params = renderbuffer->getBlueSize();
2893 break;
2894
2895 case GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE:
2896 *params = renderbuffer->getAlphaSize();
2897 break;
2898
2899 case GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE:
2900 *params = renderbuffer->getDepthSize();
2901 break;
2902
2903 case GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE:
2904 *params = renderbuffer->getStencilSize();
2905 break;
2906
2907 case GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE:
2908 if (attachment == GL_DEPTH_STENCIL)
2909 {
2910 gl::error(GL_INVALID_OPERATION);
2911 }
2912 *params = renderbuffer->getComponentType();
2913 break;
2914
2915 case GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING:
2916 *params = renderbuffer->getColorEncoding();
2917 break;
2918
2919 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER:
2920 if (attachmentObjectType != GL_TEXTURE)
2921 {
2922 return gl::error(GL_INVALID_ENUM);
2923 }
2924 *params = attachmentLayer;
2925 break;
2926
2927 default:
2928 UNREACHABLE();
2929 break;
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002930 }
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002931 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002932 }
2933 }
2934 catch(std::bad_alloc&)
2935 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002936 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002937 }
2938}
2939
daniel@transgaming.com17f548c2011-11-09 17:47:02 +00002940GLenum __stdcall glGetGraphicsResetStatusEXT(void)
2941{
2942 EVENT("()");
2943
2944 try
2945 {
2946 gl::Context *context = gl::getContext();
2947
2948 if (context)
2949 {
2950 return context->getResetStatus();
2951 }
2952
2953 return GL_NO_ERROR;
2954 }
2955 catch(std::bad_alloc&)
2956 {
2957 return GL_OUT_OF_MEMORY;
2958 }
2959}
2960
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002961void __stdcall glGetIntegerv(GLenum pname, GLint* params)
2962{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002963 EVENT("(GLenum pname = 0x%X, GLint* params = 0x%0.8p)", pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002964
2965 try
2966 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002967 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002968
2969 if (context)
2970 {
Jamie Madill79f2f452013-12-19 11:13:02 -05002971 GLenum nativeType;
2972 unsigned int numParams = 0;
2973 if (!context->getQueryParameterInfo(pname, &nativeType, &numParams))
2974 return gl::error(GL_INVALID_ENUM);
2975
2976 // pname is valid, but there are no parameters to return
2977 if (numParams == 0)
2978 return;
2979
2980 if (nativeType == GL_INT)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002981 {
Jamie Madill79f2f452013-12-19 11:13:02 -05002982 context->getIntegerv(pname, params);
2983 }
Jamie Madill55856b12014-01-02 13:59:50 -05002984 else
Jamie Madill79f2f452013-12-19 11:13:02 -05002985 {
Jamie Madill55856b12014-01-02 13:59:50 -05002986 CastStateValues(context, nativeType, pname, numParams, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002987 }
2988 }
2989 }
2990 catch(std::bad_alloc&)
2991 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002992 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002993 }
2994}
2995
2996void __stdcall glGetProgramiv(GLuint program, GLenum pname, GLint* params)
2997{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002998 EVENT("(GLuint program = %d, GLenum pname = %d, GLint* params = 0x%0.8p)", program, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002999
3000 try
3001 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003002 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003003
3004 if (context)
3005 {
3006 gl::Program *programObject = context->getProgram(program);
3007
3008 if (!programObject)
3009 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003010 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003011 }
3012
shannonwoods@chromium.orge684b582013-05-30 00:07:42 +00003013 if (context->getClientVersion() < 3)
3014 {
3015 switch (pname)
3016 {
3017 case GL_ACTIVE_UNIFORM_BLOCKS:
3018 case GL_ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH:
3019 return gl::error(GL_INVALID_ENUM);
3020 }
3021 }
3022
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003023 switch (pname)
3024 {
3025 case GL_DELETE_STATUS:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003026 *params = programObject->isFlaggedForDeletion();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003027 return;
3028 case GL_LINK_STATUS:
daniel@transgaming.com716056c2012-07-24 18:38:59 +00003029 *params = programObject->isLinked();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003030 return;
3031 case GL_VALIDATE_STATUS:
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00003032 *params = programObject->isValidated();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003033 return;
3034 case GL_INFO_LOG_LENGTH:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003035 *params = programObject->getInfoLogLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003036 return;
3037 case GL_ATTACHED_SHADERS:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003038 *params = programObject->getAttachedShadersCount();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003039 return;
3040 case GL_ACTIVE_ATTRIBUTES:
daniel@transgaming.com85423182010-04-22 13:35:27 +00003041 *params = programObject->getActiveAttributeCount();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003042 return;
3043 case GL_ACTIVE_ATTRIBUTE_MAX_LENGTH:
daniel@transgaming.com85423182010-04-22 13:35:27 +00003044 *params = programObject->getActiveAttributeMaxLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003045 return;
3046 case GL_ACTIVE_UNIFORMS:
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00003047 *params = programObject->getActiveUniformCount();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003048 return;
3049 case GL_ACTIVE_UNIFORM_MAX_LENGTH:
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00003050 *params = programObject->getActiveUniformMaxLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003051 return;
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00003052 case GL_PROGRAM_BINARY_LENGTH_OES:
apatrick@chromium.org90080e32012-07-09 22:15:33 +00003053 *params = programObject->getProgramBinaryLength();
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00003054 return;
shannonwoods@chromium.orge684b582013-05-30 00:07:42 +00003055 case GL_ACTIVE_UNIFORM_BLOCKS:
3056 *params = programObject->getActiveUniformBlockCount();
3057 return;
3058 case GL_ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH:
3059 *params = programObject->getActiveUniformBlockMaxLength();
3060 break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003061 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003062 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003063 }
3064 }
3065 }
3066 catch(std::bad_alloc&)
3067 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003068 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003069 }
3070}
3071
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00003072void __stdcall glGetProgramInfoLog(GLuint program, GLsizei bufsize, GLsizei* length, GLchar* infolog)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003073{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003074 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 +00003075 program, bufsize, length, infolog);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003076
3077 try
3078 {
3079 if (bufsize < 0)
3080 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003081 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003082 }
3083
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003084 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003085
3086 if (context)
3087 {
3088 gl::Program *programObject = context->getProgram(program);
3089
3090 if (!programObject)
3091 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003092 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003093 }
3094
3095 programObject->getInfoLog(bufsize, length, infolog);
3096 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003097 }
3098 catch(std::bad_alloc&)
3099 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003100 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003101 }
3102}
3103
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003104void __stdcall glGetQueryivEXT(GLenum target, GLenum pname, GLint *params)
3105{
3106 EVENT("GLenum target = 0x%X, GLenum pname = 0x%X, GLint *params = 0x%0.8p)", target, pname, params);
3107
3108 try
3109 {
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003110 gl::Context *context = gl::getNonLostContext();
3111
3112 if (context)
3113 {
Geoff Lang37dde692014-01-31 16:34:54 -05003114 if (!ValidQueryType(context, target))
3115 {
3116 return gl::error(GL_INVALID_ENUM);
3117 }
3118
3119 switch (pname)
3120 {
3121 case GL_CURRENT_QUERY_EXT:
3122 params[0] = context->getActiveQuery(target);
3123 break;
3124
3125 default:
3126 return gl::error(GL_INVALID_ENUM);
3127 }
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003128 }
3129 }
3130 catch(std::bad_alloc&)
3131 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003132 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003133 }
3134}
3135
3136void __stdcall glGetQueryObjectuivEXT(GLuint id, GLenum pname, GLuint *params)
3137{
3138 EVENT("(GLuint id = %d, GLenum pname = 0x%X, GLuint *params = 0x%0.8p)", id, pname, params);
3139
3140 try
3141 {
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003142 gl::Context *context = gl::getNonLostContext();
3143
3144 if (context)
3145 {
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003146 gl::Query *queryObject = context->getQuery(id, false, GL_NONE);
3147
3148 if (!queryObject)
3149 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003150 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003151 }
3152
3153 if (context->getActiveQuery(queryObject->getType()) == id)
3154 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003155 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003156 }
3157
3158 switch(pname)
3159 {
3160 case GL_QUERY_RESULT_EXT:
3161 params[0] = queryObject->getResult();
3162 break;
3163 case GL_QUERY_RESULT_AVAILABLE_EXT:
3164 params[0] = queryObject->isResultAvailable();
3165 break;
3166 default:
Geoff Lang37dde692014-01-31 16:34:54 -05003167 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003168 }
3169 }
3170 }
3171 catch(std::bad_alloc&)
3172 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003173 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003174 }
3175}
3176
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003177void __stdcall glGetRenderbufferParameteriv(GLenum target, GLenum pname, GLint* params)
3178{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003179 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 +00003180
3181 try
3182 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003183 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003184
3185 if (context)
3186 {
3187 if (target != GL_RENDERBUFFER)
3188 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003189 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003190 }
3191
daniel@transgaming.com428d1582010-05-04 03:35:25 +00003192 if (context->getRenderbufferHandle() == 0)
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003193 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003194 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003195 }
3196
daniel@transgaming.com428d1582010-05-04 03:35:25 +00003197 gl::Renderbuffer *renderbuffer = context->getRenderbuffer(context->getRenderbufferHandle());
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003198
3199 switch (pname)
3200 {
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +00003201 case GL_RENDERBUFFER_WIDTH: *params = renderbuffer->getWidth(); break;
3202 case GL_RENDERBUFFER_HEIGHT: *params = renderbuffer->getHeight(); break;
3203 case GL_RENDERBUFFER_INTERNAL_FORMAT: *params = renderbuffer->getInternalFormat(); break;
3204 case GL_RENDERBUFFER_RED_SIZE: *params = renderbuffer->getRedSize(); break;
3205 case GL_RENDERBUFFER_GREEN_SIZE: *params = renderbuffer->getGreenSize(); break;
3206 case GL_RENDERBUFFER_BLUE_SIZE: *params = renderbuffer->getBlueSize(); break;
3207 case GL_RENDERBUFFER_ALPHA_SIZE: *params = renderbuffer->getAlphaSize(); break;
3208 case GL_RENDERBUFFER_DEPTH_SIZE: *params = renderbuffer->getDepthSize(); break;
3209 case GL_RENDERBUFFER_STENCIL_SIZE: *params = renderbuffer->getStencilSize(); break;
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00003210 case GL_RENDERBUFFER_SAMPLES_ANGLE:
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +00003211 if (context->getMaxSupportedSamples() != 0)
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00003212 {
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +00003213 *params = renderbuffer->getSamples();
3214 }
3215 else
3216 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003217 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00003218 }
3219 break;
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003220 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003221 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003222 }
3223 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003224 }
3225 catch(std::bad_alloc&)
3226 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003227 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003228 }
3229}
3230
3231void __stdcall glGetShaderiv(GLuint shader, GLenum pname, GLint* params)
3232{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003233 EVENT("(GLuint shader = %d, GLenum pname = %d, GLint* params = 0x%0.8p)", shader, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003234
3235 try
3236 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003237 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003238
3239 if (context)
3240 {
3241 gl::Shader *shaderObject = context->getShader(shader);
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00003242
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003243 if (!shaderObject)
3244 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003245 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003246 }
3247
3248 switch (pname)
3249 {
3250 case GL_SHADER_TYPE:
3251 *params = shaderObject->getType();
3252 return;
3253 case GL_DELETE_STATUS:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003254 *params = shaderObject->isFlaggedForDeletion();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003255 return;
3256 case GL_COMPILE_STATUS:
3257 *params = shaderObject->isCompiled() ? GL_TRUE : GL_FALSE;
3258 return;
3259 case GL_INFO_LOG_LENGTH:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003260 *params = shaderObject->getInfoLogLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003261 return;
3262 case GL_SHADER_SOURCE_LENGTH:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003263 *params = shaderObject->getSourceLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003264 return;
zmo@google.coma574f782011-10-03 21:45:23 +00003265 case GL_TRANSLATED_SHADER_SOURCE_LENGTH_ANGLE:
3266 *params = shaderObject->getTranslatedSourceLength();
3267 return;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003268 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003269 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003270 }
3271 }
3272 }
3273 catch(std::bad_alloc&)
3274 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003275 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003276 }
3277}
3278
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00003279void __stdcall glGetShaderInfoLog(GLuint shader, GLsizei bufsize, GLsizei* length, GLchar* infolog)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003280{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003281 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 +00003282 shader, bufsize, length, infolog);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003283
3284 try
3285 {
3286 if (bufsize < 0)
3287 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003288 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003289 }
3290
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003291 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003292
3293 if (context)
3294 {
3295 gl::Shader *shaderObject = context->getShader(shader);
3296
3297 if (!shaderObject)
3298 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003299 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003300 }
3301
3302 shaderObject->getInfoLog(bufsize, length, infolog);
3303 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003304 }
3305 catch(std::bad_alloc&)
3306 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003307 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003308 }
3309}
3310
3311void __stdcall glGetShaderPrecisionFormat(GLenum shadertype, GLenum precisiontype, GLint* range, GLint* precision)
3312{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003313 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 +00003314 shadertype, precisiontype, range, precision);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003315
3316 try
3317 {
daniel@transgaming.com6c785212010-03-30 03:36:17 +00003318 switch (shadertype)
3319 {
3320 case GL_VERTEX_SHADER:
3321 case GL_FRAGMENT_SHADER:
3322 break;
3323 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003324 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com6c785212010-03-30 03:36:17 +00003325 }
3326
3327 switch (precisiontype)
3328 {
3329 case GL_LOW_FLOAT:
3330 case GL_MEDIUM_FLOAT:
3331 case GL_HIGH_FLOAT:
3332 // Assume IEEE 754 precision
3333 range[0] = 127;
3334 range[1] = 127;
daniel@transgaming.comc5c15382010-04-23 18:34:49 +00003335 *precision = 23;
daniel@transgaming.com6c785212010-03-30 03:36:17 +00003336 break;
3337 case GL_LOW_INT:
3338 case GL_MEDIUM_INT:
3339 case GL_HIGH_INT:
3340 // Some (most) hardware only supports single-precision floating-point numbers,
3341 // which can accurately represent integers up to +/-16777216
3342 range[0] = 24;
3343 range[1] = 24;
daniel@transgaming.comc5c15382010-04-23 18:34:49 +00003344 *precision = 0;
daniel@transgaming.com6c785212010-03-30 03:36:17 +00003345 break;
3346 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003347 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com6c785212010-03-30 03:36:17 +00003348 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003349 }
3350 catch(std::bad_alloc&)
3351 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003352 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003353 }
3354}
3355
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00003356void __stdcall glGetShaderSource(GLuint shader, GLsizei bufsize, GLsizei* length, GLchar* source)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003357{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003358 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 +00003359 shader, bufsize, length, source);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003360
3361 try
3362 {
3363 if (bufsize < 0)
3364 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003365 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003366 }
3367
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003368 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003369
3370 if (context)
3371 {
3372 gl::Shader *shaderObject = context->getShader(shader);
3373
3374 if (!shaderObject)
3375 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003376 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003377 }
3378
3379 shaderObject->getSource(bufsize, length, source);
3380 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003381 }
3382 catch(std::bad_alloc&)
3383 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003384 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003385 }
3386}
3387
zmo@google.coma574f782011-10-03 21:45:23 +00003388void __stdcall glGetTranslatedShaderSourceANGLE(GLuint shader, GLsizei bufsize, GLsizei* length, GLchar* source)
3389{
3390 EVENT("(GLuint shader = %d, GLsizei bufsize = %d, GLsizei* length = 0x%0.8p, GLchar* source = 0x%0.8p)",
3391 shader, bufsize, length, source);
3392
3393 try
3394 {
3395 if (bufsize < 0)
3396 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003397 return gl::error(GL_INVALID_VALUE);
zmo@google.coma574f782011-10-03 21:45:23 +00003398 }
3399
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003400 gl::Context *context = gl::getNonLostContext();
zmo@google.coma574f782011-10-03 21:45:23 +00003401
3402 if (context)
3403 {
3404 gl::Shader *shaderObject = context->getShader(shader);
3405
3406 if (!shaderObject)
3407 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003408 return gl::error(GL_INVALID_OPERATION);
zmo@google.coma574f782011-10-03 21:45:23 +00003409 }
3410
3411 shaderObject->getTranslatedSource(bufsize, length, source);
3412 }
3413 }
3414 catch(std::bad_alloc&)
3415 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003416 return gl::error(GL_OUT_OF_MEMORY);
zmo@google.coma574f782011-10-03 21:45:23 +00003417 }
3418}
3419
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003420const GLubyte* __stdcall glGetString(GLenum name)
3421{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003422 EVENT("(GLenum name = 0x%X)", name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003423
3424 try
3425 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003426 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com3e4c6002010-05-05 18:50:13 +00003427
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003428 switch (name)
3429 {
3430 case GL_VENDOR:
daniel@transgaming.coma0ce7e62011-01-25 14:47:16 +00003431 return (GLubyte*)"Google Inc.";
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003432 case GL_RENDERER:
daniel@transgaming.comc23ff642011-08-16 20:28:45 +00003433 return (GLubyte*)((context != NULL) ? context->getRendererString() : "ANGLE");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003434 case GL_VERSION:
shannonwoods@chromium.orge2865d02013-05-30 00:06:01 +00003435 if (context->getClientVersion() == 2)
3436 {
Jamie Madill0aa84f62014-02-13 13:17:23 -05003437 return (GLubyte*)"OpenGL ES 2.0 (ANGLE " ANGLE_VERSION_STRING ")";
shannonwoods@chromium.orge2865d02013-05-30 00:06:01 +00003438 }
3439 else
3440 {
Jamie Madill0aa84f62014-02-13 13:17:23 -05003441 return (GLubyte*)"OpenGL ES 3.0 (ANGLE " ANGLE_VERSION_STRING ")";
shannonwoods@chromium.orge2865d02013-05-30 00:06:01 +00003442 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003443 case GL_SHADING_LANGUAGE_VERSION:
shannonwoods@chromium.orge2865d02013-05-30 00:06:01 +00003444 if (context->getClientVersion() == 2)
3445 {
Jamie Madill0aa84f62014-02-13 13:17:23 -05003446 return (GLubyte*)"OpenGL ES GLSL ES 1.00 (ANGLE " ANGLE_VERSION_STRING ")";
shannonwoods@chromium.orge2865d02013-05-30 00:06:01 +00003447 }
3448 else
3449 {
Jamie Madill0aa84f62014-02-13 13:17:23 -05003450 return (GLubyte*)"OpenGL ES GLSL ES 3.00 (ANGLE " ANGLE_VERSION_STRING ")";
shannonwoods@chromium.orge2865d02013-05-30 00:06:01 +00003451 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003452 case GL_EXTENSIONS:
shannonwoods@chromium.org302df742013-05-30 00:05:54 +00003453 return (GLubyte*)((context != NULL) ? context->getCombinedExtensionsString() : "");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003454 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003455 return gl::error(GL_INVALID_ENUM, (GLubyte*)NULL);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003456 }
3457 }
3458 catch(std::bad_alloc&)
3459 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003460 return gl::error(GL_OUT_OF_MEMORY, (GLubyte*)NULL);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003461 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003462}
3463
3464void __stdcall glGetTexParameterfv(GLenum target, GLenum pname, GLfloat* params)
3465{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003466 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 +00003467
3468 try
3469 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003470 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003471
3472 if (context)
3473 {
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05003474 gl::Texture *texture = context->getTargetTexture(target);
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003475
Jamie Madillfb8a8302013-07-03 14:24:12 -04003476 if (!texture)
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003477 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003478 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003479 }
3480
3481 switch (pname)
3482 {
3483 case GL_TEXTURE_MAG_FILTER:
3484 *params = (GLfloat)texture->getMagFilter();
3485 break;
3486 case GL_TEXTURE_MIN_FILTER:
3487 *params = (GLfloat)texture->getMinFilter();
3488 break;
3489 case GL_TEXTURE_WRAP_S:
3490 *params = (GLfloat)texture->getWrapS();
3491 break;
3492 case GL_TEXTURE_WRAP_T:
3493 *params = (GLfloat)texture->getWrapT();
3494 break;
shannon.woods%transgaming.com@gtempaccount.com0b3a8df2013-04-13 03:44:51 +00003495 case GL_TEXTURE_WRAP_R:
3496 if (context->getClientVersion() < 3)
3497 {
3498 return gl::error(GL_INVALID_ENUM);
3499 }
3500 *params = (GLfloat)texture->getWrapR();
3501 break;
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00003502 case GL_TEXTURE_IMMUTABLE_FORMAT:
3503 // Exposed to ES2.0 through EXT_texture_storage, no client version validation.
daniel@transgaming.comd30bd0a2011-11-11 04:10:34 +00003504 *params = (GLfloat)(texture->isImmutable() ? GL_TRUE : GL_FALSE);
3505 break;
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00003506 case GL_TEXTURE_IMMUTABLE_LEVELS:
3507 if (context->getClientVersion() < 3)
3508 {
3509 return gl::error(GL_INVALID_ENUM);
3510 }
Jamie Madill51a94372013-10-24 17:49:43 -04003511 *params = (GLfloat)texture->immutableLevelCount();
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00003512 break;
daniel@transgaming.com7d18c172011-11-11 04:18:21 +00003513 case GL_TEXTURE_USAGE_ANGLE:
3514 *params = (GLfloat)texture->getUsage();
3515 break;
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00003516 case GL_TEXTURE_MAX_ANISOTROPY_EXT:
3517 if (!context->supportsTextureFilterAnisotropy())
3518 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003519 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00003520 }
3521 *params = (GLfloat)texture->getMaxAnisotropy();
3522 break;
Geoff Langbc90a482013-09-17 16:51:27 -04003523 case GL_TEXTURE_SWIZZLE_R:
3524 if (context->getClientVersion() < 3)
3525 {
3526 return gl::error(GL_INVALID_ENUM);
3527 }
3528 *params = (GLfloat)texture->getSwizzleRed();
3529 break;
3530 case GL_TEXTURE_SWIZZLE_G:
3531 if (context->getClientVersion() < 3)
3532 {
3533 return gl::error(GL_INVALID_ENUM);
3534 }
3535 *params = (GLfloat)texture->getSwizzleGreen();
3536 break;
3537 case GL_TEXTURE_SWIZZLE_B:
3538 if (context->getClientVersion() < 3)
3539 {
3540 return gl::error(GL_INVALID_ENUM);
3541 }
3542 *params = (GLfloat)texture->getSwizzleBlue();
3543 break;
3544 case GL_TEXTURE_SWIZZLE_A:
3545 if (context->getClientVersion() < 3)
3546 {
3547 return gl::error(GL_INVALID_ENUM);
3548 }
3549 *params = (GLfloat)texture->getSwizzleAlpha();
3550 break;
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003551 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003552 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003553 }
3554 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003555 }
3556 catch(std::bad_alloc&)
3557 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003558 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003559 }
3560}
3561
3562void __stdcall glGetTexParameteriv(GLenum target, GLenum pname, GLint* params)
3563{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003564 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 +00003565
3566 try
3567 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003568 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003569
3570 if (context)
3571 {
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05003572 gl::Texture *texture = context->getTargetTexture(target);
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003573
Jamie Madillfb8a8302013-07-03 14:24:12 -04003574 if (!texture)
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003575 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003576 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003577 }
3578
3579 switch (pname)
3580 {
3581 case GL_TEXTURE_MAG_FILTER:
3582 *params = texture->getMagFilter();
3583 break;
3584 case GL_TEXTURE_MIN_FILTER:
3585 *params = texture->getMinFilter();
3586 break;
3587 case GL_TEXTURE_WRAP_S:
3588 *params = texture->getWrapS();
3589 break;
3590 case GL_TEXTURE_WRAP_T:
3591 *params = texture->getWrapT();
3592 break;
shannon.woods%transgaming.com@gtempaccount.com0b3a8df2013-04-13 03:44:51 +00003593 case GL_TEXTURE_WRAP_R:
3594 if (context->getClientVersion() < 3)
3595 {
3596 return gl::error(GL_INVALID_ENUM);
3597 }
3598 *params = texture->getWrapR();
3599 break;
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00003600 case GL_TEXTURE_IMMUTABLE_FORMAT:
3601 // Exposed to ES2.0 through EXT_texture_storage, no client version validation.
daniel@transgaming.comd30bd0a2011-11-11 04:10:34 +00003602 *params = texture->isImmutable() ? GL_TRUE : GL_FALSE;
3603 break;
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00003604 case GL_TEXTURE_IMMUTABLE_LEVELS:
3605 if (context->getClientVersion() < 3)
3606 {
3607 return gl::error(GL_INVALID_ENUM);
3608 }
Jamie Madill51a94372013-10-24 17:49:43 -04003609 *params = texture->immutableLevelCount();
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00003610 break;
daniel@transgaming.com7d18c172011-11-11 04:18:21 +00003611 case GL_TEXTURE_USAGE_ANGLE:
3612 *params = texture->getUsage();
3613 break;
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00003614 case GL_TEXTURE_MAX_ANISOTROPY_EXT:
3615 if (!context->supportsTextureFilterAnisotropy())
3616 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003617 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00003618 }
3619 *params = (GLint)texture->getMaxAnisotropy();
3620 break;
Geoff Langbc90a482013-09-17 16:51:27 -04003621 case GL_TEXTURE_SWIZZLE_R:
3622 if (context->getClientVersion() < 3)
3623 {
3624 return gl::error(GL_INVALID_ENUM);
3625 }
3626 *params = texture->getSwizzleRed();
3627 break;
3628 case GL_TEXTURE_SWIZZLE_G:
3629 if (context->getClientVersion() < 3)
3630 {
3631 return gl::error(GL_INVALID_ENUM);
3632 }
3633 *params = texture->getSwizzleGreen();
3634 break;
3635 case GL_TEXTURE_SWIZZLE_B:
3636 if (context->getClientVersion() < 3)
3637 {
3638 return gl::error(GL_INVALID_ENUM);
3639 }
3640 *params = texture->getSwizzleBlue();
3641 break;
3642 case GL_TEXTURE_SWIZZLE_A:
3643 if (context->getClientVersion() < 3)
3644 {
3645 return gl::error(GL_INVALID_ENUM);
3646 }
3647 *params = texture->getSwizzleAlpha();
3648 break;
shannonwoods@chromium.orgabf14cc2013-05-30 00:20:58 +00003649
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003650 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003651 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003652 }
3653 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003654 }
3655 catch(std::bad_alloc&)
3656 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003657 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003658 }
3659}
3660
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003661void __stdcall glGetnUniformfvEXT(GLuint program, GLint location, GLsizei bufSize, GLfloat* params)
3662{
3663 EVENT("(GLuint program = %d, GLint location = %d, GLsizei bufSize = %d, GLfloat* params = 0x%0.8p)",
3664 program, location, bufSize, params);
3665
3666 try
3667 {
3668 if (bufSize < 0)
3669 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003670 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003671 }
3672
3673 gl::Context *context = gl::getNonLostContext();
3674
3675 if (context)
3676 {
3677 if (program == 0)
3678 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003679 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003680 }
3681
3682 gl::Program *programObject = context->getProgram(program);
3683
daniel@transgaming.com716056c2012-07-24 18:38:59 +00003684 if (!programObject || !programObject->isLinked())
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003685 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003686 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003687 }
3688
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003689 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
3690 if (!programBinary)
3691 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003692 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003693 }
3694
3695 if (!programBinary->getUniformfv(location, &bufSize, params))
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003696 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003697 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003698 }
3699 }
3700 }
3701 catch(std::bad_alloc&)
3702 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003703 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003704 }
3705}
3706
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003707void __stdcall glGetUniformfv(GLuint program, GLint location, GLfloat* params)
3708{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003709 EVENT("(GLuint program = %d, GLint location = %d, GLfloat* params = 0x%0.8p)", program, location, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003710
3711 try
3712 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003713 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003714
3715 if (context)
3716 {
3717 if (program == 0)
3718 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003719 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003720 }
3721
3722 gl::Program *programObject = context->getProgram(program);
3723
daniel@transgaming.com716056c2012-07-24 18:38:59 +00003724 if (!programObject || !programObject->isLinked())
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003725 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003726 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003727 }
3728
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003729 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
3730 if (!programBinary)
3731 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003732 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003733 }
3734
3735 if (!programBinary->getUniformfv(location, NULL, params))
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003736 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003737 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003738 }
3739 }
3740 }
3741 catch(std::bad_alloc&)
3742 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003743 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003744 }
3745}
3746
3747void __stdcall glGetnUniformivEXT(GLuint program, GLint location, GLsizei bufSize, GLint* params)
3748{
3749 EVENT("(GLuint program = %d, GLint location = %d, GLsizei bufSize = %d, GLint* params = 0x%0.8p)",
3750 program, location, bufSize, params);
3751
3752 try
3753 {
3754 if (bufSize < 0)
3755 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003756 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003757 }
3758
3759 gl::Context *context = gl::getNonLostContext();
3760
3761 if (context)
3762 {
3763 if (program == 0)
3764 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003765 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003766 }
3767
3768 gl::Program *programObject = context->getProgram(program);
3769
daniel@transgaming.com716056c2012-07-24 18:38:59 +00003770 if (!programObject || !programObject->isLinked())
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003771 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003772 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003773 }
3774
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003775 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
3776 if (!programBinary)
3777 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003778 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003779 }
3780
3781 if (!programBinary->getUniformiv(location, &bufSize, params))
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003782 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003783 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003784 }
3785 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003786 }
3787 catch(std::bad_alloc&)
3788 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003789 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003790 }
3791}
3792
3793void __stdcall glGetUniformiv(GLuint program, GLint location, GLint* params)
3794{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003795 EVENT("(GLuint program = %d, GLint location = %d, GLint* params = 0x%0.8p)", program, location, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003796
3797 try
3798 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003799 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003800
3801 if (context)
3802 {
3803 if (program == 0)
3804 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003805 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003806 }
3807
3808 gl::Program *programObject = context->getProgram(program);
3809
daniel@transgaming.com716056c2012-07-24 18:38:59 +00003810 if (!programObject || !programObject->isLinked())
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003811 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003812 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003813 }
3814
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003815 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
3816 if (!programBinary)
3817 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003818 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003819 }
3820
3821 if (!programBinary->getUniformiv(location, NULL, params))
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003822 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003823 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003824 }
3825 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003826 }
3827 catch(std::bad_alloc&)
3828 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003829 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003830 }
3831}
3832
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00003833int __stdcall glGetUniformLocation(GLuint program, const GLchar* name)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003834{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003835 EVENT("(GLuint program = %d, const GLchar* name = 0x%0.8p)", program, name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003836
3837 try
3838 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003839 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003840
3841 if (strstr(name, "gl_") == name)
3842 {
3843 return -1;
3844 }
3845
3846 if (context)
3847 {
3848 gl::Program *programObject = context->getProgram(program);
3849
3850 if (!programObject)
3851 {
daniel@transgaming.comd1abe5b2010-04-13 19:53:33 +00003852 if (context->getShader(program))
3853 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003854 return gl::error(GL_INVALID_OPERATION, -1);
daniel@transgaming.comd1abe5b2010-04-13 19:53:33 +00003855 }
3856 else
3857 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003858 return gl::error(GL_INVALID_VALUE, -1);
daniel@transgaming.comd1abe5b2010-04-13 19:53:33 +00003859 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003860 }
3861
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003862 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
daniel@transgaming.com716056c2012-07-24 18:38:59 +00003863 if (!programObject->isLinked() || !programBinary)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003864 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003865 return gl::error(GL_INVALID_OPERATION, -1);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003866 }
3867
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003868 return programBinary->getUniformLocation(name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003869 }
3870 }
3871 catch(std::bad_alloc&)
3872 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003873 return gl::error(GL_OUT_OF_MEMORY, -1);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003874 }
3875
3876 return -1;
3877}
3878
3879void __stdcall glGetVertexAttribfv(GLuint index, GLenum pname, GLfloat* params)
3880{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003881 EVENT("(GLuint index = %d, GLenum pname = 0x%X, GLfloat* params = 0x%0.8p)", index, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003882
3883 try
3884 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003885 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003886
daniel@transgaming.come0078962010-04-15 20:45:08 +00003887 if (context)
3888 {
3889 if (index >= gl::MAX_VERTEX_ATTRIBS)
3890 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003891 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.come0078962010-04-15 20:45:08 +00003892 }
3893
daniel@transgaming.com83921382011-01-08 05:46:00 +00003894 const gl::VertexAttribute &attribState = context->getVertexAttribState(index);
daniel@transgaming.com428d1582010-05-04 03:35:25 +00003895
Geoff Lang34dbb6f2013-08-05 15:05:47 -04003896 if (!gl::ValidateGetVertexAttribParameters(pname, context->getClientVersion()))
daniel@transgaming.come0078962010-04-15 20:45:08 +00003897 {
Jamie Madillaff71502013-07-02 11:57:05 -04003898 return;
3899 }
3900
3901 if (pname == GL_CURRENT_VERTEX_ATTRIB)
3902 {
3903 const gl::VertexAttribCurrentValueData &currentValueData = context->getVertexAttribCurrentValue(index);
3904 for (int i = 0; i < 4; ++i)
daniel@transgaming.come0078962010-04-15 20:45:08 +00003905 {
Jamie Madillaff71502013-07-02 11:57:05 -04003906 params[i] = currentValueData.FloatValues[i];
daniel@transgaming.come0078962010-04-15 20:45:08 +00003907 }
Jamie Madillaff71502013-07-02 11:57:05 -04003908 }
3909 else
3910 {
3911 *params = attribState.querySingleParameter<GLfloat>(pname);
daniel@transgaming.come0078962010-04-15 20:45:08 +00003912 }
3913 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003914 }
3915 catch(std::bad_alloc&)
3916 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003917 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003918 }
3919}
3920
3921void __stdcall glGetVertexAttribiv(GLuint index, GLenum pname, GLint* params)
3922{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003923 EVENT("(GLuint index = %d, GLenum pname = 0x%X, GLint* params = 0x%0.8p)", index, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003924
3925 try
3926 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003927 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003928
daniel@transgaming.come0078962010-04-15 20:45:08 +00003929 if (context)
3930 {
3931 if (index >= gl::MAX_VERTEX_ATTRIBS)
3932 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003933 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.come0078962010-04-15 20:45:08 +00003934 }
3935
daniel@transgaming.com83921382011-01-08 05:46:00 +00003936 const gl::VertexAttribute &attribState = context->getVertexAttribState(index);
daniel@transgaming.com428d1582010-05-04 03:35:25 +00003937
Geoff Lang34dbb6f2013-08-05 15:05:47 -04003938 if (!gl::ValidateGetVertexAttribParameters(pname, context->getClientVersion()))
daniel@transgaming.come0078962010-04-15 20:45:08 +00003939 {
Jamie Madillaff71502013-07-02 11:57:05 -04003940 return;
3941 }
3942
3943 if (pname == GL_CURRENT_VERTEX_ATTRIB)
3944 {
3945 const gl::VertexAttribCurrentValueData &currentValueData = context->getVertexAttribCurrentValue(index);
3946 for (int i = 0; i < 4; ++i)
daniel@transgaming.come0078962010-04-15 20:45:08 +00003947 {
Jamie Madillaff71502013-07-02 11:57:05 -04003948 float currentValue = currentValueData.FloatValues[i];
Jamie Madillaf496912013-07-19 16:36:54 -04003949 params[i] = gl::iround<GLint>(currentValue);
daniel@transgaming.come0078962010-04-15 20:45:08 +00003950 }
Jamie Madillaff71502013-07-02 11:57:05 -04003951 }
3952 else
3953 {
3954 *params = attribState.querySingleParameter<GLint>(pname);
daniel@transgaming.come0078962010-04-15 20:45:08 +00003955 }
3956 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003957 }
3958 catch(std::bad_alloc&)
3959 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003960 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003961 }
3962}
3963
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00003964void __stdcall glGetVertexAttribPointerv(GLuint index, GLenum pname, GLvoid** pointer)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003965{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003966 EVENT("(GLuint index = %d, GLenum pname = 0x%X, GLvoid** pointer = 0x%0.8p)", index, pname, pointer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003967
3968 try
3969 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003970 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003971
daniel@transgaming.come0078962010-04-15 20:45:08 +00003972 if (context)
3973 {
3974 if (index >= gl::MAX_VERTEX_ATTRIBS)
3975 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003976 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.come0078962010-04-15 20:45:08 +00003977 }
3978
3979 if (pname != GL_VERTEX_ATTRIB_ARRAY_POINTER)
3980 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003981 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.come0078962010-04-15 20:45:08 +00003982 }
3983
daniel@transgaming.com428d1582010-05-04 03:35:25 +00003984 *pointer = const_cast<GLvoid*>(context->getVertexAttribPointer(index));
daniel@transgaming.come0078962010-04-15 20:45:08 +00003985 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003986 }
3987 catch(std::bad_alloc&)
3988 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003989 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003990 }
3991}
3992
3993void __stdcall glHint(GLenum target, GLenum mode)
3994{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003995 EVENT("(GLenum target = 0x%X, GLenum mode = 0x%X)", target, mode);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003996
3997 try
3998 {
alokp@chromium.orgd303ef92010-09-09 17:30:15 +00003999 switch (mode)
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00004000 {
alokp@chromium.orgd303ef92010-09-09 17:30:15 +00004001 case GL_FASTEST:
4002 case GL_NICEST:
4003 case GL_DONT_CARE:
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00004004 break;
4005 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004006 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00004007 }
4008
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004009 gl::Context *context = gl::getNonLostContext();
alokp@chromium.orgd303ef92010-09-09 17:30:15 +00004010 switch (target)
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00004011 {
alokp@chromium.orgd303ef92010-09-09 17:30:15 +00004012 case GL_GENERATE_MIPMAP_HINT:
4013 if (context) context->setGenerateMipmapHint(mode);
4014 break;
4015 case GL_FRAGMENT_SHADER_DERIVATIVE_HINT_OES:
4016 if (context) context->setFragmentShaderDerivativeHint(mode);
4017 break;
4018 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004019 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00004020 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004021 }
4022 catch(std::bad_alloc&)
4023 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004024 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004025 }
4026}
4027
4028GLboolean __stdcall glIsBuffer(GLuint buffer)
4029{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004030 EVENT("(GLuint buffer = %d)", buffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004031
4032 try
4033 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004034 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004035
4036 if (context && buffer)
4037 {
4038 gl::Buffer *bufferObject = context->getBuffer(buffer);
4039
4040 if (bufferObject)
4041 {
4042 return GL_TRUE;
4043 }
4044 }
4045 }
4046 catch(std::bad_alloc&)
4047 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004048 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004049 }
4050
4051 return GL_FALSE;
4052}
4053
4054GLboolean __stdcall glIsEnabled(GLenum cap)
4055{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004056 EVENT("(GLenum cap = 0x%X)", cap);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004057
4058 try
4059 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004060 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004061
4062 if (context)
4063 {
Geoff Lang0550d032014-01-30 11:29:07 -05004064 if (!ValidCap(context, cap))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004065 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004066 return gl::error(GL_INVALID_ENUM, false);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004067 }
Geoff Lang0550d032014-01-30 11:29:07 -05004068
4069 return context->getCap(cap);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004070 }
4071 }
4072 catch(std::bad_alloc&)
4073 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004074 return gl::error(GL_OUT_OF_MEMORY, false);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004075 }
4076
4077 return false;
4078}
4079
daniel@transgaming.comfe208882010-09-01 15:47:57 +00004080GLboolean __stdcall glIsFenceNV(GLuint fence)
4081{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004082 EVENT("(GLuint fence = %d)", fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004083
4084 try
4085 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004086 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004087
4088 if (context)
4089 {
Jamie Madill33dc8432013-07-26 11:55:05 -04004090 gl::FenceNV *fenceObject = context->getFenceNV(fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004091
4092 if (fenceObject == NULL)
4093 {
4094 return GL_FALSE;
4095 }
4096
4097 return fenceObject->isFence();
4098 }
4099 }
4100 catch(std::bad_alloc&)
4101 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004102 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004103 }
4104
4105 return GL_FALSE;
daniel@transgaming.comfe208882010-09-01 15:47:57 +00004106}
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004107
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004108GLboolean __stdcall glIsFramebuffer(GLuint framebuffer)
4109{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004110 EVENT("(GLuint framebuffer = %d)", framebuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004111
4112 try
4113 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004114 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004115
4116 if (context && framebuffer)
4117 {
4118 gl::Framebuffer *framebufferObject = context->getFramebuffer(framebuffer);
4119
4120 if (framebufferObject)
4121 {
4122 return GL_TRUE;
4123 }
4124 }
4125 }
4126 catch(std::bad_alloc&)
4127 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004128 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004129 }
4130
4131 return GL_FALSE;
4132}
4133
4134GLboolean __stdcall glIsProgram(GLuint program)
4135{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004136 EVENT("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004137
4138 try
4139 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004140 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004141
4142 if (context && program)
4143 {
4144 gl::Program *programObject = context->getProgram(program);
4145
4146 if (programObject)
4147 {
4148 return GL_TRUE;
4149 }
4150 }
4151 }
4152 catch(std::bad_alloc&)
4153 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004154 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004155 }
4156
4157 return GL_FALSE;
4158}
4159
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00004160GLboolean __stdcall glIsQueryEXT(GLuint id)
4161{
4162 EVENT("(GLuint id = %d)", id);
4163
4164 try
4165 {
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00004166 gl::Context *context = gl::getNonLostContext();
4167
4168 if (context)
4169 {
Geoff Lang37dde692014-01-31 16:34:54 -05004170 return (context->getQuery(id, false, GL_NONE) != NULL) ? GL_TRUE : GL_FALSE;
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00004171 }
4172 }
4173 catch(std::bad_alloc&)
4174 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004175 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00004176 }
4177
4178 return GL_FALSE;
4179}
4180
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004181GLboolean __stdcall glIsRenderbuffer(GLuint renderbuffer)
4182{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004183 EVENT("(GLuint renderbuffer = %d)", renderbuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004184
4185 try
4186 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004187 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004188
4189 if (context && renderbuffer)
4190 {
4191 gl::Renderbuffer *renderbufferObject = context->getRenderbuffer(renderbuffer);
4192
4193 if (renderbufferObject)
4194 {
4195 return GL_TRUE;
4196 }
4197 }
4198 }
4199 catch(std::bad_alloc&)
4200 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004201 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004202 }
4203
4204 return GL_FALSE;
4205}
4206
4207GLboolean __stdcall glIsShader(GLuint shader)
4208{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004209 EVENT("(GLuint shader = %d)", shader);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004210
4211 try
4212 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004213 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004214
4215 if (context && shader)
4216 {
4217 gl::Shader *shaderObject = context->getShader(shader);
4218
4219 if (shaderObject)
4220 {
4221 return GL_TRUE;
4222 }
4223 }
4224 }
4225 catch(std::bad_alloc&)
4226 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004227 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004228 }
4229
4230 return GL_FALSE;
4231}
4232
4233GLboolean __stdcall glIsTexture(GLuint texture)
4234{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004235 EVENT("(GLuint texture = %d)", texture);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004236
4237 try
4238 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004239 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004240
4241 if (context && texture)
4242 {
4243 gl::Texture *textureObject = context->getTexture(texture);
4244
4245 if (textureObject)
4246 {
4247 return GL_TRUE;
4248 }
4249 }
4250 }
4251 catch(std::bad_alloc&)
4252 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004253 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004254 }
4255
4256 return GL_FALSE;
4257}
4258
4259void __stdcall glLineWidth(GLfloat width)
4260{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004261 EVENT("(GLfloat width = %f)", width);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004262
4263 try
4264 {
4265 if (width <= 0.0f)
4266 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004267 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004268 }
4269
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004270 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com32e58cd2010-03-24 09:44:10 +00004271
4272 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004273 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004274 context->setLineWidth(width);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004275 }
4276 }
4277 catch(std::bad_alloc&)
4278 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004279 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004280 }
4281}
4282
4283void __stdcall glLinkProgram(GLuint program)
4284{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004285 EVENT("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004286
4287 try
4288 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004289 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004290
4291 if (context)
4292 {
4293 gl::Program *programObject = context->getProgram(program);
4294
4295 if (!programObject)
4296 {
daniel@transgaming.com277b7142010-04-13 03:26:44 +00004297 if (context->getShader(program))
4298 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004299 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com277b7142010-04-13 03:26:44 +00004300 }
4301 else
4302 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004303 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com277b7142010-04-13 03:26:44 +00004304 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004305 }
4306
daniel@transgaming.com95d29422012-07-24 18:36:10 +00004307 context->linkProgram(program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004308 }
4309 }
4310 catch(std::bad_alloc&)
4311 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004312 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004313 }
4314}
4315
4316void __stdcall glPixelStorei(GLenum pname, GLint param)
4317{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004318 EVENT("(GLenum pname = 0x%X, GLint param = %d)", pname, param);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004319
4320 try
4321 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004322 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004323
4324 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004325 {
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004326 switch (pname)
4327 {
4328 case GL_UNPACK_ALIGNMENT:
4329 if (param != 1 && param != 2 && param != 4 && param != 8)
4330 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004331 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004332 }
4333
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004334 context->setUnpackAlignment(param);
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004335 break;
4336
4337 case GL_PACK_ALIGNMENT:
4338 if (param != 1 && param != 2 && param != 4 && param != 8)
4339 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004340 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004341 }
4342
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004343 context->setPackAlignment(param);
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004344 break;
4345
bsalomon@google.com56d46ab2011-11-23 14:53:10 +00004346 case GL_PACK_REVERSE_ROW_ORDER_ANGLE:
4347 context->setPackReverseRowOrder(param != 0);
4348 break;
4349
shannonwoods@chromium.orgabf14cc2013-05-30 00:20:58 +00004350 case GL_UNPACK_IMAGE_HEIGHT:
4351 case GL_UNPACK_SKIP_IMAGES:
4352 case GL_UNPACK_ROW_LENGTH:
4353 case GL_UNPACK_SKIP_ROWS:
4354 case GL_UNPACK_SKIP_PIXELS:
4355 case GL_PACK_ROW_LENGTH:
4356 case GL_PACK_SKIP_ROWS:
4357 case GL_PACK_SKIP_PIXELS:
4358 if (context->getClientVersion() < 3)
4359 {
4360 return gl::error(GL_INVALID_ENUM);
4361 }
4362 UNIMPLEMENTED();
4363 break;
4364
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004365 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004366 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004367 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004368 }
4369 }
4370 catch(std::bad_alloc&)
4371 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004372 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004373 }
4374}
4375
4376void __stdcall glPolygonOffset(GLfloat factor, GLfloat units)
4377{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004378 EVENT("(GLfloat factor = %f, GLfloat units = %f)", factor, units);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004379
4380 try
4381 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004382 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comaede6302010-04-29 03:35:48 +00004383
4384 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004385 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004386 context->setPolygonOffsetParams(factor, units);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004387 }
4388 }
4389 catch(std::bad_alloc&)
4390 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004391 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004392 }
4393}
4394
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00004395void __stdcall glReadnPixelsEXT(GLint x, GLint y, GLsizei width, GLsizei height,
4396 GLenum format, GLenum type, GLsizei bufSize,
4397 GLvoid *data)
4398{
4399 EVENT("(GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d, "
4400 "GLenum format = 0x%X, GLenum type = 0x%X, GLsizei bufSize = 0x%d, GLvoid *data = 0x%0.8p)",
4401 x, y, width, height, format, type, bufSize, data);
4402
4403 try
4404 {
4405 if (width < 0 || height < 0 || bufSize < 0)
4406 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004407 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00004408 }
4409
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00004410 gl::Context *context = gl::getNonLostContext();
4411
4412 if (context)
4413 {
Geoff Lang005df412013-10-16 14:12:50 -04004414 GLenum currentInternalFormat, currentFormat, currentType;
shannonwoods@chromium.org44a4f982013-05-30 00:13:49 +00004415
daniel@transgaming.com42944b02012-09-27 17:45:57 +00004416 // Failure in getCurrentReadFormatType indicates that no color attachment is currently bound,
4417 // and attempting to read back if that's the case is an error. The error will be registered
4418 // by getCurrentReadFormat.
shannonwoods@chromium.org44a4f982013-05-30 00:13:49 +00004419 if (!context->getCurrentReadFormatType(&currentInternalFormat, &currentFormat, &currentType))
daniel@transgaming.com42944b02012-09-27 17:45:57 +00004420 return;
4421
Geoff Lang34dbb6f2013-08-05 15:05:47 -04004422 bool validReadFormat = (context->getClientVersion() < 3) ? gl::ValidES2ReadFormatType(format, type) :
4423 gl::ValidES3ReadFormatType(currentInternalFormat, format, type);
shannonwoods@chromium.org44a4f982013-05-30 00:13:49 +00004424
4425 if (!(currentFormat == format && currentType == type) && !validReadFormat)
daniel@transgaming.com42944b02012-09-27 17:45:57 +00004426 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004427 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com42944b02012-09-27 17:45:57 +00004428 }
4429
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00004430 context->readPixels(x, y, width, height, format, type, &bufSize, data);
4431 }
4432 }
4433 catch(std::bad_alloc&)
4434 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004435 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00004436 }
4437}
4438
4439void __stdcall glReadPixels(GLint x, GLint y, GLsizei width, GLsizei height,
4440 GLenum format, GLenum type, GLvoid* pixels)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004441{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004442 EVENT("(GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00004443 "GLenum format = 0x%X, GLenum type = 0x%X, GLvoid* pixels = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00004444 x, y, width, height, format, type, pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004445
4446 try
4447 {
4448 if (width < 0 || height < 0)
4449 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004450 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004451 }
4452
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004453 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004454
4455 if (context)
4456 {
Geoff Lang005df412013-10-16 14:12:50 -04004457 GLenum currentInternalFormat, currentFormat, currentType;
shannonwoods@chromium.org44a4f982013-05-30 00:13:49 +00004458
daniel@transgaming.com42944b02012-09-27 17:45:57 +00004459 // Failure in getCurrentReadFormatType indicates that no color attachment is currently bound,
4460 // and attempting to read back if that's the case is an error. The error will be registered
4461 // by getCurrentReadFormat.
shannonwoods@chromium.org44a4f982013-05-30 00:13:49 +00004462 if (!context->getCurrentReadFormatType(&currentInternalFormat, &currentFormat, &currentType))
daniel@transgaming.com42944b02012-09-27 17:45:57 +00004463 return;
4464
Geoff Lang34dbb6f2013-08-05 15:05:47 -04004465 bool validReadFormat = (context->getClientVersion() < 3) ? gl::ValidES2ReadFormatType(format, type) :
4466 gl::ValidES3ReadFormatType(currentInternalFormat, format, type);
shannonwoods@chromium.org44a4f982013-05-30 00:13:49 +00004467
4468 if (!(currentFormat == format && currentType == type) && !validReadFormat)
daniel@transgaming.com42944b02012-09-27 17:45:57 +00004469 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004470 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com42944b02012-09-27 17:45:57 +00004471 }
4472
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00004473 context->readPixels(x, y, width, height, format, type, NULL, pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004474 }
4475 }
4476 catch(std::bad_alloc&)
4477 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004478 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004479 }
4480}
4481
4482void __stdcall glReleaseShaderCompiler(void)
4483{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004484 EVENT("()");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004485
4486 try
4487 {
4488 gl::Shader::releaseCompiler();
4489 }
4490 catch(std::bad_alloc&)
4491 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004492 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004493 }
4494}
4495
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00004496void __stdcall glRenderbufferStorageMultisampleANGLE(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004497{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004498 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 +00004499 target, samples, internalformat, width, height);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004500
4501 try
4502 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004503 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004504
4505 if (context)
4506 {
Geoff Lang34dbb6f2013-08-05 15:05:47 -04004507 if (!ValidateRenderbufferStorageParameters(context, target, samples, internalformat,
Geoff Lang2e1dcd52013-05-29 10:34:08 -04004508 width, height, true))
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +00004509 {
Geoff Lang2e1dcd52013-05-29 10:34:08 -04004510 return;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004511 }
shannon.woods%transgaming.com@gtempaccount.com8dce6512013-04-13 03:42:19 +00004512
4513 context->setRenderbufferStorage(width, height, internalformat, samples);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004514 }
4515 }
4516 catch(std::bad_alloc&)
4517 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004518 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004519 }
4520}
4521
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00004522void __stdcall glRenderbufferStorage(GLenum target, GLenum internalformat, GLsizei width, GLsizei height)
4523{
4524 glRenderbufferStorageMultisampleANGLE(target, 0, internalformat, width, height);
4525}
4526
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004527void __stdcall glSampleCoverage(GLclampf value, GLboolean invert)
4528{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00004529 EVENT("(GLclampf value = %f, GLboolean invert = %u)", value, invert);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004530
4531 try
4532 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004533 gl::Context* context = gl::getNonLostContext();
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00004534
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004535 if (context)
4536 {
daniel@transgaming.coma36f98e2010-05-18 18:51:09 +00004537 context->setSampleCoverageParams(gl::clamp01(value), invert == GL_TRUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004538 }
4539 }
4540 catch(std::bad_alloc&)
4541 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004542 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004543 }
4544}
4545
daniel@transgaming.comfe208882010-09-01 15:47:57 +00004546void __stdcall glSetFenceNV(GLuint fence, GLenum condition)
4547{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004548 EVENT("(GLuint fence = %d, GLenum condition = 0x%X)", fence, condition);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004549
4550 try
4551 {
4552 if (condition != GL_ALL_COMPLETED_NV)
4553 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004554 return gl::error(GL_INVALID_ENUM);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004555 }
4556
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004557 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004558
4559 if (context)
4560 {
Jamie Madill33dc8432013-07-26 11:55:05 -04004561 gl::FenceNV *fenceObject = context->getFenceNV(fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004562
4563 if (fenceObject == NULL)
4564 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004565 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004566 }
4567
4568 fenceObject->setFence(condition);
4569 }
4570 }
4571 catch(std::bad_alloc&)
4572 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004573 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004574 }
daniel@transgaming.comfe208882010-09-01 15:47:57 +00004575}
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004576
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004577void __stdcall glScissor(GLint x, GLint y, GLsizei width, GLsizei height)
4578{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004579 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 +00004580
4581 try
4582 {
4583 if (width < 0 || height < 0)
4584 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004585 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004586 }
4587
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004588 gl::Context* context = gl::getNonLostContext();
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00004589
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004590 if (context)
4591 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004592 context->setScissorParams(x, y, width, height);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004593 }
4594 }
4595 catch(std::bad_alloc&)
4596 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004597 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004598 }
4599}
4600
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00004601void __stdcall glShaderBinary(GLsizei n, const GLuint* shaders, GLenum binaryformat, const GLvoid* binary, GLsizei length)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004602{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004603 EVENT("(GLsizei n = %d, const GLuint* shaders = 0x%0.8p, GLenum binaryformat = 0x%X, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00004604 "const GLvoid* binary = 0x%0.8p, GLsizei length = %d)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00004605 n, shaders, binaryformat, binary, length);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004606
4607 try
4608 {
daniel@transgaming.comd1f667f2010-04-29 03:38:52 +00004609 // No binary shader formats are supported.
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004610 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004611 }
4612 catch(std::bad_alloc&)
4613 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004614 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004615 }
4616}
4617
shannon.woods%transgaming.com@gtempaccount.com5f339332013-04-13 03:29:02 +00004618void __stdcall glShaderSource(GLuint shader, GLsizei count, const GLchar* const* string, const GLint* length)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004619{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004620 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 +00004621 shader, count, string, length);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004622
4623 try
4624 {
daniel@transgaming.com8e6a6be2010-04-13 03:26:41 +00004625 if (count < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004626 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004627 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004628 }
4629
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004630 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004631
4632 if (context)
4633 {
4634 gl::Shader *shaderObject = context->getShader(shader);
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00004635
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004636 if (!shaderObject)
4637 {
daniel@transgaming.com8e6a6be2010-04-13 03:26:41 +00004638 if (context->getProgram(shader))
4639 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004640 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com8e6a6be2010-04-13 03:26:41 +00004641 }
4642 else
4643 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004644 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com8e6a6be2010-04-13 03:26:41 +00004645 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004646 }
4647
4648 shaderObject->setSource(count, string, length);
4649 }
4650 }
4651 catch(std::bad_alloc&)
4652 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004653 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004654 }
4655}
4656
4657void __stdcall glStencilFunc(GLenum func, GLint ref, GLuint mask)
4658{
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00004659 glStencilFuncSeparate(GL_FRONT_AND_BACK, func, ref, mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004660}
4661
4662void __stdcall glStencilFuncSeparate(GLenum face, GLenum func, GLint ref, GLuint mask)
4663{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004664 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 +00004665
4666 try
4667 {
4668 switch (face)
4669 {
4670 case GL_FRONT:
4671 case GL_BACK:
4672 case GL_FRONT_AND_BACK:
4673 break;
4674 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004675 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004676 }
4677
4678 switch (func)
4679 {
4680 case GL_NEVER:
4681 case GL_ALWAYS:
4682 case GL_LESS:
4683 case GL_LEQUAL:
4684 case GL_EQUAL:
4685 case GL_GEQUAL:
4686 case GL_GREATER:
4687 case GL_NOTEQUAL:
4688 break;
4689 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004690 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004691 }
4692
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004693 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004694
4695 if (context)
4696 {
4697 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
4698 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004699 context->setStencilParams(func, ref, mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004700 }
4701
4702 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
4703 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004704 context->setStencilBackParams(func, ref, mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004705 }
4706 }
4707 }
4708 catch(std::bad_alloc&)
4709 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004710 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004711 }
4712}
4713
4714void __stdcall glStencilMask(GLuint mask)
4715{
4716 glStencilMaskSeparate(GL_FRONT_AND_BACK, mask);
4717}
4718
4719void __stdcall glStencilMaskSeparate(GLenum face, GLuint mask)
4720{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004721 EVENT("(GLenum face = 0x%X, GLuint mask = %d)", face, mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004722
4723 try
4724 {
4725 switch (face)
4726 {
4727 case GL_FRONT:
4728 case GL_BACK:
4729 case GL_FRONT_AND_BACK:
4730 break;
4731 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004732 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004733 }
4734
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004735 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004736
4737 if (context)
4738 {
4739 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
4740 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004741 context->setStencilWritemask(mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004742 }
4743
4744 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
4745 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004746 context->setStencilBackWritemask(mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004747 }
4748 }
4749 }
4750 catch(std::bad_alloc&)
4751 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004752 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004753 }
4754}
4755
4756void __stdcall glStencilOp(GLenum fail, GLenum zfail, GLenum zpass)
4757{
4758 glStencilOpSeparate(GL_FRONT_AND_BACK, fail, zfail, zpass);
4759}
4760
4761void __stdcall glStencilOpSeparate(GLenum face, GLenum fail, GLenum zfail, GLenum zpass)
4762{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004763 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 +00004764 face, fail, zfail, zpass);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004765
4766 try
4767 {
4768 switch (face)
4769 {
4770 case GL_FRONT:
4771 case GL_BACK:
4772 case GL_FRONT_AND_BACK:
4773 break;
4774 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004775 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004776 }
4777
4778 switch (fail)
4779 {
4780 case GL_ZERO:
4781 case GL_KEEP:
4782 case GL_REPLACE:
4783 case GL_INCR:
4784 case GL_DECR:
4785 case GL_INVERT:
4786 case GL_INCR_WRAP:
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00004787 case GL_DECR_WRAP:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004788 break;
4789 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004790 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004791 }
4792
4793 switch (zfail)
4794 {
4795 case GL_ZERO:
4796 case GL_KEEP:
4797 case GL_REPLACE:
4798 case GL_INCR:
4799 case GL_DECR:
4800 case GL_INVERT:
4801 case GL_INCR_WRAP:
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00004802 case GL_DECR_WRAP:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004803 break;
4804 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004805 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004806 }
4807
4808 switch (zpass)
4809 {
4810 case GL_ZERO:
4811 case GL_KEEP:
4812 case GL_REPLACE:
4813 case GL_INCR:
4814 case GL_DECR:
4815 case GL_INVERT:
4816 case GL_INCR_WRAP:
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00004817 case GL_DECR_WRAP:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004818 break;
4819 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004820 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004821 }
4822
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004823 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004824
4825 if (context)
4826 {
4827 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
4828 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004829 context->setStencilOperations(fail, zfail, zpass);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004830 }
4831
4832 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
4833 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004834 context->setStencilBackOperations(fail, zfail, zpass);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004835 }
4836 }
4837 }
4838 catch(std::bad_alloc&)
4839 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004840 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004841 }
4842}
4843
daniel@transgaming.comfe208882010-09-01 15:47:57 +00004844GLboolean __stdcall glTestFenceNV(GLuint fence)
4845{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004846 EVENT("(GLuint fence = %d)", fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004847
4848 try
4849 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004850 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004851
4852 if (context)
4853 {
Jamie Madill33dc8432013-07-26 11:55:05 -04004854 gl::FenceNV *fenceObject = context->getFenceNV(fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004855
4856 if (fenceObject == NULL)
4857 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004858 return gl::error(GL_INVALID_OPERATION, GL_TRUE);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004859 }
4860
Jamie Madillfb9a7402013-07-26 11:55:01 -04004861 if (fenceObject->isFence() != GL_TRUE)
4862 {
4863 return gl::error(GL_INVALID_OPERATION, GL_TRUE);
4864 }
4865
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004866 return fenceObject->testFence();
4867 }
4868 }
4869 catch(std::bad_alloc&)
4870 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004871 gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004872 }
4873
4874 return GL_TRUE;
daniel@transgaming.comfe208882010-09-01 15:47:57 +00004875}
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004876
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00004877void __stdcall glTexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height,
4878 GLint border, GLenum format, GLenum type, const GLvoid* pixels)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004879{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004880 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint internalformat = %d, GLsizei width = %d, GLsizei height = %d, "
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05004881 "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 +00004882 target, level, internalformat, width, height, border, format, type, pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004883
4884 try
4885 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004886 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004887
4888 if (context)
4889 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00004890 if (context->getClientVersion() < 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -04004891 !ValidateES2TexImageParameters(context, target, level, internalformat, false, false,
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00004892 0, 0, width, height, border, format, type, pixels))
daniel@transgaming.com32b11442011-11-19 02:42:48 +00004893 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00004894 return;
4895 }
4896
4897 if (context->getClientVersion() >= 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -04004898 !ValidateES3TexImageParameters(context, target, level, internalformat, false, false,
Jamie Madillefb2a6f2013-09-24 10:22:42 -04004899 0, 0, 0, width, height, 1, border, format, type, pixels))
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00004900 {
4901 return;
daniel@transgaming.com32b11442011-11-19 02:42:48 +00004902 }
4903
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00004904 switch (target)
4905 {
4906 case GL_TEXTURE_2D:
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00004907 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00004908 gl::Texture2D *texture = context->getTexture2D();
Jamie Madill88f18f42013-09-18 14:36:19 -04004909 texture->setImage(level, width, height, internalformat, format, type, context->getUnpackState(), pixels);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00004910 }
4911 break;
4912 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00004913 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00004914 gl::TextureCubeMap *texture = context->getTextureCubeMap();
Jamie Madill88f18f42013-09-18 14:36:19 -04004915 texture->setImagePosX(level, width, height, internalformat, format, type, context->getUnpackState(), pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004916 }
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00004917 break;
4918 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
4919 {
4920 gl::TextureCubeMap *texture = context->getTextureCubeMap();
Jamie Madill88f18f42013-09-18 14:36:19 -04004921 texture->setImageNegX(level, width, height, internalformat, format, type, context->getUnpackState(), pixels);
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00004922 }
4923 break;
4924 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
4925 {
4926 gl::TextureCubeMap *texture = context->getTextureCubeMap();
Jamie Madill88f18f42013-09-18 14:36:19 -04004927 texture->setImagePosY(level, width, height, internalformat, format, type, context->getUnpackState(), pixels);
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00004928 }
4929 break;
4930 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
4931 {
4932 gl::TextureCubeMap *texture = context->getTextureCubeMap();
Jamie Madill88f18f42013-09-18 14:36:19 -04004933 texture->setImageNegY(level, width, height, internalformat, format, type, context->getUnpackState(), pixels);
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00004934 }
4935 break;
4936 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
4937 {
4938 gl::TextureCubeMap *texture = context->getTextureCubeMap();
Jamie Madill88f18f42013-09-18 14:36:19 -04004939 texture->setImagePosZ(level, width, height, internalformat, format, type, context->getUnpackState(), pixels);
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00004940 }
4941 break;
4942 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
4943 {
4944 gl::TextureCubeMap *texture = context->getTextureCubeMap();
Jamie Madill88f18f42013-09-18 14:36:19 -04004945 texture->setImageNegZ(level, width, height, internalformat, format, type, context->getUnpackState(), pixels);
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00004946 }
4947 break;
4948 default: UNREACHABLE();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004949 }
4950 }
4951 }
4952 catch(std::bad_alloc&)
4953 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004954 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004955 }
4956}
4957
4958void __stdcall glTexParameterf(GLenum target, GLenum pname, GLfloat param)
4959{
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00004960 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLint param = %f)", target, pname, param);
4961
4962 try
4963 {
4964 gl::Context *context = gl::getNonLostContext();
4965
4966 if (context)
4967 {
Geoff Lang34dbb6f2013-08-05 15:05:47 -04004968 if (!ValidateTexParamParameters(context, pname, static_cast<GLint>(param)))
Jamie Madill478fdb22013-07-19 16:36:59 -04004969 {
4970 return;
4971 }
4972
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05004973 gl::Texture *texture = context->getTargetTexture(target);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00004974
Jamie Madillfb8a8302013-07-03 14:24:12 -04004975 if (!texture)
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00004976 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004977 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00004978 }
4979
4980 switch (pname)
4981 {
Jamie Madill478fdb22013-07-19 16:36:59 -04004982 case GL_TEXTURE_WRAP_S: texture->setWrapS(gl::uiround<GLenum>(param)); break;
4983 case GL_TEXTURE_WRAP_T: texture->setWrapT(gl::uiround<GLenum>(param)); break;
4984 case GL_TEXTURE_WRAP_R: texture->setWrapR(gl::uiround<GLenum>(param)); break;
4985 case GL_TEXTURE_MIN_FILTER: texture->setMinFilter(gl::uiround<GLenum>(param)); break;
4986 case GL_TEXTURE_MAG_FILTER: texture->setMagFilter(gl::uiround<GLenum>(param)); break;
4987 case GL_TEXTURE_USAGE_ANGLE: texture->setUsage(gl::uiround<GLenum>(param)); break;
4988 case GL_TEXTURE_MAX_ANISOTROPY_EXT: texture->setMaxAnisotropy(static_cast<GLfloat>(param), context->getTextureMaxAnisotropy()); break;
4989 case GL_TEXTURE_COMPARE_MODE: texture->setCompareMode(gl::uiround<GLenum>(param)); break;
4990 case GL_TEXTURE_COMPARE_FUNC: texture->setCompareFunc(gl::uiround<GLenum>(param)); break;
Geoff Langbc90a482013-09-17 16:51:27 -04004991 case GL_TEXTURE_SWIZZLE_R: texture->setSwizzleRed(gl::uiround<GLenum>(param)); break;
4992 case GL_TEXTURE_SWIZZLE_G: texture->setSwizzleGreen(gl::uiround<GLenum>(param)); break;
4993 case GL_TEXTURE_SWIZZLE_B: texture->setSwizzleBlue(gl::uiround<GLenum>(param)); break;
4994 case GL_TEXTURE_SWIZZLE_A: texture->setSwizzleAlpha(gl::uiround<GLenum>(param)); break;
shannonwoods@chromium.orgabf14cc2013-05-30 00:20:58 +00004995
Jamie Madill478fdb22013-07-19 16:36:59 -04004996 case GL_TEXTURE_BASE_LEVEL:
4997 case GL_TEXTURE_MAX_LEVEL:
shannonwoods@chromium.orgabf14cc2013-05-30 00:20:58 +00004998 case GL_TEXTURE_MIN_LOD:
4999 case GL_TEXTURE_MAX_LOD:
shannonwoods@chromium.orgabf14cc2013-05-30 00:20:58 +00005000 UNIMPLEMENTED();
5001 break;
5002
Jamie Madill478fdb22013-07-19 16:36:59 -04005003 default: UNREACHABLE(); break;
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005004 }
5005 }
5006 }
5007 catch(std::bad_alloc&)
5008 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005009 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005010 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005011}
5012
5013void __stdcall glTexParameterfv(GLenum target, GLenum pname, const GLfloat* params)
5014{
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005015 glTexParameterf(target, pname, (GLfloat)*params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005016}
5017
5018void __stdcall glTexParameteri(GLenum target, GLenum pname, GLint param)
5019{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005020 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLint param = %d)", target, pname, param);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005021
5022 try
5023 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005024 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005025
5026 if (context)
5027 {
Geoff Lang34dbb6f2013-08-05 15:05:47 -04005028 if (!ValidateTexParamParameters(context, pname, param))
Jamie Madill478fdb22013-07-19 16:36:59 -04005029 {
5030 return;
5031 }
5032
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05005033 gl::Texture *texture = context->getTargetTexture(target);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005034
Jamie Madillfb8a8302013-07-03 14:24:12 -04005035 if (!texture)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005036 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005037 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005038 }
5039
5040 switch (pname)
5041 {
Jamie Madill478fdb22013-07-19 16:36:59 -04005042 case GL_TEXTURE_WRAP_S: texture->setWrapS((GLenum)param); break;
5043 case GL_TEXTURE_WRAP_T: texture->setWrapT((GLenum)param); break;
5044 case GL_TEXTURE_WRAP_R: texture->setWrapR((GLenum)param); break;
5045 case GL_TEXTURE_MIN_FILTER: texture->setMinFilter((GLenum)param); break;
5046 case GL_TEXTURE_MAG_FILTER: texture->setMagFilter((GLenum)param); break;
5047 case GL_TEXTURE_USAGE_ANGLE: texture->setUsage((GLenum)param); break;
5048 case GL_TEXTURE_MAX_ANISOTROPY_EXT: texture->setMaxAnisotropy((float)param, context->getTextureMaxAnisotropy()); break;
5049 case GL_TEXTURE_COMPARE_MODE: texture->setCompareMode((GLenum)param); break;
5050 case GL_TEXTURE_COMPARE_FUNC: texture->setCompareFunc((GLenum)param); break;
Geoff Langbc90a482013-09-17 16:51:27 -04005051 case GL_TEXTURE_SWIZZLE_R: texture->setSwizzleRed((GLenum)param); break;
5052 case GL_TEXTURE_SWIZZLE_G: texture->setSwizzleGreen((GLenum)param); break;
5053 case GL_TEXTURE_SWIZZLE_B: texture->setSwizzleBlue((GLenum)param); break;
5054 case GL_TEXTURE_SWIZZLE_A: texture->setSwizzleAlpha((GLenum)param); break;
shannonwoods@chromium.orgabf14cc2013-05-30 00:20:58 +00005055
shannonwoods@chromium.orgabf14cc2013-05-30 00:20:58 +00005056 case GL_TEXTURE_BASE_LEVEL:
5057 case GL_TEXTURE_MAX_LEVEL:
Jamie Madill478fdb22013-07-19 16:36:59 -04005058 case GL_TEXTURE_MIN_LOD:
5059 case GL_TEXTURE_MAX_LOD:
shannonwoods@chromium.orgabf14cc2013-05-30 00:20:58 +00005060 UNIMPLEMENTED();
5061 break;
5062
Jamie Madill478fdb22013-07-19 16:36:59 -04005063 default: UNREACHABLE(); break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005064 }
5065 }
5066 }
5067 catch(std::bad_alloc&)
5068 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005069 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005070 }
5071}
5072
5073void __stdcall glTexParameteriv(GLenum target, GLenum pname, const GLint* params)
5074{
5075 glTexParameteri(target, pname, *params);
5076}
5077
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005078void __stdcall glTexStorage2DEXT(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height)
5079{
5080 EVENT("(GLenum target = 0x%X, GLsizei levels = %d, GLenum internalformat = 0x%X, GLsizei width = %d, GLsizei height = %d)",
5081 target, levels, internalformat, width, height);
5082
5083 try
5084 {
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005085 gl::Context *context = gl::getNonLostContext();
5086
5087 if (context)
5088 {
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00005089 if (context->getClientVersion() < 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -04005090 !ValidateES2TexStorageParameters(context, target, levels, internalformat, width, height))
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +00005091 {
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00005092 return;
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +00005093 }
5094
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00005095 if (context->getClientVersion() >= 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -04005096 !ValidateES3TexStorageParameters(context, target, levels, internalformat, width, height, 1))
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +00005097 {
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00005098 return;
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +00005099 }
5100
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00005101 switch (target)
5102 {
5103 case GL_TEXTURE_2D:
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00005104 {
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00005105 gl::Texture2D *texture2d = context->getTexture2D();
5106 texture2d->storage(levels, internalformat, width, height);
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00005107 }
5108 break;
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00005109
Geoff Lang01c21d22013-09-24 11:52:16 -04005110 case GL_TEXTURE_CUBE_MAP:
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00005111 {
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00005112 gl::TextureCubeMap *textureCube = context->getTextureCubeMap();
5113 textureCube->storage(levels, internalformat, width);
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00005114 }
5115 break;
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00005116
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00005117 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005118 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00005119 }
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005120 }
5121 }
5122 catch(std::bad_alloc&)
5123 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005124 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005125 }
5126}
5127
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00005128void __stdcall glTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height,
5129 GLenum format, GLenum type, const GLvoid* pixels)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005130{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005131 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00005132 "GLsizei width = %d, GLsizei height = %d, GLenum format = 0x%X, GLenum type = 0x%X, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00005133 "const GLvoid* pixels = 0x%0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005134 target, level, xoffset, yoffset, width, height, format, type, pixels);
5135
5136 try
5137 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005138 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005139
5140 if (context)
5141 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005142 if (context->getClientVersion() < 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -04005143 !ValidateES2TexImageParameters(context, target, level, GL_NONE, false, true,
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005144 0, 0, width, height, 0, format, type, pixels))
daniel@transgaming.com1d2d3c42012-05-31 01:14:15 +00005145 {
5146 return;
5147 }
5148
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005149 if (context->getClientVersion() >= 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -04005150 !ValidateES3TexImageParameters(context, target, level, GL_NONE, false, true,
Jamie Madillefb2a6f2013-09-24 10:22:42 -04005151 0, 0, 0, width, height, 1, 0, format, type, pixels))
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005152 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005153 return;
5154 }
5155
5156 switch (target)
5157 {
5158 case GL_TEXTURE_2D:
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005159 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005160 gl::Texture2D *texture = context->getTexture2D();
Jamie Madill88f18f42013-09-18 14:36:19 -04005161 texture->subImage(level, xoffset, yoffset, width, height, format, type, context->getUnpackState(), pixels);
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005162 }
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005163 break;
5164
5165 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
5166 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
5167 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
5168 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
5169 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
5170 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005171 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005172 gl::TextureCubeMap *texture = context->getTextureCubeMap();
Jamie Madill88f18f42013-09-18 14:36:19 -04005173 texture->subImage(target, level, xoffset, yoffset, width, height, format, type, context->getUnpackState(), pixels);
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005174 }
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005175 break;
5176
5177 default:
Geoff Lang01c21d22013-09-24 11:52:16 -04005178 UNREACHABLE();
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005179 }
5180 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005181 }
5182 catch(std::bad_alloc&)
5183 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005184 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005185 }
5186}
5187
5188void __stdcall glUniform1f(GLint location, GLfloat x)
5189{
5190 glUniform1fv(location, 1, &x);
5191}
5192
5193void __stdcall glUniform1fv(GLint location, GLsizei count, const GLfloat* v)
5194{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005195 EVENT("(GLint location = %d, GLsizei count = %d, const GLfloat* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005196
5197 try
5198 {
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005199 if (count < 0)
5200 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005201 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005202 }
5203
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005204 if (location == -1)
5205 {
5206 return;
5207 }
5208
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005209 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005210
5211 if (context)
5212 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00005213 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005214 if (!programBinary)
5215 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005216 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005217 }
5218
5219 if (!programBinary->setUniform1fv(location, count, v))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005220 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005221 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005222 }
5223 }
5224 }
5225 catch(std::bad_alloc&)
5226 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005227 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005228 }
5229}
5230
5231void __stdcall glUniform1i(GLint location, GLint x)
5232{
5233 glUniform1iv(location, 1, &x);
5234}
5235
5236void __stdcall glUniform1iv(GLint location, GLsizei count, const GLint* v)
5237{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005238 EVENT("(GLint location = %d, GLsizei count = %d, const GLint* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005239
5240 try
5241 {
5242 if (count < 0)
5243 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005244 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005245 }
5246
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005247 if (location == -1)
5248 {
5249 return;
5250 }
5251
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005252 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005253
5254 if (context)
5255 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00005256 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005257 if (!programBinary)
5258 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005259 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005260 }
5261
5262 if (!programBinary->setUniform1iv(location, count, v))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005263 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005264 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005265 }
5266 }
5267 }
5268 catch(std::bad_alloc&)
5269 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005270 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005271 }
5272}
5273
5274void __stdcall glUniform2f(GLint location, GLfloat x, GLfloat y)
5275{
5276 GLfloat xy[2] = {x, y};
5277
5278 glUniform2fv(location, 1, (GLfloat*)&xy);
5279}
5280
5281void __stdcall glUniform2fv(GLint location, GLsizei count, const GLfloat* v)
5282{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005283 EVENT("(GLint location = %d, GLsizei count = %d, const GLfloat* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005284
5285 try
5286 {
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005287 if (count < 0)
5288 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005289 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005290 }
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005291
5292 if (location == -1)
5293 {
5294 return;
5295 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005296
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005297 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005298
5299 if (context)
5300 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00005301 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005302 if (!programBinary)
5303 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005304 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005305 }
5306
5307 if (!programBinary->setUniform2fv(location, count, v))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005308 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005309 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005310 }
5311 }
5312 }
5313 catch(std::bad_alloc&)
5314 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005315 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005316 }
5317}
5318
5319void __stdcall glUniform2i(GLint location, GLint x, GLint y)
5320{
5321 GLint xy[4] = {x, y};
5322
5323 glUniform2iv(location, 1, (GLint*)&xy);
5324}
5325
5326void __stdcall glUniform2iv(GLint location, GLsizei count, const GLint* v)
5327{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005328 EVENT("(GLint location = %d, GLsizei count = %d, const GLint* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005329
5330 try
5331 {
5332 if (count < 0)
5333 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005334 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005335 }
5336
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005337 if (location == -1)
5338 {
5339 return;
5340 }
5341
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005342 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005343
5344 if (context)
5345 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00005346 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005347 if (!programBinary)
5348 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005349 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005350 }
5351
5352 if (!programBinary->setUniform2iv(location, count, v))
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005353 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005354 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005355 }
5356 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005357 }
5358 catch(std::bad_alloc&)
5359 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005360 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005361 }
5362}
5363
5364void __stdcall glUniform3f(GLint location, GLfloat x, GLfloat y, GLfloat z)
5365{
5366 GLfloat xyz[3] = {x, y, z};
5367
5368 glUniform3fv(location, 1, (GLfloat*)&xyz);
5369}
5370
5371void __stdcall glUniform3fv(GLint location, GLsizei count, const GLfloat* v)
5372{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005373 EVENT("(GLint location = %d, GLsizei count = %d, const GLfloat* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005374
5375 try
5376 {
5377 if (count < 0)
5378 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005379 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005380 }
5381
5382 if (location == -1)
5383 {
5384 return;
5385 }
5386
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005387 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005388
5389 if (context)
5390 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00005391 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005392 if (!programBinary)
5393 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005394 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005395 }
5396
5397 if (!programBinary->setUniform3fv(location, count, v))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005398 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005399 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005400 }
5401 }
5402 }
5403 catch(std::bad_alloc&)
5404 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005405 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005406 }
5407}
5408
5409void __stdcall glUniform3i(GLint location, GLint x, GLint y, GLint z)
5410{
5411 GLint xyz[3] = {x, y, z};
5412
5413 glUniform3iv(location, 1, (GLint*)&xyz);
5414}
5415
5416void __stdcall glUniform3iv(GLint location, GLsizei count, const GLint* v)
5417{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005418 EVENT("(GLint location = %d, GLsizei count = %d, const GLint* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005419
5420 try
5421 {
5422 if (count < 0)
5423 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005424 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005425 }
5426
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005427 if (location == -1)
5428 {
5429 return;
5430 }
5431
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005432 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005433
5434 if (context)
5435 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00005436 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005437 if (!programBinary)
5438 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005439 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005440 }
5441
5442 if (!programBinary->setUniform3iv(location, count, v))
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005443 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005444 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005445 }
5446 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005447 }
5448 catch(std::bad_alloc&)
5449 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005450 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005451 }
5452}
5453
5454void __stdcall glUniform4f(GLint location, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
5455{
5456 GLfloat xyzw[4] = {x, y, z, w};
5457
5458 glUniform4fv(location, 1, (GLfloat*)&xyzw);
5459}
5460
5461void __stdcall glUniform4fv(GLint location, GLsizei count, const GLfloat* v)
5462{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005463 EVENT("(GLint location = %d, GLsizei count = %d, const GLfloat* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005464
5465 try
5466 {
5467 if (count < 0)
5468 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005469 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005470 }
5471
5472 if (location == -1)
5473 {
5474 return;
5475 }
5476
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005477 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005478
5479 if (context)
5480 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00005481 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005482 if (!programBinary)
5483 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005484 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005485 }
5486
5487 if (!programBinary->setUniform4fv(location, count, v))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005488 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005489 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005490 }
5491 }
5492 }
5493 catch(std::bad_alloc&)
5494 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005495 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005496 }
5497}
5498
5499void __stdcall glUniform4i(GLint location, GLint x, GLint y, GLint z, GLint w)
5500{
5501 GLint xyzw[4] = {x, y, z, w};
5502
5503 glUniform4iv(location, 1, (GLint*)&xyzw);
5504}
5505
5506void __stdcall glUniform4iv(GLint location, GLsizei count, const GLint* v)
5507{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005508 EVENT("(GLint location = %d, GLsizei count = %d, const GLint* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005509
5510 try
5511 {
5512 if (count < 0)
5513 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005514 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005515 }
5516
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005517 if (location == -1)
5518 {
5519 return;
5520 }
5521
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005522 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005523
5524 if (context)
5525 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00005526 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005527 if (!programBinary)
5528 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005529 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005530 }
5531
5532 if (!programBinary->setUniform4iv(location, count, v))
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005533 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005534 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005535 }
5536 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005537 }
5538 catch(std::bad_alloc&)
5539 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005540 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005541 }
5542}
5543
5544void __stdcall glUniformMatrix2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
5545{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005546 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00005547 location, count, transpose, value);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005548
5549 try
5550 {
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00005551 if (count < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005552 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005553 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005554 }
5555
5556 if (location == -1)
5557 {
5558 return;
5559 }
5560
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005561 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005562
5563 if (context)
5564 {
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00005565 if (transpose != GL_FALSE && context->getClientVersion() < 3)
5566 {
5567 return gl::error(GL_INVALID_VALUE);
5568 }
5569
daniel@transgaming.com62a28462012-07-24 18:33:59 +00005570 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005571 if (!programBinary)
5572 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005573 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005574 }
5575
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00005576 if (!programBinary->setUniformMatrix2fv(location, count, transpose, value))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005577 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005578 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005579 }
5580 }
5581 }
5582 catch(std::bad_alloc&)
5583 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005584 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005585 }
5586}
5587
5588void __stdcall glUniformMatrix3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
5589{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005590 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00005591 location, count, transpose, value);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005592
5593 try
5594 {
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00005595 if (count < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005596 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005597 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005598 }
5599
5600 if (location == -1)
5601 {
5602 return;
5603 }
5604
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005605 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005606
5607 if (context)
5608 {
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00005609 if (transpose != GL_FALSE && context->getClientVersion() < 3)
5610 {
5611 return gl::error(GL_INVALID_VALUE);
5612 }
5613
daniel@transgaming.com62a28462012-07-24 18:33:59 +00005614 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005615 if (!programBinary)
5616 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005617 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005618 }
5619
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00005620 if (!programBinary->setUniformMatrix3fv(location, count, transpose, value))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005621 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005622 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005623 }
5624 }
5625 }
5626 catch(std::bad_alloc&)
5627 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005628 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005629 }
5630}
5631
5632void __stdcall glUniformMatrix4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
5633{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005634 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00005635 location, count, transpose, value);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005636
5637 try
5638 {
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00005639 if (count < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005640 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005641 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005642 }
5643
5644 if (location == -1)
5645 {
5646 return;
5647 }
5648
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005649 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005650
5651 if (context)
5652 {
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00005653 if (transpose != GL_FALSE && context->getClientVersion() < 3)
5654 {
5655 return gl::error(GL_INVALID_VALUE);
5656 }
5657
daniel@transgaming.com62a28462012-07-24 18:33:59 +00005658 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005659 if (!programBinary)
5660 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005661 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005662 }
5663
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00005664 if (!programBinary->setUniformMatrix4fv(location, count, transpose, value))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005665 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005666 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005667 }
5668 }
5669 }
5670 catch(std::bad_alloc&)
5671 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005672 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005673 }
5674}
5675
5676void __stdcall glUseProgram(GLuint program)
5677{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005678 EVENT("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005679
5680 try
5681 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005682 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005683
5684 if (context)
5685 {
5686 gl::Program *programObject = context->getProgram(program);
5687
daniel@transgaming.comc8478202010-04-13 19:53:35 +00005688 if (!programObject && program != 0)
5689 {
5690 if (context->getShader(program))
5691 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005692 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comc8478202010-04-13 19:53:35 +00005693 }
5694 else
5695 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005696 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comc8478202010-04-13 19:53:35 +00005697 }
5698 }
5699
daniel@transgaming.com716056c2012-07-24 18:38:59 +00005700 if (program != 0 && !programObject->isLinked())
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 context->useProgram(program);
5706 }
5707 }
5708 catch(std::bad_alloc&)
5709 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005710 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005711 }
5712}
5713
5714void __stdcall glValidateProgram(GLuint program)
5715{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005716 EVENT("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005717
5718 try
5719 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005720 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00005721
5722 if (context)
5723 {
5724 gl::Program *programObject = context->getProgram(program);
5725
5726 if (!programObject)
5727 {
5728 if (context->getShader(program))
5729 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005730 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00005731 }
5732 else
5733 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005734 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00005735 }
5736 }
5737
apatrick@chromium.org253b8d22012-06-22 19:27:21 +00005738 programObject->validate();
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00005739 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005740 }
5741 catch(std::bad_alloc&)
5742 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005743 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005744 }
5745}
5746
5747void __stdcall glVertexAttrib1f(GLuint index, GLfloat x)
5748{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005749 EVENT("(GLuint index = %d, GLfloat x = %f)", index, x);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005750
5751 try
5752 {
5753 if (index >= gl::MAX_VERTEX_ATTRIBS)
5754 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005755 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005756 }
5757
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005758 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005759
5760 if (context)
5761 {
5762 GLfloat vals[4] = { x, 0, 0, 1 };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00005763 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005764 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005765 }
5766 catch(std::bad_alloc&)
5767 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005768 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005769 }
5770}
5771
5772void __stdcall glVertexAttrib1fv(GLuint index, const GLfloat* values)
5773{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005774 EVENT("(GLuint index = %d, const GLfloat* values = 0x%0.8p)", index, values);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005775
5776 try
5777 {
5778 if (index >= gl::MAX_VERTEX_ATTRIBS)
5779 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005780 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005781 }
5782
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005783 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005784
5785 if (context)
5786 {
5787 GLfloat vals[4] = { values[0], 0, 0, 1 };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00005788 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005789 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005790 }
5791 catch(std::bad_alloc&)
5792 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005793 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005794 }
5795}
5796
5797void __stdcall glVertexAttrib2f(GLuint index, GLfloat x, GLfloat y)
5798{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005799 EVENT("(GLuint index = %d, GLfloat x = %f, GLfloat y = %f)", index, x, y);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005800
5801 try
5802 {
5803 if (index >= gl::MAX_VERTEX_ATTRIBS)
5804 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005805 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005806 }
5807
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005808 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005809
5810 if (context)
5811 {
5812 GLfloat vals[4] = { x, y, 0, 1 };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00005813 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005814 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005815 }
5816 catch(std::bad_alloc&)
5817 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005818 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005819 }
5820}
5821
5822void __stdcall glVertexAttrib2fv(GLuint index, const GLfloat* values)
5823{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005824 EVENT("(GLuint index = %d, const GLfloat* values = 0x%0.8p)", index, values);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005825
5826 try
5827 {
5828 if (index >= gl::MAX_VERTEX_ATTRIBS)
5829 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005830 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005831 }
5832
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005833 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005834
5835 if (context)
5836 {
5837 GLfloat vals[4] = { values[0], values[1], 0, 1 };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00005838 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005839 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005840 }
5841 catch(std::bad_alloc&)
5842 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005843 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005844 }
5845}
5846
5847void __stdcall glVertexAttrib3f(GLuint index, GLfloat x, GLfloat y, GLfloat z)
5848{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005849 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 +00005850
5851 try
5852 {
5853 if (index >= gl::MAX_VERTEX_ATTRIBS)
5854 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005855 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005856 }
5857
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005858 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005859
5860 if (context)
5861 {
5862 GLfloat vals[4] = { x, y, z, 1 };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00005863 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005864 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005865 }
5866 catch(std::bad_alloc&)
5867 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005868 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005869 }
5870}
5871
5872void __stdcall glVertexAttrib3fv(GLuint index, const GLfloat* values)
5873{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005874 EVENT("(GLuint index = %d, const GLfloat* values = 0x%0.8p)", index, values);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005875
5876 try
5877 {
5878 if (index >= gl::MAX_VERTEX_ATTRIBS)
5879 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005880 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005881 }
5882
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005883 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005884
5885 if (context)
5886 {
5887 GLfloat vals[4] = { values[0], values[1], values[2], 1 };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00005888 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005889 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005890 }
5891 catch(std::bad_alloc&)
5892 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005893 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005894 }
5895}
5896
5897void __stdcall glVertexAttrib4f(GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
5898{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005899 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 +00005900
5901 try
5902 {
5903 if (index >= gl::MAX_VERTEX_ATTRIBS)
5904 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005905 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005906 }
5907
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005908 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005909
5910 if (context)
5911 {
5912 GLfloat vals[4] = { x, y, z, w };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00005913 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005914 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005915 }
5916 catch(std::bad_alloc&)
5917 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005918 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005919 }
5920}
5921
5922void __stdcall glVertexAttrib4fv(GLuint index, const GLfloat* values)
5923{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005924 EVENT("(GLuint index = %d, const GLfloat* values = 0x%0.8p)", index, values);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005925
5926 try
5927 {
5928 if (index >= gl::MAX_VERTEX_ATTRIBS)
5929 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005930 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005931 }
5932
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005933 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005934
5935 if (context)
5936 {
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00005937 context->setVertexAttribf(index, values);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005938 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005939 }
5940 catch(std::bad_alloc&)
5941 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005942 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005943 }
5944}
5945
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00005946void __stdcall glVertexAttribDivisorANGLE(GLuint index, GLuint divisor)
5947{
5948 EVENT("(GLuint index = %d, GLuint divisor = %d)", index, divisor);
5949
5950 try
5951 {
5952 if (index >= gl::MAX_VERTEX_ATTRIBS)
5953 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005954 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00005955 }
5956
5957 gl::Context *context = gl::getNonLostContext();
5958
5959 if (context)
5960 {
5961 context->setVertexAttribDivisor(index, divisor);
5962 }
5963 }
5964 catch(std::bad_alloc&)
5965 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005966 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00005967 }
5968}
5969
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00005970void __stdcall glVertexAttribPointer(GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid* ptr)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005971{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005972 EVENT("(GLuint index = %d, GLint size = %d, GLenum type = 0x%X, "
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005973 "GLboolean normalized = %u, GLsizei stride = %d, const GLvoid* ptr = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00005974 index, size, type, normalized, stride, ptr);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005975
5976 try
5977 {
5978 if (index >= gl::MAX_VERTEX_ATTRIBS)
5979 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005980 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005981 }
5982
5983 if (size < 1 || size > 4)
5984 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005985 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005986 }
5987
shannon.woods%transgaming.com@gtempaccount.com1a4e09a2013-04-13 03:33:30 +00005988 gl::Context *context = gl::getNonLostContext();
5989
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005990 switch (type)
5991 {
5992 case GL_BYTE:
5993 case GL_UNSIGNED_BYTE:
5994 case GL_SHORT:
5995 case GL_UNSIGNED_SHORT:
5996 case GL_FIXED:
5997 case GL_FLOAT:
5998 break;
shannon.woods%transgaming.com@gtempaccount.com1a4e09a2013-04-13 03:33:30 +00005999 case GL_HALF_FLOAT:
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00006000 case GL_INT:
6001 case GL_UNSIGNED_INT:
shannon.woods%transgaming.com@gtempaccount.com1ab57be2013-04-13 03:38:39 +00006002 case GL_INT_2_10_10_10_REV:
6003 case GL_UNSIGNED_INT_2_10_10_10_REV:
shannon.woods%transgaming.com@gtempaccount.com1a4e09a2013-04-13 03:33:30 +00006004 if (context && context->getClientVersion() < 3)
6005 {
6006 return gl::error(GL_INVALID_ENUM);
6007 }
6008 else
6009 {
6010 break;
6011 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006012 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006013 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006014 }
6015
6016 if (stride < 0)
6017 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006018 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006019 }
6020
shannon.woods%transgaming.com@gtempaccount.com1ab57be2013-04-13 03:38:39 +00006021 if ((type == GL_INT_2_10_10_10_REV || type == GL_UNSIGNED_INT_2_10_10_10_REV) && size != 4)
6022 {
6023 return gl::error(GL_INVALID_OPERATION);
6024 }
6025
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006026 if (context)
6027 {
Jamie Madilld8db8662013-07-02 11:57:04 -04006028 // [OpenGL ES 3.0.2] Section 2.8 page 24:
6029 // An INVALID_OPERATION error is generated when a non-zero vertex array object
6030 // is bound, zero is bound to the ARRAY_BUFFER buffer object binding point,
6031 // and the pointer argument is not NULL.
6032 if (context->getVertexArrayHandle() != 0 && context->getArrayBufferHandle() == 0 && ptr != NULL)
6033 {
6034 return gl::error(GL_INVALID_OPERATION);
6035 }
6036
shannon.woods%transgaming.com@gtempaccount.com8de4e6a2013-04-13 03:37:44 +00006037 context->setVertexAttribState(index, context->getArrayBuffer(), size, type,
6038 normalized == GL_TRUE, false, stride, ptr);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006039 }
6040 }
6041 catch(std::bad_alloc&)
6042 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006043 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006044 }
6045}
6046
6047void __stdcall glViewport(GLint x, GLint y, GLsizei width, GLsizei height)
6048{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006049 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 +00006050
6051 try
6052 {
6053 if (width < 0 || height < 0)
6054 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006055 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006056 }
6057
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006058 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006059
6060 if (context)
6061 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00006062 context->setViewportParams(x, y, width, height);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006063 }
6064 }
6065 catch(std::bad_alloc&)
6066 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006067 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006068 }
6069}
6070
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006071// OpenGL ES 3.0 functions
6072
6073void __stdcall glReadBuffer(GLenum mode)
6074{
6075 EVENT("(GLenum mode = 0x%X)", mode);
6076
6077 try
6078 {
6079 gl::Context *context = gl::getNonLostContext();
6080
6081 if (context)
6082 {
6083 if (context->getClientVersion() < 3)
6084 {
6085 return gl::error(GL_INVALID_OPERATION);
6086 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006087
Jamie Madill54133512013-06-21 09:33:07 -04006088 // glReadBuffer
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006089 UNIMPLEMENTED();
6090 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006091 }
6092 catch(std::bad_alloc&)
6093 {
6094 return gl::error(GL_OUT_OF_MEMORY);
6095 }
6096}
6097
6098void __stdcall glDrawRangeElements(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid* indices)
6099{
6100 EVENT("(GLenum mode = 0x%X, GLuint start = %u, GLuint end = %u, GLsizei count = %d, GLenum type = 0x%X, "
6101 "const GLvoid* indices = 0x%0.8p)", mode, start, end, count, type, indices);
6102
6103 try
6104 {
6105 gl::Context *context = gl::getNonLostContext();
6106
6107 if (context)
6108 {
6109 if (context->getClientVersion() < 3)
6110 {
6111 return gl::error(GL_INVALID_OPERATION);
6112 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006113
Jamie Madill54133512013-06-21 09:33:07 -04006114 // glDrawRangeElements
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006115 UNIMPLEMENTED();
6116 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006117 }
6118 catch(std::bad_alloc&)
6119 {
6120 return gl::error(GL_OUT_OF_MEMORY);
6121 }
6122}
6123
6124void __stdcall glTexImage3D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid* pixels)
6125{
6126 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint internalformat = %d, GLsizei width = %d, "
6127 "GLsizei height = %d, GLsizei depth = %d, GLint border = %d, GLenum format = 0x%X, "
6128 "GLenum type = 0x%X, const GLvoid* pixels = 0x%0.8p)",
6129 target, level, internalformat, width, height, depth, border, format, type, pixels);
6130
6131 try
6132 {
6133 gl::Context *context = gl::getNonLostContext();
6134
6135 if (context)
6136 {
6137 if (context->getClientVersion() < 3)
6138 {
6139 return gl::error(GL_INVALID_OPERATION);
6140 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006141
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006142 // validateES3TexImageFormat sets the error code if there is an error
Geoff Lang34dbb6f2013-08-05 15:05:47 -04006143 if (!ValidateES3TexImageParameters(context, target, level, internalformat, false, false,
Jamie Madillefb2a6f2013-09-24 10:22:42 -04006144 0, 0, 0, width, height, depth, border, format, type, pixels))
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006145 {
6146 return;
6147 }
6148
6149 switch(target)
6150 {
6151 case GL_TEXTURE_3D:
6152 {
6153 gl::Texture3D *texture = context->getTexture3D();
Jamie Madill88f18f42013-09-18 14:36:19 -04006154 texture->setImage(level, width, height, depth, internalformat, format, type, context->getUnpackState(), pixels);
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006155 }
6156 break;
6157
6158 case GL_TEXTURE_2D_ARRAY:
shannon.woods%transgaming.com@gtempaccount.com14e8f592013-04-13 03:46:21 +00006159 {
6160 gl::Texture2DArray *texture = context->getTexture2DArray();
Jamie Madill88f18f42013-09-18 14:36:19 -04006161 texture->setImage(level, width, height, depth, internalformat, format, type, context->getUnpackState(), pixels);
shannon.woods%transgaming.com@gtempaccount.com14e8f592013-04-13 03:46:21 +00006162 }
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006163 break;
6164
6165 default:
6166 return gl::error(GL_INVALID_ENUM);
6167 }
6168 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006169 }
6170 catch(std::bad_alloc&)
6171 {
6172 return gl::error(GL_OUT_OF_MEMORY);
6173 }
6174}
6175
6176void __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)
6177{
6178 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
6179 "GLint zoffset = %d, GLsizei width = %d, GLsizei height = %d, GLsizei depth = %d, "
6180 "GLenum format = 0x%X, GLenum type = 0x%X, const GLvoid* pixels = 0x%0.8p)",
6181 target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels);
6182
6183 try
6184 {
6185 gl::Context *context = gl::getNonLostContext();
6186
6187 if (context)
6188 {
6189 if (context->getClientVersion() < 3)
6190 {
6191 return gl::error(GL_INVALID_OPERATION);
6192 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006193
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006194 // validateES3TexImageFormat sets the error code if there is an error
Geoff Lang34dbb6f2013-08-05 15:05:47 -04006195 if (!ValidateES3TexImageParameters(context, target, level, GL_NONE, false, true,
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006196 xoffset, yoffset, zoffset, width, height, depth, 0,
Jamie Madillefb2a6f2013-09-24 10:22:42 -04006197 format, type, pixels))
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006198 {
6199 return;
6200 }
6201
6202 switch(target)
6203 {
6204 case GL_TEXTURE_3D:
6205 {
6206 gl::Texture3D *texture = context->getTexture3D();
Jamie Madill88f18f42013-09-18 14:36:19 -04006207 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 +00006208 }
6209 break;
6210
6211 case GL_TEXTURE_2D_ARRAY:
shannon.woods%transgaming.com@gtempaccount.com14e8f592013-04-13 03:46:21 +00006212 {
6213 gl::Texture2DArray *texture = context->getTexture2DArray();
Jamie Madill88f18f42013-09-18 14:36:19 -04006214 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 +00006215 }
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006216 break;
6217
6218 default:
6219 return gl::error(GL_INVALID_ENUM);
6220 }
6221 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006222 }
6223 catch(std::bad_alloc&)
6224 {
6225 return gl::error(GL_OUT_OF_MEMORY);
6226 }
6227}
6228
6229void __stdcall glCopyTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height)
6230{
6231 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
6232 "GLint zoffset = %d, GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d)",
6233 target, level, xoffset, yoffset, zoffset, x, y, width, height);
6234
6235 try
6236 {
6237 gl::Context *context = gl::getNonLostContext();
6238
6239 if (context)
6240 {
6241 if (context->getClientVersion() < 3)
6242 {
6243 return gl::error(GL_INVALID_OPERATION);
6244 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006245
Geoff Lang34dbb6f2013-08-05 15:05:47 -04006246 if (!ValidateES3CopyTexImageParameters(context, target, level, GL_NONE, false, xoffset, yoffset, zoffset,
shannonwoods@chromium.org6cf2b0e2013-05-30 00:13:36 +00006247 x, y, width, height, 0))
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006248 {
6249 return;
6250 }
6251
6252 gl::Framebuffer *framebuffer = context->getReadFramebuffer();
6253 gl::Texture *texture = NULL;
6254 switch (target)
6255 {
6256 case GL_TEXTURE_3D:
6257 texture = context->getTexture3D();
6258 break;
6259
6260 case GL_TEXTURE_2D_ARRAY:
shannon.woods%transgaming.com@gtempaccount.com14e8f592013-04-13 03:46:21 +00006261 texture = context->getTexture2DArray();
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006262 break;
6263
6264 default:
6265 return gl::error(GL_INVALID_ENUM);
6266 }
6267
6268 texture->copySubImage(target, level, xoffset, yoffset, zoffset, x, y, width, height, framebuffer);
6269 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006270 }
6271 catch(std::bad_alloc&)
6272 {
6273 return gl::error(GL_OUT_OF_MEMORY);
6274 }
6275}
6276
6277void __stdcall glCompressedTexImage3D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid* data)
6278{
Geoff Langeef52cc2013-10-16 15:07:39 -04006279 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 +00006280 "GLsizei height = %d, GLsizei depth = %d, GLint border = %d, GLsizei imageSize = %d, "
6281 "const GLvoid* data = 0x%0.8p)",
6282 target, level, internalformat, width, height, depth, border, imageSize, data);
6283
6284 try
6285 {
6286 gl::Context *context = gl::getNonLostContext();
6287
6288 if (context)
6289 {
6290 if (context->getClientVersion() < 3)
6291 {
6292 return gl::error(GL_INVALID_OPERATION);
6293 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006294
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +00006295 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 +00006296 {
6297 return gl::error(GL_INVALID_VALUE);
6298 }
6299
6300 // validateES3TexImageFormat sets the error code if there is an error
Geoff Lang34dbb6f2013-08-05 15:05:47 -04006301 if (!ValidateES3TexImageParameters(context, target, level, internalformat, true, false,
Jamie Madillefb2a6f2013-09-24 10:22:42 -04006302 0, 0, 0, width, height, depth, border, GL_NONE, GL_NONE, data))
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006303 {
6304 return;
6305 }
6306
6307 switch(target)
6308 {
6309 case GL_TEXTURE_3D:
6310 {
6311 gl::Texture3D *texture = context->getTexture3D();
6312 texture->setCompressedImage(level, internalformat, width, height, depth, imageSize, data);
6313 }
6314 break;
6315
6316 case GL_TEXTURE_2D_ARRAY:
shannon.woods%transgaming.com@gtempaccount.com14e8f592013-04-13 03:46:21 +00006317 {
6318 gl::Texture2DArray *texture = context->getTexture2DArray();
6319 texture->setCompressedImage(level, internalformat, width, height, depth, imageSize, data);
6320 }
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006321 break;
6322
6323 default:
6324 return gl::error(GL_INVALID_ENUM);
6325 }
6326 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006327 }
6328 catch(std::bad_alloc&)
6329 {
6330 return gl::error(GL_OUT_OF_MEMORY);
6331 }
6332}
6333
6334void __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)
6335{
6336 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
6337 "GLint zoffset = %d, GLsizei width = %d, GLsizei height = %d, GLsizei depth = %d, "
6338 "GLenum format = 0x%X, GLsizei imageSize = %d, const GLvoid* data = 0x%0.8p)",
6339 target, level, xoffset, yoffset, zoffset, width, height, depth, format, imageSize, data);
6340
6341 try
6342 {
6343 gl::Context *context = gl::getNonLostContext();
6344
6345 if (context)
6346 {
6347 if (context->getClientVersion() < 3)
6348 {
6349 return gl::error(GL_INVALID_OPERATION);
6350 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006351
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +00006352 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 +00006353 {
6354 return gl::error(GL_INVALID_VALUE);
6355 }
6356
6357 if (!data)
6358 {
6359 return gl::error(GL_INVALID_VALUE);
6360 }
6361
6362 // validateES3TexImageFormat sets the error code if there is an error
Geoff Lang34dbb6f2013-08-05 15:05:47 -04006363 if (!ValidateES3TexImageParameters(context, target, level, GL_NONE, true, true,
Jamie Madillefb2a6f2013-09-24 10:22:42 -04006364 0, 0, 0, width, height, depth, 0, GL_NONE, GL_NONE, data))
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006365 {
6366 return;
6367 }
6368
6369 switch(target)
6370 {
6371 case GL_TEXTURE_3D:
6372 {
6373 gl::Texture3D *texture = context->getTexture3D();
6374 texture->subImageCompressed(level, xoffset, yoffset, zoffset, width, height, depth,
6375 format, imageSize, data);
6376 }
6377 break;
6378
6379 case GL_TEXTURE_2D_ARRAY:
shannon.woods%transgaming.com@gtempaccount.com14e8f592013-04-13 03:46:21 +00006380 {
6381 gl::Texture2DArray *texture = context->getTexture2DArray();
6382 texture->subImageCompressed(level, xoffset, yoffset, zoffset, width, height, depth,
6383 format, imageSize, data);
6384 }
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006385 break;
6386
6387 default:
6388 return gl::error(GL_INVALID_ENUM);
6389 }
6390 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006391 }
6392 catch(std::bad_alloc&)
6393 {
6394 return gl::error(GL_OUT_OF_MEMORY);
6395 }
6396}
6397
6398void __stdcall glGenQueries(GLsizei n, GLuint* ids)
6399{
6400 EVENT("(GLsizei n = %d, GLuint* ids = 0x%0.8p)", n, ids);
6401
6402 try
6403 {
6404 gl::Context *context = gl::getNonLostContext();
6405
6406 if (context)
6407 {
6408 if (context->getClientVersion() < 3)
6409 {
6410 return gl::error(GL_INVALID_OPERATION);
6411 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006412
Geoff Lang37dde692014-01-31 16:34:54 -05006413 if (n < 0)
6414 {
6415 return gl::error(GL_INVALID_VALUE);
6416 }
6417
6418 for (GLsizei i = 0; i < n; i++)
6419 {
6420 ids[i] = context->createQuery();
6421 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006422 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006423 }
6424 catch(std::bad_alloc&)
6425 {
6426 return gl::error(GL_OUT_OF_MEMORY);
6427 }
6428}
6429
6430void __stdcall glDeleteQueries(GLsizei n, const GLuint* ids)
6431{
6432 EVENT("(GLsizei n = %d, GLuint* ids = 0x%0.8p)", n, ids);
6433
6434 try
6435 {
6436 gl::Context *context = gl::getNonLostContext();
6437
6438 if (context)
6439 {
6440 if (context->getClientVersion() < 3)
6441 {
6442 return gl::error(GL_INVALID_OPERATION);
6443 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006444
Geoff Lang37dde692014-01-31 16:34:54 -05006445 if (n < 0)
6446 {
6447 return gl::error(GL_INVALID_VALUE);
6448 }
6449
6450 for (GLsizei i = 0; i < n; i++)
6451 {
6452 context->deleteQuery(ids[i]);
6453 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006454 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006455 }
6456 catch(std::bad_alloc&)
6457 {
6458 return gl::error(GL_OUT_OF_MEMORY);
6459 }
6460}
6461
6462GLboolean __stdcall glIsQuery(GLuint id)
6463{
6464 EVENT("(GLuint id = %u)", id);
6465
6466 try
6467 {
6468 gl::Context *context = gl::getNonLostContext();
6469
6470 if (context)
6471 {
6472 if (context->getClientVersion() < 3)
6473 {
6474 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
6475 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006476
Geoff Lang37dde692014-01-31 16:34:54 -05006477 return (context->getQuery(id, false, GL_NONE) != NULL) ? GL_TRUE : GL_FALSE;
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006478 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006479 }
6480 catch(std::bad_alloc&)
6481 {
6482 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
6483 }
6484
6485 return GL_FALSE;
6486}
6487
6488void __stdcall glBeginQuery(GLenum target, GLuint id)
6489{
6490 EVENT("(GLenum target = 0x%X, GLuint id = %u)", target, id);
6491
6492 try
6493 {
6494 gl::Context *context = gl::getNonLostContext();
6495
6496 if (context)
6497 {
6498 if (context->getClientVersion() < 3)
6499 {
6500 return gl::error(GL_INVALID_OPERATION);
6501 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006502
Geoff Lang37dde692014-01-31 16:34:54 -05006503 if (!ValidQueryType(context, target))
Jamie Madill3641b4b2013-07-26 12:54:59 -04006504 {
Geoff Lang37dde692014-01-31 16:34:54 -05006505 return gl::error(GL_INVALID_ENUM);
Jamie Madill3641b4b2013-07-26 12:54:59 -04006506 }
6507
6508 if (id == 0)
6509 {
6510 return gl::error(GL_INVALID_OPERATION);
6511 }
6512
Geoff Lang37dde692014-01-31 16:34:54 -05006513 context->beginQuery(target, id);
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);
6519 }
6520}
6521
6522void __stdcall glEndQuery(GLenum target)
6523{
6524 EVENT("(GLenum target = 0x%X)", target);
6525
6526 try
6527 {
6528 gl::Context *context = gl::getNonLostContext();
6529
6530 if (context)
6531 {
6532 if (context->getClientVersion() < 3)
6533 {
6534 return gl::error(GL_INVALID_OPERATION);
6535 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006536
Geoff Lang37dde692014-01-31 16:34:54 -05006537 if (!ValidQueryType(context, target))
Jamie Madill3641b4b2013-07-26 12:54:59 -04006538 {
Geoff Lang37dde692014-01-31 16:34:54 -05006539 return gl::error(GL_INVALID_ENUM);
Jamie Madill3641b4b2013-07-26 12:54:59 -04006540 }
Geoff Lang37dde692014-01-31 16:34:54 -05006541
6542 context->endQuery(target);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006543 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006544 }
6545 catch(std::bad_alloc&)
6546 {
6547 return gl::error(GL_OUT_OF_MEMORY);
6548 }
6549}
6550
6551void __stdcall glGetQueryiv(GLenum target, GLenum pname, GLint* params)
6552{
6553 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLint* params = 0x%0.8p)", target, pname, params);
6554
6555 try
6556 {
6557 gl::Context *context = gl::getNonLostContext();
6558
6559 if (context)
6560 {
6561 if (context->getClientVersion() < 3)
6562 {
6563 return gl::error(GL_INVALID_OPERATION);
6564 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006565
Geoff Lang37dde692014-01-31 16:34:54 -05006566 if (!ValidQueryType(context, target))
Jamie Madill3641b4b2013-07-26 12:54:59 -04006567 {
Geoff Lang37dde692014-01-31 16:34:54 -05006568 return gl::error(GL_INVALID_ENUM);
Jamie Madill3641b4b2013-07-26 12:54:59 -04006569 }
Geoff Lang37dde692014-01-31 16:34:54 -05006570
6571 switch (pname)
Jamie Madill3641b4b2013-07-26 12:54:59 -04006572 {
Geoff Lang37dde692014-01-31 16:34:54 -05006573 case GL_CURRENT_QUERY:
6574 params[0] = context->getActiveQuery(target);
6575 break;
6576
6577 default:
6578 return gl::error(GL_INVALID_ENUM);
Jamie Madill3641b4b2013-07-26 12:54:59 -04006579 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006580 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006581 }
6582 catch(std::bad_alloc&)
6583 {
6584 return gl::error(GL_OUT_OF_MEMORY);
6585 }
6586}
6587
6588void __stdcall glGetQueryObjectuiv(GLuint id, GLenum pname, GLuint* params)
6589{
6590 EVENT("(GLuint id = %u, GLenum pname = 0x%X, GLint* params = 0x%0.8p)", id, pname, params);
6591
6592 try
6593 {
6594 gl::Context *context = gl::getNonLostContext();
6595
6596 if (context)
6597 {
6598 if (context->getClientVersion() < 3)
6599 {
6600 return gl::error(GL_INVALID_OPERATION);
6601 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006602
Geoff Lang37dde692014-01-31 16:34:54 -05006603 gl::Query *queryObject = context->getQuery(id, false, GL_NONE);
6604
6605 if (!queryObject)
6606 {
6607 return gl::error(GL_INVALID_OPERATION);
6608 }
6609
6610 if (context->getActiveQuery(queryObject->getType()) == id)
6611 {
6612 return gl::error(GL_INVALID_OPERATION);
6613 }
6614
6615 switch(pname)
6616 {
6617 case GL_QUERY_RESULT:
6618 params[0] = queryObject->getResult();
6619 break;
6620 case GL_QUERY_RESULT_AVAILABLE:
6621 params[0] = queryObject->isResultAvailable();
6622 break;
6623 default:
6624 return gl::error(GL_INVALID_ENUM);
6625 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006626 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006627 }
6628 catch(std::bad_alloc&)
6629 {
6630 return gl::error(GL_OUT_OF_MEMORY);
6631 }
6632}
6633
6634GLboolean __stdcall glUnmapBuffer(GLenum target)
6635{
6636 EVENT("(GLenum target = 0x%X)", target);
6637
6638 try
6639 {
6640 gl::Context *context = gl::getNonLostContext();
6641
6642 if (context)
6643 {
6644 if (context->getClientVersion() < 3)
6645 {
6646 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
6647 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006648
Jamie Madill54133512013-06-21 09:33:07 -04006649 // glUnmapBuffer
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006650 UNIMPLEMENTED();
6651 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006652 }
6653 catch(std::bad_alloc&)
6654 {
6655 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
6656 }
6657
6658 return GL_FALSE;
6659}
6660
6661void __stdcall glGetBufferPointerv(GLenum target, GLenum pname, GLvoid** params)
6662{
6663 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLvoid** params = 0x%0.8p)", target, pname, params);
6664
6665 try
6666 {
6667 gl::Context *context = gl::getNonLostContext();
6668
6669 if (context)
6670 {
6671 if (context->getClientVersion() < 3)
6672 {
6673 return gl::error(GL_INVALID_OPERATION);
6674 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006675
Jamie Madill54133512013-06-21 09:33:07 -04006676 // glGetBufferPointerv
shannonwoods@chromium.org2d2190a2013-05-30 00:17:35 +00006677 UNIMPLEMENTED();
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006678 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006679 }
6680 catch(std::bad_alloc&)
6681 {
6682 return gl::error(GL_OUT_OF_MEMORY);
6683 }
6684}
6685
6686void __stdcall glDrawBuffers(GLsizei n, const GLenum* bufs)
6687{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006688 try
6689 {
6690 gl::Context *context = gl::getNonLostContext();
6691
6692 if (context)
6693 {
6694 if (context->getClientVersion() < 3)
6695 {
6696 return gl::error(GL_INVALID_OPERATION);
6697 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006698
shannon.woods%transgaming.com@gtempaccount.com7948c5f2013-04-13 03:38:58 +00006699 glDrawBuffersEXT(n, bufs);
6700 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006701 }
6702 catch(std::bad_alloc&)
6703 {
6704 return gl::error(GL_OUT_OF_MEMORY);
6705 }
6706}
6707
6708void __stdcall glUniformMatrix2x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
6709{
6710 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
6711 location, count, transpose, value);
6712
6713 try
6714 {
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006715 if (count < 0)
6716 {
6717 return gl::error(GL_INVALID_VALUE);
6718 }
6719
6720 if (location == -1)
6721 {
6722 return;
6723 }
6724
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006725 gl::Context *context = gl::getNonLostContext();
6726
6727 if (context)
6728 {
6729 if (context->getClientVersion() < 3)
6730 {
6731 return gl::error(GL_INVALID_OPERATION);
6732 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006733
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006734 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
6735 if (!programBinary)
6736 {
6737 return gl::error(GL_INVALID_OPERATION);
6738 }
6739
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00006740 if (!programBinary->setUniformMatrix2x3fv(location, count, transpose, value))
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006741 {
6742 return gl::error(GL_INVALID_OPERATION);
6743 }
6744 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006745 }
6746 catch(std::bad_alloc&)
6747 {
6748 return gl::error(GL_OUT_OF_MEMORY);
6749 }
6750}
6751
6752void __stdcall glUniformMatrix3x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
6753{
6754 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
6755 location, count, transpose, value);
6756
6757 try
6758 {
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006759 if (count < 0)
6760 {
6761 return gl::error(GL_INVALID_VALUE);
6762 }
6763
6764 if (location == -1)
6765 {
6766 return;
6767 }
6768
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006769 gl::Context *context = gl::getNonLostContext();
6770
6771 if (context)
6772 {
6773 if (context->getClientVersion() < 3)
6774 {
6775 return gl::error(GL_INVALID_OPERATION);
6776 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006777
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006778 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
6779 if (!programBinary)
6780 {
6781 return gl::error(GL_INVALID_OPERATION);
6782 }
6783
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00006784 if (!programBinary->setUniformMatrix3x2fv(location, count, transpose, value))
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006785 {
6786 return gl::error(GL_INVALID_OPERATION);
6787 }
6788 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006789 }
6790 catch(std::bad_alloc&)
6791 {
6792 return gl::error(GL_OUT_OF_MEMORY);
6793 }
6794}
6795
6796void __stdcall glUniformMatrix2x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
6797{
6798 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
6799 location, count, transpose, value);
6800
6801 try
6802 {
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006803 if (count < 0)
6804 {
6805 return gl::error(GL_INVALID_VALUE);
6806 }
6807
6808 if (location == -1)
6809 {
6810 return;
6811 }
6812
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006813 gl::Context *context = gl::getNonLostContext();
6814
6815 if (context)
6816 {
6817 if (context->getClientVersion() < 3)
6818 {
6819 return gl::error(GL_INVALID_OPERATION);
6820 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006821
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006822 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
6823 if (!programBinary)
6824 {
6825 return gl::error(GL_INVALID_OPERATION);
6826 }
6827
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00006828 if (!programBinary->setUniformMatrix2x4fv(location, count, transpose, value))
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006829 {
6830 return gl::error(GL_INVALID_OPERATION);
6831 }
6832 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006833 }
6834 catch(std::bad_alloc&)
6835 {
6836 return gl::error(GL_OUT_OF_MEMORY);
6837 }
6838}
6839
6840void __stdcall glUniformMatrix4x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
6841{
6842 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
6843 location, count, transpose, value);
6844
6845 try
6846 {
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006847 if (count < 0)
6848 {
6849 return gl::error(GL_INVALID_VALUE);
6850 }
6851
6852 if (location == -1)
6853 {
6854 return;
6855 }
6856
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006857 gl::Context *context = gl::getNonLostContext();
6858
6859 if (context)
6860 {
6861 if (context->getClientVersion() < 3)
6862 {
6863 return gl::error(GL_INVALID_OPERATION);
6864 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006865
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006866 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
6867 if (!programBinary)
6868 {
6869 return gl::error(GL_INVALID_OPERATION);
6870 }
6871
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00006872 if (!programBinary->setUniformMatrix4x2fv(location, count, transpose, value))
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006873 {
6874 return gl::error(GL_INVALID_OPERATION);
6875 }
6876 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006877 }
6878 catch(std::bad_alloc&)
6879 {
6880 return gl::error(GL_OUT_OF_MEMORY);
6881 }
6882}
6883
6884void __stdcall glUniformMatrix3x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
6885{
6886 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
6887 location, count, transpose, value);
6888
6889 try
6890 {
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006891 if (count < 0)
6892 {
6893 return gl::error(GL_INVALID_VALUE);
6894 }
6895
6896 if (location == -1)
6897 {
6898 return;
6899 }
6900
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006901 gl::Context *context = gl::getNonLostContext();
6902
6903 if (context)
6904 {
6905 if (context->getClientVersion() < 3)
6906 {
6907 return gl::error(GL_INVALID_OPERATION);
6908 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006909
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006910 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
6911 if (!programBinary)
6912 {
6913 return gl::error(GL_INVALID_OPERATION);
6914 }
6915
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00006916 if (!programBinary->setUniformMatrix3x4fv(location, count, transpose, value))
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006917 {
6918 return gl::error(GL_INVALID_OPERATION);
6919 }
6920 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006921 }
6922 catch(std::bad_alloc&)
6923 {
6924 return gl::error(GL_OUT_OF_MEMORY);
6925 }
6926}
6927
6928void __stdcall glUniformMatrix4x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
6929{
6930 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
6931 location, count, transpose, value);
6932
6933 try
6934 {
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006935 if (count < 0)
6936 {
6937 return gl::error(GL_INVALID_VALUE);
6938 }
6939
6940 if (location == -1)
6941 {
6942 return;
6943 }
6944
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006945 gl::Context *context = gl::getNonLostContext();
6946
6947 if (context)
6948 {
6949 if (context->getClientVersion() < 3)
6950 {
6951 return gl::error(GL_INVALID_OPERATION);
6952 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006953
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006954 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
6955 if (!programBinary)
6956 {
6957 return gl::error(GL_INVALID_OPERATION);
6958 }
6959
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00006960 if (!programBinary->setUniformMatrix4x3fv(location, count, transpose, value))
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006961 {
6962 return gl::error(GL_INVALID_OPERATION);
6963 }
6964 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006965 }
6966 catch(std::bad_alloc&)
6967 {
6968 return gl::error(GL_OUT_OF_MEMORY);
6969 }
6970}
6971
6972void __stdcall glBlitFramebuffer(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter)
6973{
6974 EVENT("(GLint srcX0 = %d, GLint srcY0 = %d, GLint srcX1 = %d, GLint srcY1 = %d, GLint dstX0 = %d, "
6975 "GLint dstY0 = %d, GLint dstX1 = %d, GLint dstY1 = %d, GLbitfield mask = 0x%X, GLenum filter = 0x%X)",
6976 srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter);
6977
6978 try
6979 {
6980 gl::Context *context = gl::getNonLostContext();
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006981 if (context)
6982 {
6983 if (context->getClientVersion() < 3)
6984 {
6985 return gl::error(GL_INVALID_OPERATION);
6986 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006987
Geoff Lang34dbb6f2013-08-05 15:05:47 -04006988 if (!ValidateBlitFramebufferParameters(context, srcX0, srcY0, srcX1, srcY1,
Geoff Lang758d5b22013-06-11 11:42:50 -04006989 dstX0, dstY0, dstX1, dstY1, mask, filter,
6990 false))
6991 {
6992 return;
6993 }
6994
6995 context->blitFramebuffer(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1,
6996 mask, filter);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006997 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006998 }
6999 catch(std::bad_alloc&)
7000 {
7001 return gl::error(GL_OUT_OF_MEMORY);
7002 }
7003}
7004
7005void __stdcall glRenderbufferStorageMultisample(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height)
7006{
7007 EVENT("(GLenum target = 0x%X, GLsizei samples = %d, GLenum internalformat = 0x%X, GLsizei width = %d, GLsizei height = %d)",
7008 target, samples, internalformat, width, height);
7009
7010 try
7011 {
7012 gl::Context *context = gl::getNonLostContext();
7013
7014 if (context)
7015 {
7016 if (context->getClientVersion() < 3)
7017 {
7018 return gl::error(GL_INVALID_OPERATION);
7019 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007020
Geoff Lang34dbb6f2013-08-05 15:05:47 -04007021 if (!ValidateRenderbufferStorageParameters(context, target, samples, internalformat,
Geoff Lang2e1dcd52013-05-29 10:34:08 -04007022 width, height, false))
7023 {
7024 return;
7025 }
7026
7027 context->setRenderbufferStorage(width, height, internalformat, samples);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007028 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007029 }
7030 catch(std::bad_alloc&)
7031 {
7032 return gl::error(GL_OUT_OF_MEMORY);
7033 }
7034}
7035
7036void __stdcall glFramebufferTextureLayer(GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer)
7037{
7038 EVENT("(GLenum target = 0x%X, GLenum attachment = 0x%X, GLuint texture = %u, GLint level = %d, GLint layer = %d)",
7039 target, attachment, texture, level, layer);
7040
7041 try
7042 {
7043 gl::Context *context = gl::getNonLostContext();
7044
7045 if (context)
7046 {
7047 if (context->getClientVersion() < 3)
7048 {
7049 return gl::error(GL_INVALID_OPERATION);
7050 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007051
Geoff Lang34dbb6f2013-08-05 15:05:47 -04007052 if (!ValidateES3FramebufferTextureParameters(context, target, attachment, GL_NONE, texture, level, layer, true))
Geoff Lang3ed0c482013-07-25 17:03:18 -04007053 {
7054 return;
7055 }
7056
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05007057 gl::Framebuffer *framebuffer = context->getTargetFramebuffer(target);
7058 ASSERT(framebuffer);
Geoff Lang3ed0c482013-07-25 17:03:18 -04007059
7060 gl::Texture *textureObject = context->getTexture(texture);
7061 GLenum textarget = textureObject ? textureObject->getTarget() : GL_NONE;
7062
7063 if (attachment >= GL_COLOR_ATTACHMENT0_EXT && attachment <= GL_COLOR_ATTACHMENT15_EXT)
7064 {
7065 const unsigned int colorAttachment = (attachment - GL_COLOR_ATTACHMENT0_EXT);
7066 framebuffer->setColorbuffer(colorAttachment, textarget, texture, level, layer);
7067 }
7068 else
7069 {
7070 switch (attachment)
7071 {
7072 case GL_DEPTH_ATTACHMENT: framebuffer->setDepthbuffer(textarget, texture, level, layer); break;
7073 case GL_STENCIL_ATTACHMENT: framebuffer->setStencilbuffer(textarget, texture, level, layer); break;
7074 case GL_DEPTH_STENCIL_ATTACHMENT: framebuffer->setDepthStencilBuffer(textarget, texture, level, layer); break;
7075 }
7076 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007077 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007078 }
7079 catch(std::bad_alloc&)
7080 {
7081 return gl::error(GL_OUT_OF_MEMORY);
7082 }
7083}
7084
7085GLvoid* __stdcall glMapBufferRange(GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access)
7086{
7087 EVENT("(GLenum target = 0x%X, GLintptr offset = %d, GLsizeiptr length = %d, GLbitfield access = 0x%X)",
7088 target, offset, length, access);
7089
7090 try
7091 {
7092 gl::Context *context = gl::getNonLostContext();
7093
7094 if (context)
7095 {
7096 if (context->getClientVersion() < 3)
7097 {
7098 return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLvoid*>(NULL));
7099 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007100
Jamie Madill54133512013-06-21 09:33:07 -04007101 // glMapBufferRange
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007102 UNIMPLEMENTED();
7103 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007104 }
7105 catch(std::bad_alloc&)
7106 {
7107 return gl::error(GL_OUT_OF_MEMORY, reinterpret_cast<GLvoid*>(NULL));
7108 }
7109
7110 return NULL;
7111}
7112
7113void __stdcall glFlushMappedBufferRange(GLenum target, GLintptr offset, GLsizeiptr length)
7114{
7115 EVENT("(GLenum target = 0x%X, GLintptr offset = %d, GLsizeiptr length = %d)", target, offset, length);
7116
7117 try
7118 {
7119 gl::Context *context = gl::getNonLostContext();
7120
7121 if (context)
7122 {
7123 if (context->getClientVersion() < 3)
7124 {
7125 return gl::error(GL_INVALID_OPERATION);
7126 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007127
Jamie Madill54133512013-06-21 09:33:07 -04007128 // glFlushMappedBufferRange
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007129 UNIMPLEMENTED();
7130 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007131 }
7132 catch(std::bad_alloc&)
7133 {
7134 return gl::error(GL_OUT_OF_MEMORY);
7135 }
7136}
7137
7138void __stdcall glBindVertexArray(GLuint array)
7139{
7140 EVENT("(GLuint array = %u)", array);
7141
7142 try
7143 {
7144 gl::Context *context = gl::getNonLostContext();
7145
7146 if (context)
7147 {
7148 if (context->getClientVersion() < 3)
7149 {
7150 return gl::error(GL_INVALID_OPERATION);
7151 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007152
Jamie Madilld1028542013-07-02 11:57:04 -04007153 gl::VertexArray *vao = context->getVertexArray(array);
7154
7155 if (!vao)
7156 {
7157 // The default VAO should always exist
7158 ASSERT(array != 0);
7159 return gl::error(GL_INVALID_OPERATION);
7160 }
7161
7162 context->bindVertexArray(array);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007163 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007164 }
7165 catch(std::bad_alloc&)
7166 {
7167 return gl::error(GL_OUT_OF_MEMORY);
7168 }
7169}
7170
7171void __stdcall glDeleteVertexArrays(GLsizei n, const GLuint* arrays)
7172{
7173 EVENT("(GLsizei n = %d, const GLuint* arrays = 0x%0.8p)", n, arrays);
7174
7175 try
7176 {
7177 gl::Context *context = gl::getNonLostContext();
7178
7179 if (context)
7180 {
7181 if (context->getClientVersion() < 3)
7182 {
7183 return gl::error(GL_INVALID_OPERATION);
7184 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007185
Jamie Madilld1028542013-07-02 11:57:04 -04007186 if (n < 0)
7187 {
7188 return gl::error(GL_INVALID_VALUE);
7189 }
7190
7191 for (int arrayIndex = 0; arrayIndex < n; arrayIndex++)
7192 {
7193 if (arrays[arrayIndex] != 0)
7194 {
7195 context->deleteVertexArray(arrays[arrayIndex]);
7196 }
7197 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007198 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007199 }
7200 catch(std::bad_alloc&)
7201 {
7202 return gl::error(GL_OUT_OF_MEMORY);
7203 }
7204}
7205
7206void __stdcall glGenVertexArrays(GLsizei n, GLuint* arrays)
7207{
7208 EVENT("(GLsizei n = %d, GLuint* arrays = 0x%0.8p)", n, arrays);
7209
7210 try
7211 {
7212 gl::Context *context = gl::getNonLostContext();
7213
7214 if (context)
7215 {
7216 if (context->getClientVersion() < 3)
7217 {
7218 return gl::error(GL_INVALID_OPERATION);
7219 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007220
Jamie Madilld1028542013-07-02 11:57:04 -04007221 if (n < 0)
7222 {
7223 return gl::error(GL_INVALID_VALUE);
7224 }
7225
7226 for (int arrayIndex = 0; arrayIndex < n; arrayIndex++)
7227 {
7228 arrays[arrayIndex] = context->createVertexArray();
7229 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007230 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007231 }
7232 catch(std::bad_alloc&)
7233 {
7234 return gl::error(GL_OUT_OF_MEMORY);
7235 }
7236}
7237
7238GLboolean __stdcall glIsVertexArray(GLuint array)
7239{
7240 EVENT("(GLuint array = %u)", array);
7241
7242 try
7243 {
7244 gl::Context *context = gl::getNonLostContext();
7245
7246 if (context)
7247 {
7248 if (context->getClientVersion() < 3)
7249 {
7250 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
7251 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007252
Jamie Madilld1028542013-07-02 11:57:04 -04007253 if (array == 0)
7254 {
7255 return GL_FALSE;
7256 }
7257
7258 gl::VertexArray *vao = context->getVertexArray(array);
7259
7260 return (vao != NULL ? GL_TRUE : GL_FALSE);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007261 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007262 }
7263 catch(std::bad_alloc&)
7264 {
7265 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
7266 }
7267
7268 return GL_FALSE;
7269}
7270
7271void __stdcall glGetIntegeri_v(GLenum target, GLuint index, GLint* data)
7272{
7273 EVENT("(GLenum target = 0x%X, GLuint index = %u, GLint* data = 0x%0.8p)",
7274 target, index, data);
7275
7276 try
7277 {
7278 gl::Context *context = gl::getNonLostContext();
7279
7280 if (context)
7281 {
7282 if (context->getClientVersion() < 3)
7283 {
7284 return gl::error(GL_INVALID_OPERATION);
7285 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007286
Shannon Woods15934d52013-08-19 14:28:49 -04007287 switch (target)
7288 {
7289 case GL_TRANSFORM_FEEDBACK_BUFFER_START:
7290 case GL_TRANSFORM_FEEDBACK_BUFFER_SIZE:
7291 case GL_TRANSFORM_FEEDBACK_BUFFER_BINDING:
7292 if (index >= context->getMaxTransformFeedbackBufferBindings())
7293 return gl::error(GL_INVALID_VALUE);
7294 break;
7295 case GL_UNIFORM_BUFFER_START:
7296 case GL_UNIFORM_BUFFER_SIZE:
7297 case GL_UNIFORM_BUFFER_BINDING:
7298 if (index >= context->getMaximumCombinedUniformBufferBindings())
7299 return gl::error(GL_INVALID_VALUE);
7300 break;
7301 default:
7302 return gl::error(GL_INVALID_ENUM);
7303 }
7304
7305 if (!(context->getIndexedIntegerv(target, index, data)))
7306 {
7307 GLenum nativeType;
7308 unsigned int numParams = 0;
7309 if (!context->getIndexedQueryParameterInfo(target, &nativeType, &numParams))
7310 return gl::error(GL_INVALID_ENUM);
7311
7312 if (numParams == 0)
7313 return; // it is known that pname is valid, but there are no parameters to return
7314
7315 if (nativeType == GL_INT_64_ANGLEX)
7316 {
7317 GLint64 minIntValue = static_cast<GLint64>(std::numeric_limits<int>::min());
7318 GLint64 maxIntValue = static_cast<GLint64>(std::numeric_limits<int>::max());
7319 GLint64 *int64Params = new GLint64[numParams];
7320
7321 context->getIndexedInteger64v(target, index, int64Params);
7322
7323 for (unsigned int i = 0; i < numParams; ++i)
7324 {
7325 GLint64 clampedValue = std::max(std::min(int64Params[i], maxIntValue), minIntValue);
7326 data[i] = static_cast<GLint>(clampedValue);
7327 }
7328
7329 delete [] int64Params;
7330 }
7331 else
7332 {
7333 UNREACHABLE();
7334 }
7335 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007336 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007337 }
7338 catch(std::bad_alloc&)
7339 {
7340 return gl::error(GL_OUT_OF_MEMORY);
7341 }
7342}
7343
7344void __stdcall glBeginTransformFeedback(GLenum primitiveMode)
7345{
7346 EVENT("(GLenum primitiveMode = 0x%X)", primitiveMode);
7347
7348 try
7349 {
7350 gl::Context *context = gl::getNonLostContext();
7351
7352 if (context)
7353 {
7354 if (context->getClientVersion() < 3)
7355 {
7356 return gl::error(GL_INVALID_OPERATION);
7357 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007358
Geoff Langc8058452014-02-03 12:04:11 -05007359 switch (primitiveMode)
7360 {
7361 case GL_TRIANGLES:
7362 case GL_LINES:
7363 case GL_POINTS:
7364 break;
7365 default:
7366 return gl::error(GL_INVALID_ENUM);
7367 }
7368
7369 gl::TransformFeedback *transformFeedback = context->getCurrentTransformFeedback();
7370 ASSERT(transformFeedback != NULL);
7371
7372 if (transformFeedback->isStarted())
7373 {
7374 return gl::error(GL_INVALID_OPERATION);
7375 }
7376
7377 if (transformFeedback->isPaused())
7378 {
7379 transformFeedback->resume();
7380 }
7381 else
7382 {
7383 transformFeedback->start(primitiveMode);
7384 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007385 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007386 }
7387 catch(std::bad_alloc&)
7388 {
7389 return gl::error(GL_OUT_OF_MEMORY);
7390 }
7391}
7392
7393void __stdcall glEndTransformFeedback(void)
7394{
7395 EVENT("(void)");
7396
7397 try
7398 {
7399 gl::Context *context = gl::getNonLostContext();
7400
7401 if (context)
7402 {
7403 if (context->getClientVersion() < 3)
7404 {
7405 return gl::error(GL_INVALID_OPERATION);
7406 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007407
Geoff Langc8058452014-02-03 12:04:11 -05007408 gl::TransformFeedback *transformFeedback = context->getCurrentTransformFeedback();
7409 ASSERT(transformFeedback != NULL);
7410
7411 if (!transformFeedback->isStarted())
7412 {
7413 return gl::error(GL_INVALID_OPERATION);
7414 }
7415
7416 transformFeedback->stop();
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007417 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007418 }
7419 catch(std::bad_alloc&)
7420 {
7421 return gl::error(GL_OUT_OF_MEMORY);
7422 }
7423}
7424
7425void __stdcall glBindBufferRange(GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size)
7426{
7427 EVENT("(GLenum target = 0x%X, GLuint index = %u, GLuint buffer = %u, GLintptr offset = %d, GLsizeiptr size = %d)",
7428 target, index, buffer, offset, size);
7429
7430 try
7431 {
7432 gl::Context *context = gl::getNonLostContext();
7433
7434 if (context)
7435 {
7436 if (context->getClientVersion() < 3)
7437 {
7438 return gl::error(GL_INVALID_OPERATION);
7439 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007440
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007441 switch (target)
7442 {
7443 case GL_TRANSFORM_FEEDBACK_BUFFER:
shannonwoods@chromium.orgd11158f2013-05-30 00:06:19 +00007444 if (index >= context->getMaxTransformFeedbackBufferBindings())
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007445 {
7446 return gl::error(GL_INVALID_VALUE);
7447 }
7448 break;
7449
7450 case GL_UNIFORM_BUFFER:
7451 if (index >= context->getMaximumCombinedUniformBufferBindings())
7452 {
7453 return gl::error(GL_INVALID_VALUE);
7454 }
7455 break;
7456
7457 default:
7458 return gl::error(GL_INVALID_ENUM);
7459 }
7460
shannonwoods@chromium.orge6e00792013-05-30 00:06:07 +00007461 if (buffer != 0 && size <= 0)
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007462 {
7463 return gl::error(GL_INVALID_VALUE);
7464 }
7465
7466 switch (target)
7467 {
7468 case GL_TRANSFORM_FEEDBACK_BUFFER:
shannonwoods@chromium.orga26aeaf2013-05-30 00:06:13 +00007469
7470 // size and offset must be a multiple of 4
7471 if (buffer != 0 && ((offset % 4) != 0 || (size % 4) != 0))
7472 {
7473 return gl::error(GL_INVALID_VALUE);
7474 }
7475
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +00007476 context->bindIndexedTransformFeedbackBuffer(buffer, index, offset, size);
7477 context->bindGenericTransformFeedbackBuffer(buffer);
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007478 break;
7479
7480 case GL_UNIFORM_BUFFER:
shannonwoods@chromium.org97c3d502013-05-30 00:04:34 +00007481
7482 // it is an error to bind an offset not a multiple of the alignment
7483 if (buffer != 0 && (offset % context->getUniformBufferOffsetAlignment()) != 0)
7484 {
7485 return gl::error(GL_INVALID_VALUE);
7486 }
7487
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +00007488 context->bindIndexedUniformBuffer(buffer, index, offset, size);
7489 context->bindGenericUniformBuffer(buffer);
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007490 break;
7491
7492 default:
7493 UNREACHABLE();
7494 }
7495 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007496 }
7497 catch(std::bad_alloc&)
7498 {
7499 return gl::error(GL_OUT_OF_MEMORY);
7500 }
7501}
7502
7503void __stdcall glBindBufferBase(GLenum target, GLuint index, GLuint buffer)
7504{
7505 EVENT("(GLenum target = 0x%X, GLuint index = %u, GLuint buffer = %u)",
7506 target, index, buffer);
7507
7508 try
7509 {
7510 gl::Context *context = gl::getNonLostContext();
7511
7512 if (context)
7513 {
7514 if (context->getClientVersion() < 3)
7515 {
7516 return gl::error(GL_INVALID_OPERATION);
7517 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007518
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007519 switch (target)
7520 {
7521 case GL_TRANSFORM_FEEDBACK_BUFFER:
shannonwoods@chromium.orgd11158f2013-05-30 00:06:19 +00007522 if (index >= context->getMaxTransformFeedbackBufferBindings())
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007523 {
7524 return gl::error(GL_INVALID_VALUE);
7525 }
7526 break;
7527
7528 case GL_UNIFORM_BUFFER:
shannonwoods@chromium.orgd11158f2013-05-30 00:06:19 +00007529 if (index >= context->getMaximumCombinedUniformBufferBindings())
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007530 {
7531 return gl::error(GL_INVALID_VALUE);
7532 }
7533 break;
7534
7535 default:
7536 return gl::error(GL_INVALID_ENUM);
7537 }
7538
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007539 switch (target)
7540 {
7541 case GL_TRANSFORM_FEEDBACK_BUFFER:
shannonwoods@chromium.org3eeca1e2013-05-30 00:04:28 +00007542 context->bindIndexedTransformFeedbackBuffer(buffer, index, 0, 0);
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +00007543 context->bindGenericTransformFeedbackBuffer(buffer);
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007544 break;
7545
7546 case GL_UNIFORM_BUFFER:
shannonwoods@chromium.org3eeca1e2013-05-30 00:04:28 +00007547 context->bindIndexedUniformBuffer(buffer, index, 0, 0);
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +00007548 context->bindGenericUniformBuffer(buffer);
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007549 break;
7550
7551 default:
7552 UNREACHABLE();
7553 }
7554 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007555 }
7556 catch(std::bad_alloc&)
7557 {
7558 return gl::error(GL_OUT_OF_MEMORY);
7559 }
7560}
7561
7562void __stdcall glTransformFeedbackVaryings(GLuint program, GLsizei count, const GLchar* const* varyings, GLenum bufferMode)
7563{
7564 EVENT("(GLuint program = %u, GLsizei count = %d, const GLchar* const* varyings = 0x%0.8p, GLenum bufferMode = 0x%X)",
7565 program, count, varyings, bufferMode);
7566
7567 try
7568 {
7569 gl::Context *context = gl::getNonLostContext();
7570
7571 if (context)
7572 {
7573 if (context->getClientVersion() < 3)
7574 {
7575 return gl::error(GL_INVALID_OPERATION);
7576 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007577
Jamie Madill54133512013-06-21 09:33:07 -04007578 // glTransformFeedbackVaryings
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007579 UNIMPLEMENTED();
7580 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007581 }
7582 catch(std::bad_alloc&)
7583 {
7584 return gl::error(GL_OUT_OF_MEMORY);
7585 }
7586}
7587
7588void __stdcall glGetTransformFeedbackVarying(GLuint program, GLuint index, GLsizei bufSize, GLsizei* length, GLsizei* size, GLenum* type, GLchar* name)
7589{
7590 EVENT("(GLuint program = %u, GLuint index = %u, GLsizei bufSize = %d, GLsizei* length = 0x%0.8p, "
7591 "GLsizei* size = 0x%0.8p, GLenum* type = 0x%0.8p, GLchar* name = 0x%0.8p)",
7592 program, index, bufSize, length, size, type, name);
7593
7594 try
7595 {
7596 gl::Context *context = gl::getNonLostContext();
7597
7598 if (context)
7599 {
7600 if (context->getClientVersion() < 3)
7601 {
7602 return gl::error(GL_INVALID_OPERATION);
7603 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007604
Jamie Madill54133512013-06-21 09:33:07 -04007605 // glGetTransformFeedbackVarying
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007606 UNIMPLEMENTED();
7607 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007608 }
7609 catch(std::bad_alloc&)
7610 {
7611 return gl::error(GL_OUT_OF_MEMORY);
7612 }
7613}
7614
7615void __stdcall glVertexAttribIPointer(GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid* pointer)
7616{
7617 EVENT("(GLuint index = %u, GLint size = %d, GLenum type = 0x%X, GLsizei stride = %d, const GLvoid* pointer = 0x%0.8p)",
7618 index, size, type, stride, pointer);
7619
7620 try
7621 {
7622 gl::Context *context = gl::getNonLostContext();
7623
7624 if (context)
7625 {
7626 if (context->getClientVersion() < 3)
7627 {
7628 return gl::error(GL_INVALID_OPERATION);
7629 }
7630 }
7631
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007632 if (index >= gl::MAX_VERTEX_ATTRIBS)
7633 {
7634 return gl::error(GL_INVALID_VALUE);
7635 }
7636
7637 if (size < 1 || size > 4)
7638 {
7639 return gl::error(GL_INVALID_VALUE);
7640 }
7641
7642 switch (type)
7643 {
7644 case GL_BYTE:
7645 case GL_UNSIGNED_BYTE:
7646 case GL_SHORT:
7647 case GL_UNSIGNED_SHORT:
7648 case GL_INT:
7649 case GL_UNSIGNED_INT:
shannon.woods%transgaming.com@gtempaccount.com1ab57be2013-04-13 03:38:39 +00007650 case GL_INT_2_10_10_10_REV:
7651 case GL_UNSIGNED_INT_2_10_10_10_REV:
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007652 break;
7653 default:
7654 return gl::error(GL_INVALID_ENUM);
7655 }
7656
7657 if (stride < 0)
7658 {
7659 return gl::error(GL_INVALID_VALUE);
7660 }
7661
shannon.woods%transgaming.com@gtempaccount.com1ab57be2013-04-13 03:38:39 +00007662 if ((type == GL_INT_2_10_10_10_REV || type == GL_UNSIGNED_INT_2_10_10_10_REV) && size != 4)
7663 {
7664 return gl::error(GL_INVALID_OPERATION);
7665 }
7666
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007667 if (context)
7668 {
Jamie Madilld8db8662013-07-02 11:57:04 -04007669 // [OpenGL ES 3.0.2] Section 2.8 page 24:
7670 // An INVALID_OPERATION error is generated when a non-zero vertex array object
7671 // is bound, zero is bound to the ARRAY_BUFFER buffer object binding point,
7672 // and the pointer argument is not NULL.
7673 if (context->getVertexArrayHandle() != 0 && context->getArrayBufferHandle() == 0 && pointer != NULL)
7674 {
7675 return gl::error(GL_INVALID_OPERATION);
7676 }
7677
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007678 context->setVertexAttribState(index, context->getArrayBuffer(), size, type, false, true,
7679 stride, pointer);
7680 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007681 }
7682 catch(std::bad_alloc&)
7683 {
7684 return gl::error(GL_OUT_OF_MEMORY);
7685 }
7686}
7687
7688void __stdcall glGetVertexAttribIiv(GLuint index, GLenum pname, GLint* params)
7689{
7690 EVENT("(GLuint index = %u, GLenum pname = 0x%X, GLint* params = 0x%0.8p)",
7691 index, pname, params);
7692
7693 try
7694 {
7695 gl::Context *context = gl::getNonLostContext();
7696
7697 if (context)
7698 {
7699 if (context->getClientVersion() < 3)
7700 {
7701 return gl::error(GL_INVALID_OPERATION);
7702 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007703
Jamie Madilla7d05862013-07-02 11:57:06 -04007704 if (index >= gl::MAX_VERTEX_ATTRIBS)
7705 {
7706 return gl::error(GL_INVALID_VALUE);
7707 }
7708
7709 const gl::VertexAttribute &attribState = context->getVertexAttribState(index);
7710
Geoff Lang34dbb6f2013-08-05 15:05:47 -04007711 if (!gl::ValidateGetVertexAttribParameters(pname, context->getClientVersion()))
Jamie Madilla7d05862013-07-02 11:57:06 -04007712 {
7713 return;
7714 }
7715
7716 if (pname == GL_CURRENT_VERTEX_ATTRIB)
7717 {
7718 const gl::VertexAttribCurrentValueData &currentValueData = context->getVertexAttribCurrentValue(index);
7719 for (int i = 0; i < 4; ++i)
7720 {
7721 params[i] = currentValueData.IntValues[i];
7722 }
7723 }
7724 else
7725 {
7726 *params = attribState.querySingleParameter<GLint>(pname);
7727 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007728 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007729 }
7730 catch(std::bad_alloc&)
7731 {
7732 return gl::error(GL_OUT_OF_MEMORY);
7733 }
7734}
7735
7736void __stdcall glGetVertexAttribIuiv(GLuint index, GLenum pname, GLuint* params)
7737{
7738 EVENT("(GLuint index = %u, GLenum pname = 0x%X, GLuint* params = 0x%0.8p)",
7739 index, pname, params);
7740
7741 try
7742 {
7743 gl::Context *context = gl::getNonLostContext();
7744
7745 if (context)
7746 {
7747 if (context->getClientVersion() < 3)
7748 {
7749 return gl::error(GL_INVALID_OPERATION);
7750 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007751
Jamie Madilla7d05862013-07-02 11:57:06 -04007752 if (index >= gl::MAX_VERTEX_ATTRIBS)
7753 {
7754 return gl::error(GL_INVALID_VALUE);
7755 }
7756
7757 const gl::VertexAttribute &attribState = context->getVertexAttribState(index);
7758
Geoff Lang34dbb6f2013-08-05 15:05:47 -04007759 if (!gl::ValidateGetVertexAttribParameters(pname, context->getClientVersion()))
Jamie Madilla7d05862013-07-02 11:57:06 -04007760 {
7761 return;
7762 }
7763
7764 if (pname == GL_CURRENT_VERTEX_ATTRIB)
7765 {
7766 const gl::VertexAttribCurrentValueData &currentValueData = context->getVertexAttribCurrentValue(index);
7767 for (int i = 0; i < 4; ++i)
7768 {
7769 params[i] = currentValueData.UnsignedIntValues[i];
7770 }
7771 }
7772 else
7773 {
7774 *params = attribState.querySingleParameter<GLuint>(pname);
7775 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007776 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007777 }
7778 catch(std::bad_alloc&)
7779 {
7780 return gl::error(GL_OUT_OF_MEMORY);
7781 }
7782}
7783
7784void __stdcall glVertexAttribI4i(GLuint index, GLint x, GLint y, GLint z, GLint w)
7785{
7786 EVENT("(GLuint index = %u, GLint x = %d, GLint y = %d, GLint z = %d, GLint w = %d)",
7787 index, x, y, z, w);
7788
7789 try
7790 {
7791 gl::Context *context = gl::getNonLostContext();
7792
7793 if (context)
7794 {
7795 if (context->getClientVersion() < 3)
7796 {
7797 return gl::error(GL_INVALID_OPERATION);
7798 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007799
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007800 if (index >= gl::MAX_VERTEX_ATTRIBS)
7801 {
7802 return gl::error(GL_INVALID_VALUE);
7803 }
7804
7805 GLint vals[4] = { x, y, z, w };
7806 context->setVertexAttribi(index, vals);
7807 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007808 }
7809 catch(std::bad_alloc&)
7810 {
7811 return gl::error(GL_OUT_OF_MEMORY);
7812 }
7813}
7814
7815void __stdcall glVertexAttribI4ui(GLuint index, GLuint x, GLuint y, GLuint z, GLuint w)
7816{
7817 EVENT("(GLuint index = %u, GLuint x = %u, GLuint y = %u, GLuint z = %u, GLuint w = %u)",
7818 index, x, y, z, w);
7819
7820 try
7821 {
7822 gl::Context *context = gl::getNonLostContext();
7823
7824 if (context)
7825 {
7826 if (context->getClientVersion() < 3)
7827 {
7828 return gl::error(GL_INVALID_OPERATION);
7829 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007830
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007831 if (index >= gl::MAX_VERTEX_ATTRIBS)
7832 {
7833 return gl::error(GL_INVALID_VALUE);
7834 }
7835
7836 GLuint vals[4] = { x, y, z, w };
7837 context->setVertexAttribu(index, vals);
7838 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007839 }
7840 catch(std::bad_alloc&)
7841 {
7842 return gl::error(GL_OUT_OF_MEMORY);
7843 }
7844}
7845
7846void __stdcall glVertexAttribI4iv(GLuint index, const GLint* v)
7847{
7848 EVENT("(GLuint index = %u, const GLint* v = 0x%0.8p)", index, v);
7849
7850 try
7851 {
7852 gl::Context *context = gl::getNonLostContext();
7853
7854 if (context)
7855 {
7856 if (context->getClientVersion() < 3)
7857 {
7858 return gl::error(GL_INVALID_OPERATION);
7859 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007860
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007861 if (index >= gl::MAX_VERTEX_ATTRIBS)
7862 {
7863 return gl::error(GL_INVALID_VALUE);
7864 }
7865
7866 context->setVertexAttribi(index, v);
7867 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007868 }
7869 catch(std::bad_alloc&)
7870 {
7871 return gl::error(GL_OUT_OF_MEMORY);
7872 }
7873}
7874
7875void __stdcall glVertexAttribI4uiv(GLuint index, const GLuint* v)
7876{
7877 EVENT("(GLuint index = %u, const GLuint* v = 0x%0.8p)", index, v);
7878
7879 try
7880 {
7881 gl::Context *context = gl::getNonLostContext();
7882
7883 if (context)
7884 {
7885 if (context->getClientVersion() < 3)
7886 {
7887 return gl::error(GL_INVALID_OPERATION);
7888 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007889
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007890 if (index >= gl::MAX_VERTEX_ATTRIBS)
7891 {
7892 return gl::error(GL_INVALID_VALUE);
7893 }
7894
7895 context->setVertexAttribu(index, v);
7896 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007897 }
7898 catch(std::bad_alloc&)
7899 {
7900 return gl::error(GL_OUT_OF_MEMORY);
7901 }
7902}
7903
7904void __stdcall glGetUniformuiv(GLuint program, GLint location, GLuint* params)
7905{
7906 EVENT("(GLuint program = %u, GLint location = %d, GLuint* params = 0x%0.8p)",
7907 program, location, params);
7908
7909 try
7910 {
7911 gl::Context *context = gl::getNonLostContext();
7912
7913 if (context)
7914 {
7915 if (context->getClientVersion() < 3)
7916 {
7917 return gl::error(GL_INVALID_OPERATION);
7918 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007919
shannon.woods%transgaming.com@gtempaccount.come2290122013-04-13 03:41:07 +00007920 if (program == 0)
7921 {
7922 return gl::error(GL_INVALID_VALUE);
7923 }
7924
7925 gl::Program *programObject = context->getProgram(program);
7926
7927 if (!programObject || !programObject->isLinked())
7928 {
7929 return gl::error(GL_INVALID_OPERATION);
7930 }
7931
7932 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
7933 if (!programBinary)
7934 {
7935 return gl::error(GL_INVALID_OPERATION);
7936 }
7937
7938 if (!programBinary->getUniformuiv(location, NULL, params))
7939 {
7940 return gl::error(GL_INVALID_OPERATION);
7941 }
7942 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007943 }
7944 catch(std::bad_alloc&)
7945 {
7946 return gl::error(GL_OUT_OF_MEMORY);
7947 }
7948}
7949
7950GLint __stdcall glGetFragDataLocation(GLuint program, const GLchar *name)
7951{
7952 EVENT("(GLuint program = %u, const GLchar *name = 0x%0.8p)",
7953 program, name);
7954
7955 try
7956 {
7957 gl::Context *context = gl::getNonLostContext();
7958
7959 if (context)
7960 {
7961 if (context->getClientVersion() < 3)
7962 {
Jamie Madilld1e78c92013-06-20 11:55:50 -04007963 return gl::error(GL_INVALID_OPERATION, -1);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007964 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007965
Jamie Madilld1e78c92013-06-20 11:55:50 -04007966 if (program == 0)
7967 {
7968 return gl::error(GL_INVALID_VALUE, -1);
7969 }
7970
7971 gl::Program *programObject = context->getProgram(program);
7972
7973 if (!programObject || !programObject->isLinked())
7974 {
7975 return gl::error(GL_INVALID_OPERATION, -1);
7976 }
7977
7978 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
7979 if (!programBinary)
7980 {
7981 return gl::error(GL_INVALID_OPERATION, -1);
7982 }
7983
7984 return programBinary->getFragDataLocation(name);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007985 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007986 }
7987 catch(std::bad_alloc&)
7988 {
7989 return gl::error(GL_OUT_OF_MEMORY, 0);
7990 }
7991
7992 return 0;
7993}
7994
7995void __stdcall glUniform1ui(GLint location, GLuint v0)
7996{
shannon.woods%transgaming.com@gtempaccount.com8431b9c2013-04-13 03:40:17 +00007997 glUniform1uiv(location, 1, &v0);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007998}
7999
8000void __stdcall glUniform2ui(GLint location, GLuint v0, GLuint v1)
8001{
shannon.woods%transgaming.com@gtempaccount.com8431b9c2013-04-13 03:40:17 +00008002 const GLuint xy[] = { v0, v1 };
8003 glUniform2uiv(location, 1, xy);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008004}
8005
8006void __stdcall glUniform3ui(GLint location, GLuint v0, GLuint v1, GLuint v2)
8007{
shannon.woods%transgaming.com@gtempaccount.com8431b9c2013-04-13 03:40:17 +00008008 const GLuint xyz[] = { v0, v1, v2 };
8009 glUniform3uiv(location, 1, xyz);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008010}
8011
8012void __stdcall glUniform4ui(GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3)
8013{
shannon.woods%transgaming.com@gtempaccount.com8431b9c2013-04-13 03:40:17 +00008014 const GLuint xyzw[] = { v0, v1, v2, v3 };
8015 glUniform4uiv(location, 1, xyzw);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008016}
8017
8018void __stdcall glUniform1uiv(GLint location, GLsizei count, const GLuint* value)
8019{
8020 EVENT("(GLint location = %d, GLsizei count = %d, const GLuint* value = 0x%0.8p)",
8021 location, count, value);
8022
8023 try
8024 {
8025 gl::Context *context = gl::getNonLostContext();
8026
8027 if (context)
8028 {
8029 if (context->getClientVersion() < 3)
8030 {
8031 return gl::error(GL_INVALID_OPERATION);
8032 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008033
shannon.woods%transgaming.com@gtempaccount.com50ea4ab2013-04-13 03:40:36 +00008034 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
8035 if (!programBinary)
8036 {
8037 return gl::error(GL_INVALID_OPERATION);
8038 }
8039
8040 if (!programBinary->setUniform1uiv(location, count, value))
8041 {
8042 return gl::error(GL_INVALID_OPERATION);
8043 }
8044 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008045 }
8046 catch(std::bad_alloc&)
8047 {
8048 return gl::error(GL_OUT_OF_MEMORY);
8049 }
8050}
8051
8052void __stdcall glUniform2uiv(GLint location, GLsizei count, const GLuint* value)
8053{
8054 EVENT("(GLint location = %d, GLsizei count = %d, const GLuint* value = 0x%0.8p)",
8055 location, count, value);
8056
8057 try
8058 {
8059 gl::Context *context = gl::getNonLostContext();
8060
8061 if (context)
8062 {
8063 if (context->getClientVersion() < 3)
8064 {
8065 return gl::error(GL_INVALID_OPERATION);
8066 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008067
shannon.woods%transgaming.com@gtempaccount.com50ea4ab2013-04-13 03:40:36 +00008068 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
8069 if (!programBinary)
8070 {
8071 return gl::error(GL_INVALID_OPERATION);
8072 }
8073
8074 if (!programBinary->setUniform2uiv(location, count, value))
8075 {
8076 return gl::error(GL_INVALID_OPERATION);
8077 }
8078 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008079 }
8080 catch(std::bad_alloc&)
8081 {
8082 return gl::error(GL_OUT_OF_MEMORY);
8083 }
8084}
8085
8086void __stdcall glUniform3uiv(GLint location, GLsizei count, const GLuint* value)
8087{
8088 EVENT("(GLint location = %d, GLsizei count = %d, const GLuint* value)",
8089 location, count, value);
8090
8091 try
8092 {
8093 gl::Context *context = gl::getNonLostContext();
8094
8095 if (context)
8096 {
8097 if (context->getClientVersion() < 3)
8098 {
8099 return gl::error(GL_INVALID_OPERATION);
8100 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008101
shannon.woods%transgaming.com@gtempaccount.com50ea4ab2013-04-13 03:40:36 +00008102 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
8103 if (!programBinary)
8104 {
8105 return gl::error(GL_INVALID_OPERATION);
8106 }
8107
8108 if (!programBinary->setUniform3uiv(location, count, value))
8109 {
8110 return gl::error(GL_INVALID_OPERATION);
8111 }
8112 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008113 }
8114 catch(std::bad_alloc&)
8115 {
8116 return gl::error(GL_OUT_OF_MEMORY);
8117 }
8118}
8119
8120void __stdcall glUniform4uiv(GLint location, GLsizei count, const GLuint* value)
8121{
8122 EVENT("(GLint location = %d, GLsizei count = %d, const GLuint* value = 0x%0.8p)",
8123 location, count, value);
8124
8125 try
8126 {
8127 gl::Context *context = gl::getNonLostContext();
8128
8129 if (context)
8130 {
8131 if (context->getClientVersion() < 3)
8132 {
8133 return gl::error(GL_INVALID_OPERATION);
8134 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008135
shannon.woods%transgaming.com@gtempaccount.com50ea4ab2013-04-13 03:40:36 +00008136 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
8137 if (!programBinary)
8138 {
8139 return gl::error(GL_INVALID_OPERATION);
8140 }
8141
8142 if (!programBinary->setUniform4uiv(location, count, value))
8143 {
8144 return gl::error(GL_INVALID_OPERATION);
8145 }
8146 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008147 }
8148 catch(std::bad_alloc&)
8149 {
8150 return gl::error(GL_OUT_OF_MEMORY);
8151 }
8152}
8153
8154void __stdcall glClearBufferiv(GLenum buffer, GLint drawbuffer, const GLint* value)
8155{
8156 EVENT("(GLenum buffer = 0x%X, GLint drawbuffer = %d, const GLint* value = 0x%0.8p)",
8157 buffer, drawbuffer, value);
8158
8159 try
8160 {
8161 gl::Context *context = gl::getNonLostContext();
8162
8163 if (context)
8164 {
8165 if (context->getClientVersion() < 3)
8166 {
8167 return gl::error(GL_INVALID_OPERATION);
8168 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008169
Geoff Lang42359ca2013-08-21 13:25:17 -04008170 switch (buffer)
8171 {
8172 case GL_COLOR:
8173 if (drawbuffer < 0 || drawbuffer >= static_cast<GLint>(context->getMaximumRenderTargets()))
8174 {
8175 return gl::error(GL_INVALID_VALUE);
8176 }
8177 break;
8178 case GL_STENCIL:
8179 if (drawbuffer != 0)
8180 {
8181 return gl::error(GL_INVALID_VALUE);
8182 }
Geoff Lang8d6a0022014-01-31 16:38:31 -05008183 break;
Geoff Lang42359ca2013-08-21 13:25:17 -04008184 default:
8185 return gl::error(GL_INVALID_ENUM);
8186 }
8187
8188 context->clearBufferiv(buffer, drawbuffer, value);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008189 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008190 }
8191 catch(std::bad_alloc&)
8192 {
8193 return gl::error(GL_OUT_OF_MEMORY);
8194 }
8195}
8196
8197void __stdcall glClearBufferuiv(GLenum buffer, GLint drawbuffer, const GLuint* value)
8198{
8199 EVENT("(GLenum buffer = 0x%X, GLint drawbuffer = %d, const GLuint* value = 0x%0.8p)",
8200 buffer, drawbuffer, value);
8201
8202 try
8203 {
8204 gl::Context *context = gl::getNonLostContext();
8205
8206 if (context)
8207 {
8208 if (context->getClientVersion() < 3)
8209 {
8210 return gl::error(GL_INVALID_OPERATION);
8211 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008212
Geoff Lang42359ca2013-08-21 13:25:17 -04008213 switch (buffer)
8214 {
8215 case GL_COLOR:
8216 if (drawbuffer < 0 || drawbuffer >= static_cast<GLint>(context->getMaximumRenderTargets()))
8217 {
8218 return gl::error(GL_INVALID_VALUE);
8219 }
8220 break;
8221 default:
8222 return gl::error(GL_INVALID_ENUM);
8223 }
8224
8225 context->clearBufferuiv(buffer, drawbuffer, value);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008226 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008227 }
8228 catch(std::bad_alloc&)
8229 {
8230 return gl::error(GL_OUT_OF_MEMORY);
8231 }
8232}
8233
8234void __stdcall glClearBufferfv(GLenum buffer, GLint drawbuffer, const GLfloat* value)
8235{
8236 EVENT("(GLenum buffer = 0x%X, GLint drawbuffer = %d, const GLfloat* value = 0x%0.8p)",
8237 buffer, drawbuffer, value);
8238
8239 try
8240 {
8241 gl::Context *context = gl::getNonLostContext();
8242
8243 if (context)
8244 {
8245 if (context->getClientVersion() < 3)
8246 {
8247 return gl::error(GL_INVALID_OPERATION);
8248 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008249
Geoff Lang42359ca2013-08-21 13:25:17 -04008250 switch (buffer)
8251 {
8252 case GL_COLOR:
8253 if (drawbuffer < 0 || drawbuffer >= static_cast<GLint>(context->getMaximumRenderTargets()))
8254 {
8255 return gl::error(GL_INVALID_VALUE);
8256 }
8257 break;
8258 case GL_DEPTH:
8259 if (drawbuffer != 0)
8260 {
8261 return gl::error(GL_INVALID_VALUE);
8262 }
8263 break;
8264 default:
8265 return gl::error(GL_INVALID_ENUM);
8266 }
8267
8268 context->clearBufferfv(buffer, drawbuffer, value);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008269 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008270 }
8271 catch(std::bad_alloc&)
8272 {
8273 return gl::error(GL_OUT_OF_MEMORY);
8274 }
8275}
8276
8277void __stdcall glClearBufferfi(GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil)
8278{
8279 EVENT("(GLenum buffer = 0x%X, GLint drawbuffer = %d, GLfloat depth, GLint stencil = %d)",
8280 buffer, drawbuffer, depth, stencil);
8281
8282 try
8283 {
8284 gl::Context *context = gl::getNonLostContext();
8285
8286 if (context)
8287 {
8288 if (context->getClientVersion() < 3)
8289 {
8290 return gl::error(GL_INVALID_OPERATION);
8291 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008292
Geoff Lang42359ca2013-08-21 13:25:17 -04008293 switch (buffer)
8294 {
8295 case GL_DEPTH_STENCIL:
8296 if (drawbuffer != 0)
8297 {
8298 return gl::error(GL_INVALID_VALUE);
8299 }
8300 break;
8301 default:
8302 return gl::error(GL_INVALID_ENUM);
8303 }
8304
8305 context->clearBufferfi(buffer, drawbuffer, depth, stencil);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008306 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008307 }
8308 catch(std::bad_alloc&)
8309 {
8310 return gl::error(GL_OUT_OF_MEMORY);
8311 }
8312}
8313
8314const GLubyte* __stdcall glGetStringi(GLenum name, GLuint index)
8315{
8316 EVENT("(GLenum name = 0x%X, GLuint index = %u)", name, index);
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, reinterpret_cast<GLubyte*>(NULL));
8327 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008328
shannonwoods@chromium.org302df742013-05-30 00:05:54 +00008329 if (name != GL_EXTENSIONS)
8330 {
8331 return gl::error(GL_INVALID_ENUM, reinterpret_cast<GLubyte*>(NULL));
8332 }
8333
8334 if (index >= context->getNumExtensions())
8335 {
8336 return gl::error(GL_INVALID_VALUE, reinterpret_cast<GLubyte*>(NULL));
8337 }
8338
8339 return reinterpret_cast<const GLubyte*>(context->getExtensionString(index));
8340 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008341 }
8342 catch(std::bad_alloc&)
8343 {
8344 return gl::error(GL_OUT_OF_MEMORY, reinterpret_cast<GLubyte*>(NULL));
8345 }
8346
8347 return NULL;
8348}
8349
8350void __stdcall glCopyBufferSubData(GLenum readTarget, GLenum writeTarget, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size)
8351{
8352 EVENT("(GLenum readTarget = 0x%X, GLenum writeTarget = 0x%X, GLintptr readOffset = %d, GLintptr writeOffset = %d, GLsizeiptr size = %d)",
8353 readTarget, writeTarget, readOffset, writeOffset, size);
8354
8355 try
8356 {
8357 gl::Context *context = gl::getNonLostContext();
8358
8359 if (context)
8360 {
8361 if (context->getClientVersion() < 3)
8362 {
8363 return gl::error(GL_INVALID_OPERATION);
8364 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008365
shannon.woods%transgaming.com@gtempaccount.com296c3f22013-04-13 03:39:39 +00008366 gl::Buffer *readBuffer = NULL;
8367 switch (readTarget)
8368 {
8369 case GL_ARRAY_BUFFER:
8370 readBuffer = context->getArrayBuffer();
8371 break;
8372 case GL_COPY_READ_BUFFER:
8373 readBuffer = context->getCopyReadBuffer();
8374 break;
8375 case GL_COPY_WRITE_BUFFER:
8376 readBuffer = context->getCopyWriteBuffer();
8377 break;
8378 case GL_ELEMENT_ARRAY_BUFFER:
8379 readBuffer = context->getElementArrayBuffer();
8380 break;
8381 case GL_PIXEL_PACK_BUFFER:
8382 readBuffer = context->getPixelPackBuffer();
8383 break;
8384 case GL_PIXEL_UNPACK_BUFFER:
8385 readBuffer = context->getPixelUnpackBuffer();
8386 break;
8387 case GL_TRANSFORM_FEEDBACK_BUFFER:
8388 readBuffer = context->getGenericTransformFeedbackBuffer();
8389 break;
8390 case GL_UNIFORM_BUFFER:
8391 readBuffer = context->getGenericUniformBuffer();
8392 break;
8393 default:
8394 return gl::error(GL_INVALID_ENUM);
8395 }
8396
8397 gl::Buffer *writeBuffer = NULL;
8398 switch (writeTarget)
8399 {
8400 case GL_ARRAY_BUFFER:
8401 writeBuffer = context->getArrayBuffer();
8402 break;
8403 case GL_COPY_READ_BUFFER:
8404 writeBuffer = context->getCopyReadBuffer();
8405 break;
8406 case GL_COPY_WRITE_BUFFER:
8407 writeBuffer = context->getCopyWriteBuffer();
8408 break;
8409 case GL_ELEMENT_ARRAY_BUFFER:
8410 writeBuffer = context->getElementArrayBuffer();
8411 break;
8412 case GL_PIXEL_PACK_BUFFER:
8413 writeBuffer = context->getPixelPackBuffer();
8414 break;
8415 case GL_PIXEL_UNPACK_BUFFER:
8416 writeBuffer = context->getPixelUnpackBuffer();
8417 break;
8418 case GL_TRANSFORM_FEEDBACK_BUFFER:
8419 writeBuffer = context->getGenericTransformFeedbackBuffer();
8420 break;
8421 case GL_UNIFORM_BUFFER:
8422 writeBuffer = context->getGenericUniformBuffer();
8423 break;
8424 default:
8425 return gl::error(GL_INVALID_ENUM);
8426 }
8427
8428 if (!readBuffer || !writeBuffer)
8429 {
8430 return gl::error(GL_INVALID_OPERATION);
8431 }
8432
8433 if (readOffset < 0 || writeOffset < 0 || size < 0 ||
8434 static_cast<unsigned int>(readOffset + size) > readBuffer->size() ||
8435 static_cast<unsigned int>(writeOffset + size) > writeBuffer->size())
8436 {
8437 return gl::error(GL_INVALID_VALUE);
8438 }
8439
8440 if (readBuffer == writeBuffer && abs(readOffset - writeOffset) < size)
8441 {
8442 return gl::error(GL_INVALID_VALUE);
8443 }
8444
8445 // TODO: Verify that readBuffer and writeBuffer are not currently mapped (GL_INVALID_OPERATION)
8446
shannon.woods%transgaming.com@gtempaccount.comc53376a2013-04-13 03:41:23 +00008447 // if size is zero, the copy is a successful no-op
8448 if (size > 0)
8449 {
8450 writeBuffer->copyBufferSubData(readBuffer, readOffset, writeOffset, size);
8451 }
shannon.woods%transgaming.com@gtempaccount.com296c3f22013-04-13 03:39:39 +00008452 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008453 }
8454 catch(std::bad_alloc&)
8455 {
8456 return gl::error(GL_OUT_OF_MEMORY);
8457 }
8458}
8459
8460void __stdcall glGetUniformIndices(GLuint program, GLsizei uniformCount, const GLchar* const* uniformNames, GLuint* uniformIndices)
8461{
8462 EVENT("(GLuint program = %u, GLsizei uniformCount = %d, const GLchar* const* uniformNames = 0x%0.8p, GLuint* uniformIndices = 0x%0.8p)",
8463 program, uniformCount, uniformNames, uniformIndices);
8464
8465 try
8466 {
8467 gl::Context *context = gl::getNonLostContext();
8468
8469 if (context)
8470 {
8471 if (context->getClientVersion() < 3)
8472 {
8473 return gl::error(GL_INVALID_OPERATION);
8474 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008475
shannonwoods@chromium.orgc2ed9912013-05-30 00:05:33 +00008476 if (uniformCount < 0)
8477 {
8478 return gl::error(GL_INVALID_VALUE);
8479 }
8480
8481 gl::Program *programObject = context->getProgram(program);
8482
8483 if (!programObject)
8484 {
8485 if (context->getShader(program))
8486 {
8487 return gl::error(GL_INVALID_OPERATION);
8488 }
8489 else
8490 {
8491 return gl::error(GL_INVALID_VALUE);
8492 }
8493 }
8494
8495 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
8496 if (!programObject->isLinked() || !programBinary)
8497 {
8498 for (int uniformId = 0; uniformId < uniformCount; uniformId++)
8499 {
8500 uniformIndices[uniformId] = GL_INVALID_INDEX;
8501 }
8502 }
8503 else
8504 {
8505 for (int uniformId = 0; uniformId < uniformCount; uniformId++)
8506 {
8507 uniformIndices[uniformId] = programBinary->getUniformIndex(uniformNames[uniformId]);
8508 }
8509 }
8510 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008511 }
8512 catch(std::bad_alloc&)
8513 {
8514 return gl::error(GL_OUT_OF_MEMORY);
8515 }
8516}
8517
8518void __stdcall glGetActiveUniformsiv(GLuint program, GLsizei uniformCount, const GLuint* uniformIndices, GLenum pname, GLint* params)
8519{
8520 EVENT("(GLuint program = %u, GLsizei uniformCount = %d, const GLuint* uniformIndices = 0x%0.8p, GLenum pname = 0x%X, GLint* params = 0x%0.8p)",
8521 program, uniformCount, uniformIndices, pname, params);
8522
8523 try
8524 {
8525 gl::Context *context = gl::getNonLostContext();
8526
8527 if (context)
8528 {
8529 if (context->getClientVersion() < 3)
8530 {
8531 return gl::error(GL_INVALID_OPERATION);
8532 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008533
shannonwoods@chromium.org2a9a9d22013-05-30 00:05:40 +00008534 if (uniformCount < 0)
8535 {
8536 return gl::error(GL_INVALID_VALUE);
8537 }
8538
8539 gl::Program *programObject = context->getProgram(program);
8540
8541 if (!programObject)
8542 {
8543 if (context->getShader(program))
8544 {
8545 return gl::error(GL_INVALID_OPERATION);
8546 }
8547 else
8548 {
8549 return gl::error(GL_INVALID_VALUE);
8550 }
8551 }
8552
8553 switch (pname)
8554 {
8555 case GL_UNIFORM_TYPE:
8556 case GL_UNIFORM_SIZE:
8557 case GL_UNIFORM_NAME_LENGTH:
8558 case GL_UNIFORM_BLOCK_INDEX:
8559 case GL_UNIFORM_OFFSET:
8560 case GL_UNIFORM_ARRAY_STRIDE:
8561 case GL_UNIFORM_MATRIX_STRIDE:
8562 case GL_UNIFORM_IS_ROW_MAJOR:
8563 break;
8564 default:
8565 return gl::error(GL_INVALID_ENUM);
8566 }
8567
8568 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
8569
8570 if (!programBinary && uniformCount > 0)
8571 {
8572 return gl::error(GL_INVALID_VALUE);
8573 }
8574
8575 for (int uniformId = 0; uniformId < uniformCount; uniformId++)
8576 {
8577 const GLuint index = uniformIndices[uniformId];
8578
8579 if (index >= (GLuint)programBinary->getActiveUniformCount())
8580 {
8581 return gl::error(GL_INVALID_VALUE);
8582 }
8583 }
8584
8585 for (int uniformId = 0; uniformId < uniformCount; uniformId++)
8586 {
8587 const GLuint index = uniformIndices[uniformId];
8588 params[uniformId] = programBinary->getActiveUniformi(index, pname);
8589 }
8590 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008591 }
8592 catch(std::bad_alloc&)
8593 {
8594 return gl::error(GL_OUT_OF_MEMORY);
8595 }
8596}
8597
8598GLuint __stdcall glGetUniformBlockIndex(GLuint program, const GLchar* uniformBlockName)
8599{
8600 EVENT("(GLuint program = %u, const GLchar* uniformBlockName = 0x%0.8p)", program, uniformBlockName);
8601
8602 try
8603 {
8604 gl::Context *context = gl::getNonLostContext();
8605
8606 if (context)
8607 {
8608 if (context->getClientVersion() < 3)
8609 {
shannonwoods@chromium.org42766252013-05-30 00:07:12 +00008610 return gl::error(GL_INVALID_OPERATION, GL_INVALID_INDEX);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008611 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008612
shannonwoods@chromium.org42766252013-05-30 00:07:12 +00008613 gl::Program *programObject = context->getProgram(program);
8614
8615 if (!programObject)
8616 {
8617 if (context->getShader(program))
8618 {
8619 return gl::error(GL_INVALID_OPERATION, GL_INVALID_INDEX);
8620 }
8621 else
8622 {
8623 return gl::error(GL_INVALID_VALUE, GL_INVALID_INDEX);
8624 }
8625 }
8626
8627 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
8628 if (!programBinary)
8629 {
8630 return GL_INVALID_INDEX;
8631 }
8632
8633 return programBinary->getUniformBlockIndex(uniformBlockName);
8634 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008635 }
8636 catch(std::bad_alloc&)
8637 {
8638 return gl::error(GL_OUT_OF_MEMORY, 0);
8639 }
8640
8641 return 0;
8642}
8643
8644void __stdcall glGetActiveUniformBlockiv(GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint* params)
8645{
8646 EVENT("(GLuint program = %u, GLuint uniformBlockIndex = %u, GLenum pname = 0x%X, GLint* params = 0x%0.8p)",
8647 program, uniformBlockIndex, pname, params);
8648
8649 try
8650 {
8651 gl::Context *context = gl::getNonLostContext();
8652
8653 if (context)
8654 {
8655 if (context->getClientVersion() < 3)
8656 {
8657 return gl::error(GL_INVALID_OPERATION);
8658 }
shannonwoods@chromium.orge7317ca2013-05-30 00:07:35 +00008659 gl::Program *programObject = context->getProgram(program);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008660
shannonwoods@chromium.orge7317ca2013-05-30 00:07:35 +00008661 if (!programObject)
8662 {
8663 if (context->getShader(program))
8664 {
8665 return gl::error(GL_INVALID_OPERATION);
8666 }
8667 else
8668 {
8669 return gl::error(GL_INVALID_VALUE);
8670 }
8671 }
8672
8673 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
8674
8675 if (!programBinary || uniformBlockIndex >= programBinary->getActiveUniformBlockCount())
8676 {
8677 return gl::error(GL_INVALID_VALUE);
8678 }
8679
8680 switch (pname)
8681 {
8682 case GL_UNIFORM_BLOCK_BINDING:
8683 *params = static_cast<GLint>(programObject->getUniformBlockBinding(uniformBlockIndex));
8684 break;
8685
8686 case GL_UNIFORM_BLOCK_DATA_SIZE:
8687 case GL_UNIFORM_BLOCK_NAME_LENGTH:
8688 case GL_UNIFORM_BLOCK_ACTIVE_UNIFORMS:
8689 case GL_UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES:
8690 case GL_UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER:
8691 case GL_UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER:
8692 programBinary->getActiveUniformBlockiv(uniformBlockIndex, pname, params);
8693 break;
8694
8695 default:
8696 return gl::error(GL_INVALID_ENUM);
8697 }
8698 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008699 }
8700 catch(std::bad_alloc&)
8701 {
8702 return gl::error(GL_OUT_OF_MEMORY);
8703 }
8704}
8705
8706void __stdcall glGetActiveUniformBlockName(GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei* length, GLchar* uniformBlockName)
8707{
8708 EVENT("(GLuint program = %u, GLuint uniformBlockIndex = %u, GLsizei bufSize = %d, GLsizei* length = 0x%0.8p, GLchar* uniformBlockName = 0x%0.8p)",
8709 program, uniformBlockIndex, bufSize, length, uniformBlockName);
8710
8711 try
8712 {
8713 gl::Context *context = gl::getNonLostContext();
8714
8715 if (context)
8716 {
8717 if (context->getClientVersion() < 3)
8718 {
8719 return gl::error(GL_INVALID_OPERATION);
8720 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008721
shannonwoods@chromium.orgbeb02782013-05-30 00:07:28 +00008722 gl::Program *programObject = context->getProgram(program);
8723
8724 if (!programObject)
8725 {
8726 if (context->getShader(program))
8727 {
8728 return gl::error(GL_INVALID_OPERATION);
8729 }
8730 else
8731 {
8732 return gl::error(GL_INVALID_VALUE);
8733 }
8734 }
8735
8736 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
8737
8738 if (!programBinary || uniformBlockIndex >= programBinary->getActiveUniformBlockCount())
8739 {
8740 return gl::error(GL_INVALID_VALUE);
8741 }
8742
8743 programBinary->getActiveUniformBlockName(uniformBlockIndex, bufSize, length, uniformBlockName);
8744 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008745 }
8746 catch(std::bad_alloc&)
8747 {
8748 return gl::error(GL_OUT_OF_MEMORY);
8749 }
8750}
8751
8752void __stdcall glUniformBlockBinding(GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding)
8753{
8754 EVENT("(GLuint program = %u, GLuint uniformBlockIndex = %u, GLuint uniformBlockBinding = %u)",
8755 program, uniformBlockIndex, uniformBlockBinding);
8756
8757 try
8758 {
8759 gl::Context *context = gl::getNonLostContext();
8760
8761 if (context)
8762 {
8763 if (context->getClientVersion() < 3)
8764 {
8765 return gl::error(GL_INVALID_OPERATION);
8766 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008767
shannonwoods@chromium.org70eb1ea2013-05-30 00:07:20 +00008768 if (uniformBlockBinding >= context->getMaximumCombinedUniformBufferBindings())
8769 {
8770 return gl::error(GL_INVALID_VALUE);
8771 }
8772
8773 gl::Program *programObject = context->getProgram(program);
8774
8775 if (!programObject)
8776 {
8777 if (context->getShader(program))
8778 {
8779 return gl::error(GL_INVALID_OPERATION);
8780 }
8781 else
8782 {
8783 return gl::error(GL_INVALID_VALUE);
8784 }
8785 }
8786
8787 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
8788
8789 // if never linked, there won't be any uniform blocks
8790 if (!programBinary || uniformBlockIndex >= programBinary->getActiveUniformBlockCount())
8791 {
8792 return gl::error(GL_INVALID_VALUE);
8793 }
8794
8795 programObject->bindUniformBlock(uniformBlockIndex, uniformBlockBinding);
8796 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008797 }
8798 catch(std::bad_alloc&)
8799 {
8800 return gl::error(GL_OUT_OF_MEMORY);
8801 }
8802}
8803
8804void __stdcall glDrawArraysInstanced(GLenum mode, GLint first, GLsizei count, GLsizei instanceCount)
8805{
8806 EVENT("(GLenum mode = 0x%X, GLint first = %d, GLsizei count = %d, GLsizei instanceCount = %d)",
8807 mode, first, count, instanceCount);
8808
8809 try
8810 {
8811 gl::Context *context = gl::getNonLostContext();
8812
8813 if (context)
8814 {
8815 if (context->getClientVersion() < 3)
8816 {
8817 return gl::error(GL_INVALID_OPERATION);
8818 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008819
Jamie Madill54133512013-06-21 09:33:07 -04008820 // glDrawArraysInstanced
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008821 UNIMPLEMENTED();
8822 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008823 }
8824 catch(std::bad_alloc&)
8825 {
8826 return gl::error(GL_OUT_OF_MEMORY);
8827 }
8828}
8829
8830void __stdcall glDrawElementsInstanced(GLenum mode, GLsizei count, GLenum type, const GLvoid* indices, GLsizei instanceCount)
8831{
8832 EVENT("(GLenum mode = 0x%X, GLsizei count = %d, GLenum type = 0x%X, const GLvoid* indices = 0x%0.8p, GLsizei instanceCount = %d)",
8833 mode, count, type, indices, instanceCount);
8834
8835 try
8836 {
8837 gl::Context *context = gl::getNonLostContext();
8838
8839 if (context)
8840 {
8841 if (context->getClientVersion() < 3)
8842 {
8843 return gl::error(GL_INVALID_OPERATION);
8844 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008845
Jamie Madill54133512013-06-21 09:33:07 -04008846 // glDrawElementsInstanced
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008847 UNIMPLEMENTED();
8848 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008849 }
8850 catch(std::bad_alloc&)
8851 {
8852 return gl::error(GL_OUT_OF_MEMORY);
8853 }
8854}
8855
8856GLsync __stdcall glFenceSync(GLenum condition, GLbitfield flags)
8857{
8858 EVENT("(GLenum condition = 0x%X, GLbitfield flags = 0x%X)", condition, flags);
8859
8860 try
8861 {
8862 gl::Context *context = gl::getNonLostContext();
8863
8864 if (context)
8865 {
8866 if (context->getClientVersion() < 3)
8867 {
Jamie Madill5215e1a2013-07-26 11:55:19 -04008868 return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLsync>(0));
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008869 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008870
Jamie Madill5215e1a2013-07-26 11:55:19 -04008871 if (condition != GL_SYNC_GPU_COMMANDS_COMPLETE)
8872 {
8873 return gl::error(GL_INVALID_ENUM, reinterpret_cast<GLsync>(0));
8874 }
8875
8876 if (flags != 0)
8877 {
8878 return gl::error(GL_INVALID_VALUE, reinterpret_cast<GLsync>(0));
8879 }
8880
8881 return context->createFenceSync(condition);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008882 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008883 }
8884 catch(std::bad_alloc&)
8885 {
8886 return gl::error(GL_OUT_OF_MEMORY, reinterpret_cast<GLsync>(NULL));
8887 }
8888
8889 return NULL;
8890}
8891
8892GLboolean __stdcall glIsSync(GLsync sync)
8893{
8894 EVENT("(GLsync sync = 0x%0.8p)", sync);
8895
8896 try
8897 {
8898 gl::Context *context = gl::getNonLostContext();
8899
8900 if (context)
8901 {
8902 if (context->getClientVersion() < 3)
8903 {
8904 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
8905 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008906
Jamie Madill5215e1a2013-07-26 11:55:19 -04008907 return (context->getFenceSync(sync) != NULL);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008908 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008909 }
8910 catch(std::bad_alloc&)
8911 {
8912 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
8913 }
8914
8915 return GL_FALSE;
8916}
8917
8918void __stdcall glDeleteSync(GLsync sync)
8919{
8920 EVENT("(GLsync sync = 0x%0.8p)", sync);
8921
8922 try
8923 {
8924 gl::Context *context = gl::getNonLostContext();
8925
8926 if (context)
8927 {
8928 if (context->getClientVersion() < 3)
8929 {
8930 return gl::error(GL_INVALID_OPERATION);
8931 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008932
Jamie Madill5215e1a2013-07-26 11:55:19 -04008933 if (sync != static_cast<GLsync>(0) && !context->getFenceSync(sync))
8934 {
8935 return gl::error(GL_INVALID_VALUE);
8936 }
8937
8938 context->deleteFenceSync(sync);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008939 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008940 }
8941 catch(std::bad_alloc&)
8942 {
8943 return gl::error(GL_OUT_OF_MEMORY);
8944 }
8945}
8946
8947GLenum __stdcall glClientWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout)
8948{
8949 EVENT("(GLsync sync = 0x%0.8p, GLbitfield flags = 0x%X, GLuint64 timeout = %llu)",
8950 sync, flags, timeout);
8951
8952 try
8953 {
8954 gl::Context *context = gl::getNonLostContext();
8955
8956 if (context)
8957 {
8958 if (context->getClientVersion() < 3)
8959 {
Jamie Madill5215e1a2013-07-26 11:55:19 -04008960 return gl::error(GL_INVALID_OPERATION, GL_WAIT_FAILED);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008961 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008962
Jamie Madill5215e1a2013-07-26 11:55:19 -04008963 if ((flags & ~(GL_SYNC_FLUSH_COMMANDS_BIT)) != 0)
8964 {
8965 return gl::error(GL_INVALID_VALUE, GL_WAIT_FAILED);
8966 }
8967
8968 gl::FenceSync *fenceSync = context->getFenceSync(sync);
8969
8970 if (!fenceSync)
8971 {
8972 return gl::error(GL_INVALID_VALUE, GL_WAIT_FAILED);
8973 }
8974
8975 return fenceSync->clientWait(flags, timeout);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008976 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008977 }
8978 catch(std::bad_alloc&)
8979 {
8980 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
8981 }
8982
8983 return GL_FALSE;
8984}
8985
8986void __stdcall glWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout)
8987{
8988 EVENT("(GLsync sync = 0x%0.8p, GLbitfield flags = 0x%X, GLuint64 timeout = %llu)",
8989 sync, flags, timeout);
8990
8991 try
8992 {
8993 gl::Context *context = gl::getNonLostContext();
8994
8995 if (context)
8996 {
8997 if (context->getClientVersion() < 3)
8998 {
8999 return gl::error(GL_INVALID_OPERATION);
9000 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009001
Jamie Madill5215e1a2013-07-26 11:55:19 -04009002 if (flags != 0)
9003 {
9004 return gl::error(GL_INVALID_VALUE);
9005 }
9006
9007 if (timeout != GL_TIMEOUT_IGNORED)
9008 {
9009 return gl::error(GL_INVALID_VALUE);
9010 }
9011
9012 gl::FenceSync *fenceSync = context->getFenceSync(sync);
9013
9014 if (!fenceSync)
9015 {
9016 return gl::error(GL_INVALID_VALUE);
9017 }
9018
9019 fenceSync->serverWait();
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009020 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009021 }
9022 catch(std::bad_alloc&)
9023 {
9024 return gl::error(GL_OUT_OF_MEMORY);
9025 }
9026}
9027
9028void __stdcall glGetInteger64v(GLenum pname, GLint64* params)
9029{
9030 EVENT("(GLenum pname = 0x%X, GLint64* params = 0x%0.8p)",
9031 pname, params);
9032
9033 try
9034 {
9035 gl::Context *context = gl::getNonLostContext();
9036
9037 if (context)
9038 {
9039 if (context->getClientVersion() < 3)
9040 {
9041 return gl::error(GL_INVALID_OPERATION);
9042 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009043
Jamie Madill79f2f452013-12-19 11:13:02 -05009044 GLenum nativeType;
9045 unsigned int numParams = 0;
9046 if (!context->getQueryParameterInfo(pname, &nativeType, &numParams))
9047 return gl::error(GL_INVALID_ENUM);
9048
9049 // pname is valid, but that there are no parameters to return.
9050 if (numParams == 0)
9051 return;
9052
9053 if (nativeType == GL_INT_64_ANGLEX)
Jamie Madill71fbd602013-07-19 16:36:55 -04009054 {
Jamie Madill79f2f452013-12-19 11:13:02 -05009055 context->getInteger64v(pname, params);
9056 }
Jamie Madill55856b12014-01-02 13:59:50 -05009057 else
Jamie Madill79f2f452013-12-19 11:13:02 -05009058 {
Jamie Madill55856b12014-01-02 13:59:50 -05009059 CastStateValues(context, nativeType, pname, numParams, params);
Jamie Madill71fbd602013-07-19 16:36:55 -04009060 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009061 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009062 }
9063 catch(std::bad_alloc&)
9064 {
9065 return gl::error(GL_OUT_OF_MEMORY);
9066 }
9067}
9068
9069void __stdcall glGetSynciv(GLsync sync, GLenum pname, GLsizei bufSize, GLsizei* length, GLint* values)
9070{
9071 EVENT("(GLsync sync = 0x%0.8p, GLenum pname = 0x%X, GLsizei bufSize = %d, GLsizei* length = 0x%0.8p, GLint* values = 0x%0.8p)",
9072 sync, pname, bufSize, length, values);
9073
9074 try
9075 {
9076 gl::Context *context = gl::getNonLostContext();
9077
9078 if (context)
9079 {
9080 if (context->getClientVersion() < 3)
9081 {
9082 return gl::error(GL_INVALID_OPERATION);
9083 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009084
Jamie Madill5215e1a2013-07-26 11:55:19 -04009085 if (bufSize < 0)
9086 {
9087 return gl::error(GL_INVALID_VALUE);
9088 }
9089
9090 gl::FenceSync *fenceSync = context->getFenceSync(sync);
9091
9092 if (!fenceSync)
9093 {
9094 return gl::error(GL_INVALID_VALUE);
9095 }
9096
9097 switch (pname)
9098 {
9099 case GL_OBJECT_TYPE: values[0] = static_cast<GLint>(GL_SYNC_FENCE); break;
9100 case GL_SYNC_STATUS: values[0] = static_cast<GLint>(fenceSync->getStatus()); break;
9101 case GL_SYNC_CONDITION: values[0] = static_cast<GLint>(fenceSync->getCondition()); break;
9102 case GL_SYNC_FLAGS: values[0] = 0; break;
9103
9104 default:
9105 return gl::error(GL_INVALID_ENUM);
9106 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009107 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009108 }
9109 catch(std::bad_alloc&)
9110 {
9111 return gl::error(GL_OUT_OF_MEMORY);
9112 }
9113}
9114
9115void __stdcall glGetInteger64i_v(GLenum target, GLuint index, GLint64* data)
9116{
9117 EVENT("(GLenum target = 0x%X, GLuint index = %u, GLint64* data = 0x%0.8p)",
9118 target, index, data);
9119
9120 try
9121 {
9122 gl::Context *context = gl::getNonLostContext();
9123
9124 if (context)
9125 {
9126 if (context->getClientVersion() < 3)
9127 {
9128 return gl::error(GL_INVALID_OPERATION);
9129 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009130
Shannon Woods15934d52013-08-19 14:28:49 -04009131 switch (target)
9132 {
9133 case GL_TRANSFORM_FEEDBACK_BUFFER_START:
9134 case GL_TRANSFORM_FEEDBACK_BUFFER_SIZE:
9135 case GL_TRANSFORM_FEEDBACK_BUFFER_BINDING:
9136 if (index >= context->getMaxTransformFeedbackBufferBindings())
9137 return gl::error(GL_INVALID_VALUE);
9138 break;
9139 case GL_UNIFORM_BUFFER_START:
9140 case GL_UNIFORM_BUFFER_SIZE:
9141 case GL_UNIFORM_BUFFER_BINDING:
9142 if (index >= context->getMaximumCombinedUniformBufferBindings())
9143 return gl::error(GL_INVALID_VALUE);
9144 break;
9145 default:
9146 return gl::error(GL_INVALID_ENUM);
9147 }
9148
9149 if (!(context->getIndexedInteger64v(target, index, data)))
9150 {
9151 GLenum nativeType;
9152 unsigned int numParams = 0;
9153 if (!context->getIndexedQueryParameterInfo(target, &nativeType, &numParams))
9154 return gl::error(GL_INVALID_ENUM);
9155
9156 if (numParams == 0)
9157 return; // it is known that pname is valid, but there are no parameters to return
9158
9159 if (nativeType == GL_INT)
9160 {
9161 GLint *intParams = new GLint[numParams];
9162
9163 context->getIndexedIntegerv(target, index, intParams);
9164
9165 for (unsigned int i = 0; i < numParams; ++i)
9166 {
9167 data[i] = static_cast<GLint64>(intParams[i]);
9168 }
9169
9170 delete [] intParams;
9171 }
9172 else
9173 {
9174 UNREACHABLE();
9175 }
9176 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009177 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009178 }
9179 catch(std::bad_alloc&)
9180 {
9181 return gl::error(GL_OUT_OF_MEMORY);
9182 }
9183}
9184
9185void __stdcall glGetBufferParameteri64v(GLenum target, GLenum pname, GLint64* params)
9186{
9187 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLint64* params = 0x%0.8p)",
9188 target, pname, params);
9189
9190 try
9191 {
9192 gl::Context *context = gl::getNonLostContext();
9193
9194 if (context)
9195 {
9196 if (context->getClientVersion() < 3)
9197 {
9198 return gl::error(GL_INVALID_OPERATION);
9199 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009200
Jamie Madill54133512013-06-21 09:33:07 -04009201 // glGetBufferParameteri64v
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009202 UNIMPLEMENTED();
9203 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009204 }
9205 catch(std::bad_alloc&)
9206 {
9207 return gl::error(GL_OUT_OF_MEMORY);
9208 }
9209}
9210
9211void __stdcall glGenSamplers(GLsizei count, GLuint* samplers)
9212{
9213 EVENT("(GLsizei count = %d, GLuint* samplers = 0x%0.8p)", count, samplers);
9214
9215 try
9216 {
9217 gl::Context *context = gl::getNonLostContext();
9218
9219 if (context)
9220 {
9221 if (context->getClientVersion() < 3)
9222 {
9223 return gl::error(GL_INVALID_OPERATION);
9224 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009225
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009226 if (count < 0)
9227 {
9228 return gl::error(GL_INVALID_VALUE);
9229 }
9230
9231 for (int i = 0; i < count; i++)
9232 {
9233 samplers[i] = context->createSampler();
9234 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009235 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009236 }
9237 catch(std::bad_alloc&)
9238 {
9239 return gl::error(GL_OUT_OF_MEMORY);
9240 }
9241}
9242
9243void __stdcall glDeleteSamplers(GLsizei count, const GLuint* samplers)
9244{
9245 EVENT("(GLsizei count = %d, const GLuint* samplers = 0x%0.8p)", count, samplers);
9246
9247 try
9248 {
9249 gl::Context *context = gl::getNonLostContext();
9250
9251 if (context)
9252 {
9253 if (context->getClientVersion() < 3)
9254 {
9255 return gl::error(GL_INVALID_OPERATION);
9256 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009257
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009258 if (count < 0)
9259 {
9260 return gl::error(GL_INVALID_VALUE);
9261 }
9262
9263 for (int i = 0; i < count; i++)
9264 {
9265 context->deleteSampler(samplers[i]);
9266 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009267 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009268 }
9269 catch(std::bad_alloc&)
9270 {
9271 return gl::error(GL_OUT_OF_MEMORY);
9272 }
9273}
9274
9275GLboolean __stdcall glIsSampler(GLuint sampler)
9276{
9277 EVENT("(GLuint sampler = %u)", sampler);
9278
9279 try
9280 {
9281 gl::Context *context = gl::getNonLostContext();
9282
9283 if (context)
9284 {
9285 if (context->getClientVersion() < 3)
9286 {
9287 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
9288 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009289
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009290 return context->isSampler(sampler);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009291 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009292 }
9293 catch(std::bad_alloc&)
9294 {
9295 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
9296 }
9297
9298 return GL_FALSE;
9299}
9300
9301void __stdcall glBindSampler(GLuint unit, GLuint sampler)
9302{
9303 EVENT("(GLuint unit = %u, GLuint sampler = %u)", unit, sampler);
9304
9305 try
9306 {
9307 gl::Context *context = gl::getNonLostContext();
9308
9309 if (context)
9310 {
9311 if (context->getClientVersion() < 3)
9312 {
9313 return gl::error(GL_INVALID_OPERATION);
9314 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009315
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009316 if (sampler != 0 && !context->isSampler(sampler))
9317 {
9318 return gl::error(GL_INVALID_OPERATION);
9319 }
9320
9321 if (unit >= context->getMaximumCombinedTextureImageUnits())
9322 {
9323 return gl::error(GL_INVALID_VALUE);
9324 }
9325
9326 context->bindSampler(unit, 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);
9332 }
9333}
9334
9335void __stdcall glSamplerParameteri(GLuint sampler, GLenum pname, GLint param)
9336{
9337 EVENT("(GLuint sampler = %u, GLenum pname = 0x%X, GLint param = %d)", sampler, pname, param);
9338
9339 try
9340 {
9341 gl::Context *context = gl::getNonLostContext();
9342
9343 if (context)
9344 {
9345 if (context->getClientVersion() < 3)
9346 {
9347 return gl::error(GL_INVALID_OPERATION);
9348 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009349
Geoff Lang34dbb6f2013-08-05 15:05:47 -04009350 if (!gl::ValidateSamplerObjectParameter(pname))
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009351 {
9352 return;
9353 }
9354
Geoff Lang34dbb6f2013-08-05 15:05:47 -04009355 if (!gl::ValidateTexParamParameters(context, pname, param))
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009356 {
9357 return;
9358 }
9359
9360 if (!context->isSampler(sampler))
9361 {
9362 return gl::error(GL_INVALID_OPERATION);
9363 }
9364
9365 context->samplerParameteri(sampler, pname, param);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009366 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009367 }
9368 catch(std::bad_alloc&)
9369 {
9370 return gl::error(GL_OUT_OF_MEMORY);
9371 }
9372}
9373
9374void __stdcall glSamplerParameteriv(GLuint sampler, GLenum pname, const GLint* param)
9375{
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009376 glSamplerParameteri(sampler, pname, *param);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009377}
9378
9379void __stdcall glSamplerParameterf(GLuint sampler, GLenum pname, GLfloat param)
9380{
9381 EVENT("(GLuint sampler = %u, GLenum pname = 0x%X, GLfloat param = %g)", sampler, pname, param);
9382
9383 try
9384 {
9385 gl::Context *context = gl::getNonLostContext();
9386
9387 if (context)
9388 {
9389 if (context->getClientVersion() < 3)
9390 {
9391 return gl::error(GL_INVALID_OPERATION);
9392 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009393
Geoff Lang34dbb6f2013-08-05 15:05:47 -04009394 if (!gl::ValidateSamplerObjectParameter(pname))
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009395 {
9396 return;
9397 }
9398
Geoff Lang34dbb6f2013-08-05 15:05:47 -04009399 if (!gl::ValidateTexParamParameters(context, pname, static_cast<GLint>(param)))
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009400 {
9401 return;
9402 }
9403
9404 if (!context->isSampler(sampler))
9405 {
9406 return gl::error(GL_INVALID_OPERATION);
9407 }
9408
9409 context->samplerParameterf(sampler, pname, param);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009410 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009411 }
9412 catch(std::bad_alloc&)
9413 {
9414 return gl::error(GL_OUT_OF_MEMORY);
9415 }
9416}
9417
9418void __stdcall glSamplerParameterfv(GLuint sampler, GLenum pname, const GLfloat* param)
9419{
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009420 glSamplerParameterf(sampler, pname, *param);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009421}
9422
9423void __stdcall glGetSamplerParameteriv(GLuint sampler, GLenum pname, GLint* params)
9424{
9425 EVENT("(GLuint sampler = %u, GLenum pname = 0x%X, GLint* params = 0x%0.8p)", sampler, pname, params);
9426
9427 try
9428 {
9429 gl::Context *context = gl::getNonLostContext();
9430
9431 if (context)
9432 {
9433 if (context->getClientVersion() < 3)
9434 {
9435 return gl::error(GL_INVALID_OPERATION);
9436 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009437
Geoff Lang34dbb6f2013-08-05 15:05:47 -04009438 if (!gl::ValidateSamplerObjectParameter(pname))
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009439 {
9440 return;
9441 }
9442
9443 if (!context->isSampler(sampler))
9444 {
9445 return gl::error(GL_INVALID_OPERATION);
9446 }
9447
9448 *params = context->getSamplerParameteri(sampler, pname);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009449 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009450 }
9451 catch(std::bad_alloc&)
9452 {
9453 return gl::error(GL_OUT_OF_MEMORY);
9454 }
9455}
9456
9457void __stdcall glGetSamplerParameterfv(GLuint sampler, GLenum pname, GLfloat* params)
9458{
9459 EVENT("(GLuint sample = %ur, GLenum pname = 0x%X, GLfloat* params = 0x%0.8p)", sampler, pname, params);
9460
9461 try
9462 {
9463 gl::Context *context = gl::getNonLostContext();
9464
9465 if (context)
9466 {
9467 if (context->getClientVersion() < 3)
9468 {
9469 return gl::error(GL_INVALID_OPERATION);
9470 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009471
Geoff Lang34dbb6f2013-08-05 15:05:47 -04009472 if (!gl::ValidateSamplerObjectParameter(pname))
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009473 {
9474 return;
9475 }
9476
9477 if (!context->isSampler(sampler))
9478 {
9479 return gl::error(GL_INVALID_OPERATION);
9480 }
9481
9482 *params = context->getSamplerParameterf(sampler, pname);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009483 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009484 }
9485 catch(std::bad_alloc&)
9486 {
9487 return gl::error(GL_OUT_OF_MEMORY);
9488 }
9489}
9490
9491void __stdcall glVertexAttribDivisor(GLuint index, GLuint divisor)
9492{
9493 EVENT("(GLuint index = %u, GLuint divisor = %u)", index, divisor);
9494
9495 try
9496 {
shannon.woods%transgaming.com@gtempaccount.com8736bd62013-04-13 03:35:41 +00009497 if (index >= gl::MAX_VERTEX_ATTRIBS)
9498 {
9499 return gl::error(GL_INVALID_VALUE);
9500 }
9501
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009502 gl::Context *context = gl::getNonLostContext();
9503
9504 if (context)
9505 {
9506 if (context->getClientVersion() < 3)
9507 {
9508 return gl::error(GL_INVALID_OPERATION);
9509 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009510
shannon.woods%transgaming.com@gtempaccount.com8736bd62013-04-13 03:35:41 +00009511 context->setVertexAttribDivisor(index, divisor);
9512 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009513 }
9514 catch(std::bad_alloc&)
9515 {
9516 return gl::error(GL_OUT_OF_MEMORY);
9517 }
9518}
9519
9520void __stdcall glBindTransformFeedback(GLenum target, GLuint id)
9521{
9522 EVENT("(GLenum target = 0x%X, GLuint id = %u)", target, id);
9523
9524 try
9525 {
9526 gl::Context *context = gl::getNonLostContext();
9527
9528 if (context)
9529 {
9530 if (context->getClientVersion() < 3)
9531 {
9532 return gl::error(GL_INVALID_OPERATION);
9533 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009534
Geoff Langc8058452014-02-03 12:04:11 -05009535 switch (target)
9536 {
9537 case GL_TRANSFORM_FEEDBACK:
9538 {
9539 // Cannot bind a transform feedback object if the current one is started and not paused (3.0.2 pg 85 section 2.14.1)
9540 gl::TransformFeedback *curTransformFeedback = context->getCurrentTransformFeedback();
9541 if (curTransformFeedback && curTransformFeedback->isStarted() && !curTransformFeedback->isPaused())
9542 {
9543 return gl::error(GL_INVALID_OPERATION);
9544 }
9545
9546 // Cannot bind a transform feedback object that does not exist (3.0.2 pg 85 section 2.14.1)
9547 if (context->getTransformFeedback(id) == NULL)
9548 {
9549 return gl::error(GL_INVALID_OPERATION);
9550 }
9551
9552 context->bindTransformFeedback(id);
9553 }
9554 break;
9555
9556 default:
9557 return gl::error(GL_INVALID_ENUM);
9558 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009559 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009560 }
9561 catch(std::bad_alloc&)
9562 {
9563 return gl::error(GL_OUT_OF_MEMORY);
9564 }
9565}
9566
9567void __stdcall glDeleteTransformFeedbacks(GLsizei n, const GLuint* ids)
9568{
9569 EVENT("(GLsizei n = %d, const GLuint* ids = 0x%0.8p)", n, ids);
9570
9571 try
9572 {
9573 gl::Context *context = gl::getNonLostContext();
9574
9575 if (context)
9576 {
9577 if (context->getClientVersion() < 3)
9578 {
9579 return gl::error(GL_INVALID_OPERATION);
9580 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009581
Geoff Langc8058452014-02-03 12:04:11 -05009582 for (int i = 0; i < n; i++)
9583 {
9584 context->deleteTransformFeedback(ids[i]);
9585 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009586 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009587 }
9588 catch(std::bad_alloc&)
9589 {
9590 return gl::error(GL_OUT_OF_MEMORY);
9591 }
9592}
9593
9594void __stdcall glGenTransformFeedbacks(GLsizei n, GLuint* ids)
9595{
9596 EVENT("(GLsizei n = %d, GLuint* ids = 0x%0.8p)", n, ids);
9597
9598 try
9599 {
9600 gl::Context *context = gl::getNonLostContext();
9601
9602 if (context)
9603 {
9604 if (context->getClientVersion() < 3)
9605 {
9606 return gl::error(GL_INVALID_OPERATION);
9607 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009608
Geoff Langc8058452014-02-03 12:04:11 -05009609 for (int i = 0; i < n; i++)
9610 {
9611 ids[i] = context->createTransformFeedback();
9612 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009613 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009614 }
9615 catch(std::bad_alloc&)
9616 {
9617 return gl::error(GL_OUT_OF_MEMORY);
9618 }
9619}
9620
9621GLboolean __stdcall glIsTransformFeedback(GLuint id)
9622{
9623 EVENT("(GLuint id = %u)", id);
9624
9625 try
9626 {
9627 gl::Context *context = gl::getNonLostContext();
9628
9629 if (context)
9630 {
9631 if (context->getClientVersion() < 3)
9632 {
9633 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
9634 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009635
Geoff Langc8058452014-02-03 12:04:11 -05009636 return ((context->getTransformFeedback(id) != NULL) ? GL_TRUE : GL_FALSE);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009637 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009638 }
9639 catch(std::bad_alloc&)
9640 {
9641 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
9642 }
9643
9644 return GL_FALSE;
9645}
9646
9647void __stdcall glPauseTransformFeedback(void)
9648{
9649 EVENT("(void)");
9650
9651 try
9652 {
9653 gl::Context *context = gl::getNonLostContext();
9654
9655 if (context)
9656 {
9657 if (context->getClientVersion() < 3)
9658 {
9659 return gl::error(GL_INVALID_OPERATION);
9660 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009661
Geoff Langc8058452014-02-03 12:04:11 -05009662 gl::TransformFeedback *transformFeedback = context->getCurrentTransformFeedback();
9663 ASSERT(transformFeedback != NULL);
9664
9665 // Current transform feedback must be started and not paused in order to pause (3.0.2 pg 86)
9666 if (!transformFeedback->isStarted() || transformFeedback->isPaused())
9667 {
9668 return gl::error(GL_INVALID_OPERATION);
9669 }
9670
9671 transformFeedback->pause();
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009672 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009673 }
9674 catch(std::bad_alloc&)
9675 {
9676 return gl::error(GL_OUT_OF_MEMORY);
9677 }
9678}
9679
9680void __stdcall glResumeTransformFeedback(void)
9681{
9682 EVENT("(void)");
9683
9684 try
9685 {
9686 gl::Context *context = gl::getNonLostContext();
9687
9688 if (context)
9689 {
9690 if (context->getClientVersion() < 3)
9691 {
9692 return gl::error(GL_INVALID_OPERATION);
9693 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009694
Geoff Langc8058452014-02-03 12:04:11 -05009695 gl::TransformFeedback *transformFeedback = context->getCurrentTransformFeedback();
9696 ASSERT(transformFeedback != NULL);
9697
9698 // Current transform feedback must be started and paused in order to resume (3.0.2 pg 86)
9699 if (!transformFeedback->isStarted() || !transformFeedback->isPaused())
9700 {
9701 return gl::error(GL_INVALID_OPERATION);
9702 }
9703
9704 transformFeedback->resume();
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009705 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009706 }
9707 catch(std::bad_alloc&)
9708 {
9709 return gl::error(GL_OUT_OF_MEMORY);
9710 }
9711}
9712
9713void __stdcall glGetProgramBinary(GLuint program, GLsizei bufSize, GLsizei* length, GLenum* binaryFormat, GLvoid* binary)
9714{
9715 EVENT("(GLuint program = %u, GLsizei bufSize = %d, GLsizei* length = 0x%0.8p, GLenum* binaryFormat = 0x%0.8p, GLvoid* binary = 0x%0.8p)",
9716 program, bufSize, length, binaryFormat, binary);
9717
9718 try
9719 {
9720 gl::Context *context = gl::getNonLostContext();
9721
9722 if (context)
9723 {
9724 if (context->getClientVersion() < 3)
9725 {
9726 return gl::error(GL_INVALID_OPERATION);
9727 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009728
Jamie Madill54133512013-06-21 09:33:07 -04009729 // glGetProgramBinary
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009730 UNIMPLEMENTED();
9731 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009732 }
9733 catch(std::bad_alloc&)
9734 {
9735 return gl::error(GL_OUT_OF_MEMORY);
9736 }
9737}
9738
9739void __stdcall glProgramBinary(GLuint program, GLenum binaryFormat, const GLvoid* binary, GLsizei length)
9740{
9741 EVENT("(GLuint program = %u, GLenum binaryFormat = 0x%X, const GLvoid* binary = 0x%0.8p, GLsizei length = %d)",
9742 program, binaryFormat, binary, length);
9743
9744 try
9745 {
9746 gl::Context *context = gl::getNonLostContext();
9747
9748 if (context)
9749 {
9750 if (context->getClientVersion() < 3)
9751 {
9752 return gl::error(GL_INVALID_OPERATION);
9753 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009754
Jamie Madill54133512013-06-21 09:33:07 -04009755 // glProgramBinary
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009756 UNIMPLEMENTED();
9757 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009758 }
9759 catch(std::bad_alloc&)
9760 {
9761 return gl::error(GL_OUT_OF_MEMORY);
9762 }
9763}
9764
9765void __stdcall glProgramParameteri(GLuint program, GLenum pname, GLint value)
9766{
9767 EVENT("(GLuint program = %u, GLenum pname = 0x%X, GLint value = %d)",
9768 program, pname, value);
9769
9770 try
9771 {
9772 gl::Context *context = gl::getNonLostContext();
9773
9774 if (context)
9775 {
9776 if (context->getClientVersion() < 3)
9777 {
9778 return gl::error(GL_INVALID_OPERATION);
9779 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009780
Jamie Madill54133512013-06-21 09:33:07 -04009781 // glProgramParameteri
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009782 UNIMPLEMENTED();
9783 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009784 }
9785 catch(std::bad_alloc&)
9786 {
9787 return gl::error(GL_OUT_OF_MEMORY);
9788 }
9789}
9790
9791void __stdcall glInvalidateFramebuffer(GLenum target, GLsizei numAttachments, const GLenum* attachments)
9792{
9793 EVENT("(GLenum target = 0x%X, GLsizei numAttachments = %d, const GLenum* attachments = 0x%0.8p)",
9794 target, numAttachments, attachments);
9795
9796 try
9797 {
9798 gl::Context *context = gl::getNonLostContext();
9799
9800 if (context)
9801 {
9802 if (context->getClientVersion() < 3)
9803 {
9804 return gl::error(GL_INVALID_OPERATION);
9805 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009806
Geoff Lang34dbb6f2013-08-05 15:05:47 -04009807 if (!ValidateInvalidateFramebufferParameters(context, target, numAttachments, attachments))
shannonwoods@chromium.orgd63ef892013-05-30 00:10:56 +00009808 {
9809 return;
9810 }
9811
9812 int maxDimension = context->getMaximumRenderbufferDimension();
9813 context->invalidateFrameBuffer(target, numAttachments, attachments, 0, 0, maxDimension, maxDimension);
9814 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009815 }
9816 catch(std::bad_alloc&)
9817 {
9818 return gl::error(GL_OUT_OF_MEMORY);
9819 }
9820}
9821
9822void __stdcall glInvalidateSubFramebuffer(GLenum target, GLsizei numAttachments, const GLenum* attachments, GLint x, GLint y, GLsizei width, GLsizei height)
9823{
9824 EVENT("(GLenum target = 0x%X, GLsizei numAttachments = %d, const GLenum* attachments = 0x%0.8p, GLint x = %d, "
9825 "GLint y = %d, GLsizei width = %d, GLsizei height = %d)",
9826 target, numAttachments, attachments, x, y, width, height);
9827
9828 try
9829 {
9830 gl::Context *context = gl::getNonLostContext();
9831
9832 if (context)
9833 {
9834 if (context->getClientVersion() < 3)
9835 {
9836 return gl::error(GL_INVALID_OPERATION);
9837 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009838
Geoff Lang34dbb6f2013-08-05 15:05:47 -04009839 if (!ValidateInvalidateFramebufferParameters(context, target, numAttachments, attachments))
shannonwoods@chromium.orgd63ef892013-05-30 00:10:56 +00009840 {
9841 return;
9842 }
9843
9844 context->invalidateFrameBuffer(target, numAttachments, attachments, x, y, width, height);
9845 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009846 }
9847 catch(std::bad_alloc&)
9848 {
9849 return gl::error(GL_OUT_OF_MEMORY);
9850 }
9851}
9852
9853void __stdcall glTexStorage2D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height)
9854{
9855 EVENT("(GLenum target = 0x%X, GLsizei levels = %d, GLenum internalformat = 0x%X, GLsizei width = %d, GLsizei height = %d)",
9856 target, levels, internalformat, width, height);
9857
9858 try
9859 {
9860 gl::Context *context = gl::getNonLostContext();
9861
9862 if (context)
9863 {
9864 if (context->getClientVersion() < 3)
9865 {
9866 return gl::error(GL_INVALID_OPERATION);
9867 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009868
Geoff Lang34dbb6f2013-08-05 15:05:47 -04009869 if (!ValidateES3TexStorageParameters(context, target, levels, internalformat, width, height, 1))
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00009870 {
9871 return;
9872 }
9873
9874 switch (target)
9875 {
9876 case GL_TEXTURE_2D:
9877 {
9878 gl::Texture2D *texture2d = context->getTexture2D();
9879 texture2d->storage(levels, internalformat, width, height);
9880 }
9881 break;
9882
Geoff Lang01c21d22013-09-24 11:52:16 -04009883 case GL_TEXTURE_CUBE_MAP:
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00009884 {
9885 gl::TextureCubeMap *textureCube = context->getTextureCubeMap();
9886 textureCube->storage(levels, internalformat, width);
9887 }
9888 break;
9889
9890 default:
9891 return gl::error(GL_INVALID_ENUM);
9892 }
9893 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009894 }
9895 catch(std::bad_alloc&)
9896 {
9897 return gl::error(GL_OUT_OF_MEMORY);
9898 }
9899}
9900
9901void __stdcall glTexStorage3D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth)
9902{
9903 EVENT("(GLenum target = 0x%X, GLsizei levels = %d, GLenum internalformat = 0x%X, GLsizei width = %d, "
9904 "GLsizei height = %d, GLsizei depth = %d)",
9905 target, levels, internalformat, width, height, depth);
9906
9907 try
9908 {
9909 gl::Context *context = gl::getNonLostContext();
9910
9911 if (context)
9912 {
9913 if (context->getClientVersion() < 3)
9914 {
9915 return gl::error(GL_INVALID_OPERATION);
9916 }
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00009917
Geoff Lang34dbb6f2013-08-05 15:05:47 -04009918 if (!ValidateES3TexStorageParameters(context, target, levels, internalformat, width, height, depth))
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00009919 {
9920 return;
9921 }
9922
9923 switch (target)
9924 {
9925 case GL_TEXTURE_3D:
9926 {
9927 gl::Texture3D *texture3d = context->getTexture3D();
9928 texture3d->storage(levels, internalformat, width, height, depth);
9929 }
9930 break;
9931
9932 case GL_TEXTURE_2D_ARRAY:
9933 {
9934 gl::Texture2DArray *texture2darray = context->getTexture2DArray();
9935 texture2darray->storage(levels, internalformat, width, height, depth);
9936 }
9937 break;
9938
9939 default:
Geoff Lang01c21d22013-09-24 11:52:16 -04009940 UNREACHABLE();
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00009941 }
shannon.woods%transgaming.com@gtempaccount.com14eb55e2013-04-13 03:35:06 +00009942 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009943 }
9944 catch(std::bad_alloc&)
9945 {
9946 return gl::error(GL_OUT_OF_MEMORY);
9947 }
9948}
9949
9950void __stdcall glGetInternalformativ(GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize, GLint* params)
9951{
9952 EVENT("(GLenum target = 0x%X, GLenum internalformat = 0x%X, GLenum pname = 0x%X, GLsizei bufSize = %d, "
9953 "GLint* params = 0x%0.8p)",
9954 target, internalformat, pname, bufSize, params);
9955
9956 try
9957 {
9958 gl::Context *context = gl::getNonLostContext();
9959
9960 if (context)
9961 {
9962 if (context->getClientVersion() < 3)
9963 {
9964 return gl::error(GL_INVALID_OPERATION);
9965 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009966
Shannon Woods809d2502013-07-08 10:32:18 -04009967 if (!gl::IsColorRenderingSupported(internalformat, context) &&
9968 !gl::IsDepthRenderingSupported(internalformat, context) &&
9969 !gl::IsStencilRenderingSupported(internalformat, context))
9970 {
9971 return gl::error(GL_INVALID_ENUM);
9972 }
9973
9974 if (target != GL_RENDERBUFFER)
9975 {
9976 return gl::error(GL_INVALID_ENUM);
9977 }
9978
9979 if (bufSize < 0)
9980 {
9981 return gl::error(GL_INVALID_VALUE);
9982 }
9983
9984 switch (pname)
9985 {
9986 case GL_NUM_SAMPLE_COUNTS:
9987 if (bufSize != 0)
9988 *params = context->getNumSampleCounts(internalformat);
9989 break;
9990 case GL_SAMPLES:
9991 context->getSampleCounts(internalformat, bufSize, params);
9992 break;
9993 default:
9994 return gl::error(GL_INVALID_ENUM);
9995 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009996 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009997 }
9998 catch(std::bad_alloc&)
9999 {
10000 return gl::error(GL_OUT_OF_MEMORY);
10001 }
10002}
10003
10004// Extension functions
10005
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +000010006void __stdcall glBlitFramebufferANGLE(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1,
10007 GLbitfield mask, GLenum filter)
10008{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +000010009 EVENT("(GLint srcX0 = %d, GLint srcY0 = %d, GLint srcX1 = %d, GLint srcY1 = %d, "
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +000010010 "GLint dstX0 = %d, GLint dstY0 = %d, GLint dstX1 = %d, GLint dstY1 = %d, "
10011 "GLbitfield mask = 0x%X, GLenum filter = 0x%X)",
10012 srcX0, srcY0, srcX1, srcX1, dstX0, dstY0, dstX1, dstY1, mask, filter);
10013
10014 try
10015 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +000010016 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +000010017
10018 if (context)
10019 {
Geoff Lang34dbb6f2013-08-05 15:05:47 -040010020 if (!ValidateBlitFramebufferParameters(context, srcX0, srcY0, srcX1, srcY1,
Geoff Lang758d5b22013-06-11 11:42:50 -040010021 dstX0, dstY0, dstX1, dstY1, mask, filter,
10022 true))
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +000010023 {
Geoff Lang758d5b22013-06-11 11:42:50 -040010024 return;
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +000010025 }
10026
Geoff Lang758d5b22013-06-11 11:42:50 -040010027 context->blitFramebuffer(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1,
10028 mask, filter);
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +000010029 }
10030 }
10031 catch(std::bad_alloc&)
10032 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010033 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +000010034 }
10035}
10036
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +000010037void __stdcall glTexImage3DOES(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth,
10038 GLint border, GLenum format, GLenum type, const GLvoid* pixels)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000010039{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +000010040 EVENT("(GLenum target = 0x%X, GLint level = %d, GLenum internalformat = 0x%X, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +000010041 "GLsizei width = %d, GLsizei height = %d, GLsizei depth = %d, GLint border = %d, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +000010042 "GLenum format = 0x%X, GLenum type = 0x%x, const GLvoid* pixels = 0x%0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000010043 target, level, internalformat, width, height, depth, border, format, type, pixels);
10044
10045 try
10046 {
10047 UNIMPLEMENTED(); // FIXME
10048 }
10049 catch(std::bad_alloc&)
10050 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010051 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000010052 }
10053}
daniel@transgaming.comce3d0f22010-05-04 03:35:14 +000010054
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010055void __stdcall glGetProgramBinaryOES(GLuint program, GLsizei bufSize, GLsizei *length,
10056 GLenum *binaryFormat, void *binary)
10057{
apatrick@chromium.org90080e32012-07-09 22:15:33 +000010058 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 +000010059 program, bufSize, length, binaryFormat, binary);
10060
10061 try
10062 {
10063 gl::Context *context = gl::getNonLostContext();
10064
10065 if (context)
10066 {
10067 gl::Program *programObject = context->getProgram(program);
10068
daniel@transgaming.com716056c2012-07-24 18:38:59 +000010069 if (!programObject || !programObject->isLinked())
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010070 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010071 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010072 }
10073
10074 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
10075
10076 if (!programBinary)
10077 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010078 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010079 }
10080
apatrick@chromium.org90080e32012-07-09 22:15:33 +000010081 if (!programBinary->save(binary, bufSize, length))
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010082 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010083 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010084 }
apatrick@chromium.org90080e32012-07-09 22:15:33 +000010085
10086 *binaryFormat = GL_PROGRAM_BINARY_ANGLE;
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010087 }
10088 }
10089 catch(std::bad_alloc&)
10090 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010091 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010092 }
10093}
10094
10095void __stdcall glProgramBinaryOES(GLuint program, GLenum binaryFormat,
10096 const void *binary, GLint length)
10097{
10098 EVENT("(GLenum program = 0x%X, binaryFormat = 0x%x, binary = 0x%0.8p, length = %d)",
10099 program, binaryFormat, binary, length);
10100
10101 try
10102 {
10103 gl::Context *context = gl::getNonLostContext();
10104
10105 if (context)
10106 {
10107 if (binaryFormat != GL_PROGRAM_BINARY_ANGLE)
10108 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010109 return gl::error(GL_INVALID_ENUM);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010110 }
10111
10112 gl::Program *programObject = context->getProgram(program);
10113
10114 if (!programObject)
10115 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010116 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010117 }
10118
daniel@transgaming.com95d29422012-07-24 18:36:10 +000010119 context->setProgramBinary(program, binary, length);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010120 }
10121 }
10122 catch(std::bad_alloc&)
10123 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010124 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010125 }
10126}
10127
shannon.woods%transgaming.com@gtempaccount.com4059a382013-04-13 03:31:16 +000010128void __stdcall glDrawBuffersEXT(GLsizei n, const GLenum *bufs)
10129{
10130 EVENT("(GLenum n = %d, bufs = 0x%0.8p)", n, bufs);
10131
10132 try
10133 {
10134 gl::Context *context = gl::getNonLostContext();
10135
10136 if (context)
10137 {
10138 if (n < 0 || (unsigned int)n > context->getMaximumRenderTargets())
10139 {
10140 return gl::error(GL_INVALID_VALUE);
10141 }
10142
10143 if (context->getDrawFramebufferHandle() == 0)
10144 {
shannon.woods%transgaming.com@gtempaccount.com2fa73c52013-04-13 03:37:20 +000010145 if (n != 1)
shannon.woods%transgaming.com@gtempaccount.com4059a382013-04-13 03:31:16 +000010146 {
10147 return gl::error(GL_INVALID_OPERATION);
10148 }
10149
shannon.woods%transgaming.com@gtempaccount.com2fa73c52013-04-13 03:37:20 +000010150 if (bufs[0] != GL_NONE && bufs[0] != GL_BACK)
shannon.woods%transgaming.com@gtempaccount.com4059a382013-04-13 03:31:16 +000010151 {
shannon.woods%transgaming.com@gtempaccount.com2fa73c52013-04-13 03:37:20 +000010152 return gl::error(GL_INVALID_OPERATION);
shannon.woods%transgaming.com@gtempaccount.com4059a382013-04-13 03:31:16 +000010153 }
10154 }
10155 else
10156 {
10157 for (int colorAttachment = 0; colorAttachment < n; colorAttachment++)
10158 {
10159 const GLenum attachment = GL_COLOR_ATTACHMENT0_EXT + colorAttachment;
10160 if (bufs[colorAttachment] != GL_NONE && bufs[colorAttachment] != attachment)
10161 {
10162 return gl::error(GL_INVALID_OPERATION);
10163 }
10164 }
10165 }
10166
10167 gl::Framebuffer *framebuffer = context->getDrawFramebuffer();
10168
10169 for (int colorAttachment = 0; colorAttachment < n; colorAttachment++)
10170 {
10171 framebuffer->setDrawBufferState(colorAttachment, bufs[colorAttachment]);
10172 }
shannon.woods%transgaming.com@gtempaccount.com2fa73c52013-04-13 03:37:20 +000010173
10174 for (int colorAttachment = n; colorAttachment < (int)context->getMaximumRenderTargets(); colorAttachment++)
10175 {
10176 framebuffer->setDrawBufferState(colorAttachment, GL_NONE);
10177 }
shannon.woods%transgaming.com@gtempaccount.com4059a382013-04-13 03:31:16 +000010178 }
10179 }
10180 catch (std::bad_alloc&)
10181 {
10182 return gl::error(GL_OUT_OF_MEMORY);
10183 }
10184}
10185
daniel@transgaming.comce3d0f22010-05-04 03:35:14 +000010186__eglMustCastToProperFunctionPointerType __stdcall glGetProcAddress(const char *procname)
10187{
10188 struct Extension
10189 {
10190 const char *name;
10191 __eglMustCastToProperFunctionPointerType address;
10192 };
10193
10194 static const Extension glExtensions[] =
10195 {
10196 {"glTexImage3DOES", (__eglMustCastToProperFunctionPointerType)glTexImage3DOES},
daniel@transgaming.com01868132010-08-24 19:21:17 +000010197 {"glBlitFramebufferANGLE", (__eglMustCastToProperFunctionPointerType)glBlitFramebufferANGLE},
daniel@transgaming.com1fe96c92011-01-14 15:08:44 +000010198 {"glRenderbufferStorageMultisampleANGLE", (__eglMustCastToProperFunctionPointerType)glRenderbufferStorageMultisampleANGLE},
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +000010199 {"glDeleteFencesNV", (__eglMustCastToProperFunctionPointerType)glDeleteFencesNV},
10200 {"glGenFencesNV", (__eglMustCastToProperFunctionPointerType)glGenFencesNV},
10201 {"glIsFenceNV", (__eglMustCastToProperFunctionPointerType)glIsFenceNV},
10202 {"glTestFenceNV", (__eglMustCastToProperFunctionPointerType)glTestFenceNV},
10203 {"glGetFenceivNV", (__eglMustCastToProperFunctionPointerType)glGetFenceivNV},
10204 {"glFinishFenceNV", (__eglMustCastToProperFunctionPointerType)glFinishFenceNV},
10205 {"glSetFenceNV", (__eglMustCastToProperFunctionPointerType)glSetFenceNV},
zmo@google.coma574f782011-10-03 21:45:23 +000010206 {"glGetTranslatedShaderSourceANGLE", (__eglMustCastToProperFunctionPointerType)glGetTranslatedShaderSourceANGLE},
daniel@transgaming.com0bd1f2f2011-11-11 04:19:03 +000010207 {"glTexStorage2DEXT", (__eglMustCastToProperFunctionPointerType)glTexStorage2DEXT},
daniel@transgaming.com709ed112011-11-12 03:18:10 +000010208 {"glGetGraphicsResetStatusEXT", (__eglMustCastToProperFunctionPointerType)glGetGraphicsResetStatusEXT},
10209 {"glReadnPixelsEXT", (__eglMustCastToProperFunctionPointerType)glReadnPixelsEXT},
10210 {"glGetnUniformfvEXT", (__eglMustCastToProperFunctionPointerType)glGetnUniformfvEXT},
10211 {"glGetnUniformivEXT", (__eglMustCastToProperFunctionPointerType)glGetnUniformivEXT},
daniel@transgaming.com86bdb822012-01-20 18:24:39 +000010212 {"glGenQueriesEXT", (__eglMustCastToProperFunctionPointerType)glGenQueriesEXT},
10213 {"glDeleteQueriesEXT", (__eglMustCastToProperFunctionPointerType)glDeleteQueriesEXT},
10214 {"glIsQueryEXT", (__eglMustCastToProperFunctionPointerType)glIsQueryEXT},
10215 {"glBeginQueryEXT", (__eglMustCastToProperFunctionPointerType)glBeginQueryEXT},
10216 {"glEndQueryEXT", (__eglMustCastToProperFunctionPointerType)glEndQueryEXT},
10217 {"glGetQueryivEXT", (__eglMustCastToProperFunctionPointerType)glGetQueryivEXT},
10218 {"glGetQueryObjectuivEXT", (__eglMustCastToProperFunctionPointerType)glGetQueryObjectuivEXT},
shannon.woods%transgaming.com@gtempaccount.com77d94722013-04-13 03:34:22 +000010219 {"glDrawBuffersEXT", (__eglMustCastToProperFunctionPointerType)glDrawBuffersEXT},
daniel@transgaming.comdce02fd2012-01-27 15:39:51 +000010220 {"glVertexAttribDivisorANGLE", (__eglMustCastToProperFunctionPointerType)glVertexAttribDivisorANGLE},
10221 {"glDrawArraysInstancedANGLE", (__eglMustCastToProperFunctionPointerType)glDrawArraysInstancedANGLE},
10222 {"glDrawElementsInstancedANGLE", (__eglMustCastToProperFunctionPointerType)glDrawElementsInstancedANGLE},
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010223 {"glGetProgramBinaryOES", (__eglMustCastToProperFunctionPointerType)glGetProgramBinaryOES},
10224 {"glProgramBinaryOES", (__eglMustCastToProperFunctionPointerType)glProgramBinaryOES}, };
daniel@transgaming.comce3d0f22010-05-04 03:35:14 +000010225
shannon.woods@transgaming.comd438fd42013-02-28 23:17:45 +000010226 for (unsigned int ext = 0; ext < ArraySize(glExtensions); ext++)
daniel@transgaming.comce3d0f22010-05-04 03:35:14 +000010227 {
10228 if (strcmp(procname, glExtensions[ext].name) == 0)
10229 {
10230 return (__eglMustCastToProperFunctionPointerType)glExtensions[ext].address;
10231 }
10232 }
10233
10234 return NULL;
10235}
10236
daniel@transgaming.com17f548c2011-11-09 17:47:02 +000010237// Non-public functions used by EGL
10238
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +000010239bool __stdcall glBindTexImage(egl::Surface *surface)
jbauman@chromium.orgae345802011-03-30 22:04:25 +000010240{
10241 EVENT("(egl::Surface* surface = 0x%0.8p)",
10242 surface);
10243
10244 try
10245 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +000010246 gl::Context *context = gl::getNonLostContext();
jbauman@chromium.orgae345802011-03-30 22:04:25 +000010247
10248 if (context)
10249 {
10250 gl::Texture2D *textureObject = context->getTexture2D();
Geoff Lang32d508e2014-02-11 09:39:48 -050010251 ASSERT(textureObject != NULL);
jbauman@chromium.orgae345802011-03-30 22:04:25 +000010252
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +000010253 if (textureObject->isImmutable())
10254 {
10255 return false;
10256 }
10257
Geoff Lang32d508e2014-02-11 09:39:48 -050010258 textureObject->bindTexImage(surface);
jbauman@chromium.orgae345802011-03-30 22:04:25 +000010259 }
10260 }
10261 catch(std::bad_alloc&)
10262 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010263 return gl::error(GL_OUT_OF_MEMORY, false);
jbauman@chromium.orgae345802011-03-30 22:04:25 +000010264 }
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +000010265
10266 return true;
jbauman@chromium.orgae345802011-03-30 22:04:25 +000010267}
10268
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000010269}